MSVC x64: Compilation issues with current head and LLVM 3.5 final
kink via digitalmars-d-ldc
digitalmars-d-ldc at puremagic.com
Sun Sep 21 05:40:27 PDT 2014
Hi guys,
I tried compiling the latest head with LLVM 3.5 final using
VS2013 (Update 3) and failed due to linking errors when building
ldc2.
Before getting to that, I had to fix 2 minor issues - adapting
the pdata_patch.patch for LLVM and fixing an ambiguous strtold()
overload in LDC (when compiling with VS2013 only).
So here are the 2 patches and the linking errors which I'm
currently stuck at.
PATCH 1: pdata_patch.patch adapted for LLVM 3.5 final
diff --git a/include/llvm/MC/MCWin64EH.h
b/include/llvm/MC/MCWin64EH.h
index 3df0d0a..76d760a 100644
--- a/include/llvm/MC/MCWin64EH.h
+++ b/include/llvm/MC/MCWin64EH.h
@@ -71,6 +71,7 @@ struct Instruction {
int LastFrameInst;
MCWinFrameInfo *ChainedParent;
std::vector<WinEH::Instruction> Instructions;
+ int Index;
};
class MCWin64EHUnwindEmitter {
diff --git a/lib/MC/MCStreamer.cpp b/lib/MC/MCStreamer.cpp
index 46e80cc..98ae5b9 100644
--- a/lib/MC/MCStreamer.cpp
+++ b/lib/MC/MCStreamer.cpp
@@ -432,6 +432,7 @@ void MCStreamer::EmitWinCFIStartProc(const
MCSymbol *Symbol) {
MCWinFrameInfo *Frame = new MCWinFrameInfo;
Frame->Begin = getContext().CreateTempSymbol();
Frame->Function = Symbol;
+ Frame->Index = WinFrameInfos.size();
EmitLabel(Frame->Begin);
WinFrameInfos.push_back(Frame);
CurrentWinFrameInfo = WinFrameInfos.back();
@@ -451,6 +452,7 @@ void MCStreamer::EmitWinCFIStartChained() {
Frame->Begin = getContext().CreateTempSymbol();
Frame->Function = CurrentWinFrameInfo->Function;
Frame->ChainedParent = CurrentWinFrameInfo;
+ Frame->Index = WinFrameInfos.size();
EmitLabel(Frame->Begin);
WinFrameInfos.push_back(Frame);
CurrentWinFrameInfo = WinFrameInfos.back();
diff --git a/lib/MC/MCWin64EH.cpp b/lib/MC/MCWin64EH.cpp
index 95e1983..7621d52 100644
--- a/lib/MC/MCWin64EH.cpp
+++ b/lib/MC/MCWin64EH.cpp
@@ -235,24 +235,23 @@ StringRef
MCWin64EHUnwindEmitter::GetSectionSuffix(const MCSymbol *func) {
}
static const MCSection *getWin64EHTableSection(StringRef suffix,
- MCContext
&context) {
- if (suffix == "")
- return context.getObjectFileInfo()->getXDataSection();
-
+ MCContext
&context, int index) {
+ char comdat[30];
+ sprintf(comdat, "xdata%d", index);
return context.getCOFFSection((".xdata"+suffix).str(),
COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
COFF::IMAGE_SCN_MEM_READ,
- SectionKind::getDataRel());
+ SectionKind::getDataRel(),
comdat, 0);
}
static const MCSection *getWin64EHFuncTableSection(StringRef
suffix,
- MCContext
&context) {
- if (suffix == "")
- return context.getObjectFileInfo()->getPDataSection();
+ MCContext
&context, int index) {
+ char comdat[30];
+ sprintf(comdat, "pdata%d", index);
return context.getCOFFSection((".pdata"+suffix).str(),
COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
COFF::IMAGE_SCN_MEM_READ,
- SectionKind::getDataRel());
+ SectionKind::getDataRel(),
comdat, 0);
}
void MCWin64EHUnwindEmitter::EmitUnwindInfo(MCStreamer &streamer,
@@ -261,7 +260,7 @@ void
MCWin64EHUnwindEmitter::EmitUnwindInfo(MCStreamer &streamer,
// here and from Emit().
MCContext &context = streamer.getContext();
const MCSection *xdataSect =
- getWin64EHTableSection(GetSectionSuffix(info->Function),
context);
+ getWin64EHTableSection(GetSectionSuffix(info->Function),
context, info->Index);
streamer.SwitchSection(xdataSect);
llvm::EmitUnwindInfo(streamer, info);
@@ -273,7 +272,7 @@ void MCWin64EHUnwindEmitter::Emit(MCStreamer
&Streamer) {
// Emit the unwind info structs first.
for (const auto &CFI : Streamer.getWinFrameInfos()) {
const MCSection *XData =
- getWin64EHTableSection(GetSectionSuffix(CFI->Function),
Context);
+ getWin64EHTableSection(GetSectionSuffix(CFI->Function),
Context, CFI->Index);
Streamer.SwitchSection(XData);
EmitUnwindInfo(Streamer, CFI);
}
@@ -281,7 +280,7 @@ void MCWin64EHUnwindEmitter::Emit(MCStreamer
&Streamer) {
// Now emit RUNTIME_FUNCTION entries.
for (const auto &CFI : Streamer.getWinFrameInfos()) {
const MCSection *PData =
-
getWin64EHFuncTableSection(GetSectionSuffix(CFI->Function),
Context);
+
getWin64EHFuncTableSection(GetSectionSuffix(CFI->Function),
Context, CFI->Index);
Streamer.SwitchSection(PData);
EmitRuntimeFunction(Streamer, CFI);
}
--------------------
PATCH 2: strtold.patch for LDC
diff --git a/dmd2/root/longdouble.h b/dmd2/root/longdouble.h
index d5fbf94..cf6118d 100644
--- a/dmd2/root/longdouble.h
+++ b/dmd2/root/longdouble.h
@@ -198,7 +198,13 @@ longdouble tanl (longdouble ld);
longdouble fmodl(longdouble x, longdouble y);
longdouble ldexpl(longdouble ldval, int exp); // see strtold
+
+#if _MSC_VER < 1800
longdouble strtold(const char *p,char **endp);
+#else // VS2013 provides strtold(), but returns a double
+longdouble strtold_dmd(const char *p,char **endp);
+#define strtold strtold_dmd
+#endif
inline longdouble fabs (longdouble ld) { return fabsl(ld); }
inline longdouble sqrt (longdouble ld) { return sqrtl(ld); }
--------------------
I still get 12 linking errors when building the ldc2 project.
LLVMX86CodeGen.lib(X86ISelLowering.obj) : error LNK2019:
unresolved external symbol "void __cdecl
llvm::DecodeMOVHLPSMask(unsigned int,class
llvm::SmallVectorImpl<int> &)"
(?DecodeMOVHLPSMask at llvm@@YAXIAEAV?$SmallVectorImpl at H@1@@Z)
referenced in function "bool __cdecl getTargetShuffleMask(class
llvm::SDNode *,class llvm::MVT,class llvm::SmallVectorImpl<int>
&,bool &)"
(?getTargetShuffleMask@@YA_NPEAVSDNode at llvm@@VMVT at 2@AEAV?$SmallVectorImpl at H@2 at AEA_N@Z)
[C:\LDC\ldc-build\ldc2.vcxproj]
LLVMX86AsmPrinter.lib(X86InstComments.obj) : error LNK2001:
unresolved external symbol "void __cdecl
llvm::DecodeMOVHLPSMask(unsigned int,class
llvm::SmallVectorImpl<int> &)"
(?DecodeMOVHLPSMask at llvm@@YAXIAEAV?$SmallVectorImpl at H@1@@Z)
[C:\LDC\ldc-build\ldc2.vcxproj]
LLVMX86CodeGen.lib(X86ISelLowering.obj) : error LNK2019:
unresolved external symbol "void __cdecl
llvm::DecodeMOVLHPSMask(unsigned int,class
llvm::SmallVectorImpl<int> &)"
(?DecodeMOVLHPSMask at llvm@@YAXIAEAV?$SmallVectorImpl at H@1@@Z)
referenced in function "bool __cdecl getTargetShuffleMask(class
llvm::SDNode *,class llvm::MVT,class llvm::SmallVectorImpl<int>
&,bool &)"
(?getTargetShuffleMask@@YA_NPEAVSDNode at llvm@@VMVT at 2@AEAV?$SmallVectorImpl at H@2 at AEA_N@Z)
[C:\LDC\ldc-build\ldc2.vcxproj]
LLVMX86AsmPrinter.lib(X86InstComments.obj) : error LNK2001:
unresolved external symbol "void __cdecl
llvm::DecodeMOVLHPSMask(unsigned int,class
llvm::SmallVectorImpl<int> &)"
(?DecodeMOVLHPSMask at llvm@@YAXIAEAV?$SmallVectorImpl at H@1@@Z)
[C:\LDC\ldc-build\ldc2.vcxproj]
LLVMX86CodeGen.lib(X86ISelLowering.obj) : error LNK2019:
unresolved external symbol "void __cdecl
llvm::DecodePALIGNRMask(class llvm::MVT,unsigned int,class
llvm::SmallVectorImpl<int> &)"
(?DecodePALIGNRMask at llvm@@YAXVMVT at 1@IAEAV?$SmallVectorImpl at H@1@@Z)
referenced in function "bool __cdecl getTargetShuffleMask(class
llvm::SDNode *,class llvm::MVT,class llvm::SmallVectorImpl<int>
&,bool &)"
(?getTargetShuffleMask@@YA_NPEAVSDNode at llvm@@VMVT at 2@AEAV?$SmallVectorImpl at H@2 at AEA_N@Z)
[C:\LDC\ldc-build\ldc2.vcxproj]
LLVMX86AsmPrinter.lib(X86InstComments.obj) : error LNK2001:
unresolved external symbol "void __cdecl
llvm::DecodePALIGNRMask(class llvm::MVT,unsigned int,class
llvm::SmallVectorImpl<int> &)"
(?DecodePALIGNRMask at llvm@@YAXVMVT at 1@IAEAV?$SmallVectorImpl at H@1@@Z)
[C:\LDC\ldc-build\ldc2.vcxproj]
LLVMX86CodeGen.lib(X86ISelLowering.obj) : error LNK2019:
unresolved external symbol "void __cdecl
llvm::DecodePSHUFMask(class llvm::MVT,unsigned int,class
llvm::SmallVectorImpl<int> &)"
(?DecodePSHUFMask at llvm@@YAXVMVT at 1@IAEAV?$SmallVectorImpl at H@1@@Z)
referenced in function "bool __cdecl getTargetShuffleMask(class
llvm::SDNode *,class llvm::MVT,class llvm::SmallVectorImpl<int>
&,bool &)"
(?getTargetShuffleMask@@YA_NPEAVSDNode at llvm@@VMVT at 2@AEAV?$SmallVectorImpl at H@2 at AEA_N@Z)
[C:\LDC\ldc-build\ldc2.vcxproj]
LLVMX86AsmPrinter.lib(X86InstComments.obj) : error LNK2001:
unresolved external symbol "void __cdecl
llvm::DecodePSHUFMask(class llvm::MVT,unsigned int,class
llvm::SmallVectorImpl<int> &)"
(?DecodePSHUFMask at llvm@@YAXVMVT at 1@IAEAV?$SmallVectorImpl at H@1@@Z)
[C:\LDC\ldc-build\ldc2.vcxproj]
LLVMX86CodeGen.lib(X86ISelLowering.obj) : error LNK2019:
unresolved external symbol "void __cdecl
llvm::DecodePSHUFHWMask(class llvm::MVT,unsigned int,class
llvm::SmallVectorImpl<int> &)"
(?DecodePSHUFHWMask at llvm@@YAXVMVT at 1@IAEAV?$SmallVectorImpl at H@1@@Z)
referenced in function "bool __cdecl getTargetShuffleMask(class
llvm::SDNode *,class llvm::MVT,class llvm::SmallVectorImpl<int>
&,bool &)"
(?getTargetShuffleMask@@YA_NPEAVSDNode at llvm@@VMVT at 2@AEAV?$SmallVectorImpl at H@2 at AEA_N@Z)
[C:\LDC\ldc-build\ldc2.vcxproj]
LLVMX86AsmPrinter.lib(X86InstComments.obj) : error LNK2001:
unresolved external symbol "void __cdecl
llvm::DecodePSHUFHWMask(class llvm::MVT,unsigned int,class
llvm::SmallVectorImpl<int> &)"
(?DecodePSHUFHWMask at llvm@@YAXVMVT at 1@IAEAV?$SmallVectorImpl at H@1@@Z)
[C:\LDC\ldc-build\ldc2.vcxproj]
LLVMX86CodeGen.lib(X86ISelLowering.obj) : error LNK2019:
unresolved external symbol "void __cdecl
llvm::DecodePSHUFLWMask(class llvm::MVT,unsigned int,class
llvm::SmallVectorImpl<int> &)"
(?DecodePSHUFLWMask at llvm@@YAXVMVT at 1@IAEAV?$SmallVectorImpl at H@1@@Z)
referenced in function "bool __cdecl getTargetShuffleMask(class
llvm::SDNode *,class llvm::MVT,class llvm::SmallVectorImpl<int>
&,bool &)"
(?getTargetShuffleMask@@YA_NPEAVSDNode at llvm@@VMVT at 2@AEAV?$SmallVectorImpl at H@2 at AEA_N@Z)
[C:\LDC\ldc-build\ldc2.vcxproj]
LLVMX86AsmPrinter.lib(X86InstComments.obj) : error LNK2001:
unresolved external symbol "void __cdecl
llvm::DecodePSHUFLWMask(class llvm::MVT,unsigned int,class
llvm::SmallVectorImpl<int> &)"
(?DecodePSHUFLWMask at llvm@@YAXVMVT at 1@IAEAV?$SmallVectorImpl at H@1@@Z)
[C:\LDC\ldc-build\ldc2.vcxproj]
LLVMX86CodeGen.lib(X86ISelLowering.obj) : error LNK2019:
unresolved external symbol "void __cdecl
llvm::DecodeSHUFPMask(class llvm::MVT,unsigned int,class
llvm::SmallVectorImpl<int> &)"
(?DecodeSHUFPMask at llvm@@YAXVMVT at 1@IAEAV?$SmallVectorImpl at H@1@@Z)
referenced in function "bool __cdecl getTargetShuffleMask(class
llvm::SDNode *,class llvm::MVT,class llvm::SmallVectorImpl<int>
&,bool &)"
(?getTargetShuffleMask@@YA_NPEAVSDNode at llvm@@VMVT at 2@AEAV?$SmallVectorImpl at H@2 at AEA_N@Z)
[C:\LDC\ldc-build\ldc2.vcxproj]
LLVMX86AsmPrinter.lib(X86InstComments.obj) : error LNK2001:
unresolved external symbol "void __cdecl
llvm::DecodeSHUFPMask(class llvm::MVT,unsigned int,class
llvm::SmallVectorImpl<int> &)"
(?DecodeSHUFPMask at llvm@@YAXVMVT at 1@IAEAV?$SmallVectorImpl at H@1@@Z)
[C:\LDC\ldc-build\ldc2.vcxproj]
LLVMX86CodeGen.lib(X86ISelLowering.obj) : error LNK2019:
unresolved external symbol "void __cdecl
llvm::DecodeUNPCKHMask(class llvm::MVT,class
llvm::SmallVectorImpl<int> &)"
(?DecodeUNPCKHMask at llvm@@YAXVMVT at 1@AEAV?$SmallVectorImpl at H@1@@Z)
referenced in function "bool __cdecl getTargetShuffleMask(class
llvm::SDNode *,class llvm::MVT,class llvm::SmallVectorImpl<int>
&,bool &)"
(?getTargetShuffleMask@@YA_NPEAVSDNode at llvm@@VMVT at 2@AEAV?$SmallVectorImpl at H@2 at AEA_N@Z)
[C:\LDC\ldc-build\ldc2.vcxproj]
LLVMX86AsmPrinter.lib(X86InstComments.obj) : error LNK2001:
unresolved external symbol "void __cdecl
llvm::DecodeUNPCKHMask(class llvm::MVT,class
llvm::SmallVectorImpl<int> &)"
(?DecodeUNPCKHMask at llvm@@YAXVMVT at 1@AEAV?$SmallVectorImpl at H@1@@Z)
[C:\LDC\ldc-build\ldc2.vcxproj]
LLVMX86CodeGen.lib(X86ISelLowering.obj) : error LNK2019:
unresolved external symbol "void __cdecl
llvm::DecodeUNPCKLMask(class llvm::MVT,class
llvm::SmallVectorImpl<int> &)"
(?DecodeUNPCKLMask at llvm@@YAXVMVT at 1@AEAV?$SmallVectorImpl at H@1@@Z)
referenced in function "bool __cdecl getTargetShuffleMask(class
llvm::SDNode *,class llvm::MVT,class llvm::SmallVectorImpl<int>
&,bool &)"
(?getTargetShuffleMask@@YA_NPEAVSDNode at llvm@@VMVT at 2@AEAV?$SmallVectorImpl at H@2 at AEA_N@Z)
[C:\LDC\ldc-build\ldc2.vcxproj]
LLVMX86AsmPrinter.lib(X86InstComments.obj) : error LNK2001:
unresolved external symbol "void __cdecl
llvm::DecodeUNPCKLMask(class llvm::MVT,class
llvm::SmallVectorImpl<int> &)"
(?DecodeUNPCKLMask at llvm@@YAXVMVT at 1@AEAV?$SmallVectorImpl at H@1@@Z)
[C:\LDC\ldc-build\ldc2.vcxproj]
LLVMX86CodeGen.lib(X86ISelLowering.obj) : error LNK2019:
unresolved external symbol "void __cdecl
llvm::DecodeVPERM2X128Mask(class llvm::MVT,unsigned int,class
llvm::SmallVectorImpl<int> &)"
(?DecodeVPERM2X128Mask at llvm@@YAXVMVT at 1@IAEAV?$SmallVectorImpl at H@1@@Z)
referenced in function "bool __cdecl getTargetShuffleMask(class
llvm::SDNode *,class llvm::MVT,class llvm::SmallVectorImpl<int>
&,bool &)"
(?getTargetShuffleMask@@YA_NPEAVSDNode at llvm@@VMVT at 2@AEAV?$SmallVectorImpl at H@2 at AEA_N@Z)
[C:\LDC\ldc-build\ldc2.vcxproj]
LLVMX86AsmPrinter.lib(X86InstComments.obj) : error LNK2001:
unresolved external symbol "void __cdecl
llvm::DecodeVPERM2X128Mask(class llvm::MVT,unsigned int,class
llvm::SmallVectorImpl<int> &)"
(?DecodeVPERM2X128Mask at llvm@@YAXVMVT at 1@IAEAV?$SmallVectorImpl at H@1@@Z)
[C:\LDC\ldc-build\ldc2.vcxproj]
LLVMX86CodeGen.lib(X86ISelLowering.obj) : error LNK2019:
unresolved external symbol "void __cdecl
llvm::DecodeVPERMMask(unsigned int,class
llvm::SmallVectorImpl<int> &)"
(?DecodeVPERMMask at llvm@@YAXIAEAV?$SmallVectorImpl at H@1@@Z)
referenced in function "bool __cdecl getTargetShuffleMask(class
llvm::SDNode *,class llvm::MVT,class llvm::SmallVectorImpl<int>
&,bool &)"
(?getTargetShuffleMask@@YA_NPEAVSDNode at llvm@@VMVT at 2@AEAV?$SmallVectorImpl at H@2 at AEA_N@Z)
[C:\LDC\ldc-build\ldc2.vcxproj]
LLVMX86AsmPrinter.lib(X86InstComments.obj) : error LNK2001:
unresolved external symbol "void __cdecl
llvm::DecodeVPERMMask(unsigned int,class
llvm::SmallVectorImpl<int> &)"
(?DecodeVPERMMask at llvm@@YAXIAEAV?$SmallVectorImpl at H@1@@Z)
[C:\LDC\ldc-build\ldc2.vcxproj]
LLVMX86AsmPrinter.lib(X86InstComments.obj) : error LNK2019:
unresolved external symbol "void __cdecl
llvm::DecodeINSERTPSMask(unsigned int,class
llvm::SmallVectorImpl<int> &)"
(?DecodeINSERTPSMask at llvm@@YAXIAEAV?$SmallVectorImpl at H@1@@Z)
referenced in function "void __cdecl
llvm::EmitAnyX86InstComments(class llvm::MCInst const *,class
llvm::raw_ostream &,char const * (__cdecl*)(unsigned int))"
(?EmitAnyX86InstComments at llvm@@YAXPEBVMCInst at 1@AEAVraw_ostream at 1@P6APEBDI at Z@Z)
[C:\LDC\ldc-build\ldc2.vcxproj]
C:\LDC\ldc-build\bin\Debug\ldc2.exe : fatal error LNK1120: 12
unresolved externals [C:\LDC\ldc-build\ldc2.vcxproj]
The functions seem to belong to LLVMX86Utils.lib, which isn't
linked explicitly to ldc2. I tried adding the lib manually in the
VS project and building it in VS (so that CMake doesn't
interfere), but I still get the same errors. I looked up the
first function (DecodeMOVHLPSMask) in LLVMX86Utils.lib using
dumpbin, which gave me:
216 00000150 SECT4 notype () External |
?DecodeMOVHLPSMask at llvm@@YAXIAEAV?$SmallVectorImpl at H@1@@Z (void
__cdecl llvm::DecodeMOVHLPSMask(unsigned int,class
llvm::SmallVectorImpl<int> &))
I don't know what to make of this. At least you know about it
now. :)
Thanks and keep up the good work!
More information about the digitalmars-d-ldc
mailing list