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