kink
| 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@llvm@@YAXIAEAV?$SmallVectorImpl@H@1@@Z) referenced in function "bool __cdecl getTargetShuffleMask(class llvm::SDNode *,class llvm::MVT,class llvm::SmallVectorImpl<int> &,bool &)" (?getTargetShuffleMask@@YA_NPEAVSDNode@llvm@@VMVT@2@AEAV?$SmallVectorImpl@H@2@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@llvm@@YAXIAEAV?$SmallVectorImpl@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@llvm@@YAXIAEAV?$SmallVectorImpl@H@1@@Z) referenced in function "bool __cdecl getTargetShuffleMask(class llvm::SDNode *,class llvm::MVT,class llvm::SmallVectorImpl<int> &,bool &)" (?getTargetShuffleMask@@YA_NPEAVSDNode@llvm@@VMVT@2@AEAV?$SmallVectorImpl@H@2@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@llvm@@YAXIAEAV?$SmallVectorImpl@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@llvm@@YAXVMVT@1@IAEAV?$SmallVectorImpl@H@1@@Z) referenced in function "bool __cdecl getTargetShuffleMask(class llvm::SDNode *,class llvm::MVT,class llvm::SmallVectorImpl<int> &,bool &)" (?getTargetShuffleMask@@YA_NPEAVSDNode@llvm@@VMVT@2@AEAV?$SmallVectorImpl@H@2@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@llvm@@YAXVMVT@1@IAEAV?$SmallVectorImpl@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@llvm@@YAXVMVT@1@IAEAV?$SmallVectorImpl@H@1@@Z) referenced in function "bool __cdecl getTargetShuffleMask(class llvm::SDNode *,class llvm::MVT,class llvm::SmallVectorImpl<int> &,bool &)" (?getTargetShuffleMask@@YA_NPEAVSDNode@llvm@@VMVT@2@AEAV?$SmallVectorImpl@H@2@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@llvm@@YAXVMVT@1@IAEAV?$SmallVectorImpl@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@llvm@@YAXVMVT@1@IAEAV?$SmallVectorImpl@H@1@@Z) referenced in function "bool __cdecl getTargetShuffleMask(class llvm::SDNode *,class llvm::MVT,class llvm::SmallVectorImpl<int> &,bool &)" (?getTargetShuffleMask@@YA_NPEAVSDNode@llvm@@VMVT@2@AEAV?$SmallVectorImpl@H@2@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@llvm@@YAXVMVT@1@IAEAV?$SmallVectorImpl@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@llvm@@YAXVMVT@1@IAEAV?$SmallVectorImpl@H@1@@Z) referenced in function "bool __cdecl getTargetShuffleMask(class llvm::SDNode *,class llvm::MVT,class llvm::SmallVectorImpl<int> &,bool &)" (?getTargetShuffleMask@@YA_NPEAVSDNode@llvm@@VMVT@2@AEAV?$SmallVectorImpl@H@2@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@llvm@@YAXVMVT@1@IAEAV?$SmallVectorImpl@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@llvm@@YAXVMVT@1@IAEAV?$SmallVectorImpl@H@1@@Z) referenced in function "bool __cdecl getTargetShuffleMask(class llvm::SDNode *,class llvm::MVT,class llvm::SmallVectorImpl<int> &,bool &)" (?getTargetShuffleMask@@YA_NPEAVSDNode@llvm@@VMVT@2@AEAV?$SmallVectorImpl@H@2@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@llvm@@YAXVMVT@1@IAEAV?$SmallVectorImpl@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@llvm@@YAXVMVT@1@AEAV?$SmallVectorImpl@H@1@@Z) referenced in function "bool __cdecl getTargetShuffleMask(class llvm::SDNode *,class llvm::MVT,class llvm::SmallVectorImpl<int> &,bool &)" (?getTargetShuffleMask@@YA_NPEAVSDNode@llvm@@VMVT@2@AEAV?$SmallVectorImpl@H@2@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@llvm@@YAXVMVT@1@AEAV?$SmallVectorImpl@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@llvm@@YAXVMVT@1@AEAV?$SmallVectorImpl@H@1@@Z) referenced in function "bool __cdecl getTargetShuffleMask(class llvm::SDNode *,class llvm::MVT,class llvm::SmallVectorImpl<int> &,bool &)" (?getTargetShuffleMask@@YA_NPEAVSDNode@llvm@@VMVT@2@AEAV?$SmallVectorImpl@H@2@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@llvm@@YAXVMVT@1@AEAV?$SmallVectorImpl@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@llvm@@YAXVMVT@1@IAEAV?$SmallVectorImpl@H@1@@Z) referenced in function "bool __cdecl getTargetShuffleMask(class llvm::SDNode *,class llvm::MVT,class llvm::SmallVectorImpl<int> &,bool &)" (?getTargetShuffleMask@@YA_NPEAVSDNode@llvm@@VMVT@2@AEAV?$SmallVectorImpl@H@2@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@llvm@@YAXVMVT@1@IAEAV?$SmallVectorImpl@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@llvm@@YAXIAEAV?$SmallVectorImpl@H@1@@Z) referenced in function "bool __cdecl getTargetShuffleMask(class llvm::SDNode *,class llvm::MVT,class llvm::SmallVectorImpl<int> &,bool &)" (?getTargetShuffleMask@@YA_NPEAVSDNode@llvm@@VMVT@2@AEAV?$SmallVectorImpl@H@2@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@llvm@@YAXIAEAV?$SmallVectorImpl@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@llvm@@YAXIAEAV?$SmallVectorImpl@H@1@@Z) referenced in function "void __cdecl llvm::EmitAnyX86InstComments(class llvm::MCInst const *,class llvm::raw_ostream &,char const * (__cdecl*)(unsigned int))" (?EmitAnyX86InstComments@llvm@@YAXPEBVMCInst@1@AEAVraw_ostream@1@P6APEBDI@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@llvm@@YAXIAEAV?$SmallVectorImpl@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!
|