]> granicus.if.org Git - llvm/commitdiff
[ORC] Turn on symbol-flags overrides for LLJIT on Windows by default.
authorLang Hames <lhames@gmail.com>
Fri, 2 Aug 2019 19:43:20 +0000 (19:43 +0000)
committerLang Hames <lhames@gmail.com>
Fri, 2 Aug 2019 19:43:20 +0000 (19:43 +0000)
libObject does not apply the Exported flag to symbols in COFF object files,
which can lead to assertions when the symbol flags initially derived from
IR added to the JIT clash with the flags seen by the JIT linker. Both
RTDyldObjectLinkingLayer and ObjectLinkingLayer have a workaround for this:
they can be told to override the flags seen by the linker with the flags
attached to the materialization responsibility object that was passed down
to the linker. This patch modifies LLJIT's setup code to enable this override
by default on platforms where COFF is the default object format.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@367712 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/ExecutionEngine/Orc/LLJIT.h
lib/ExecutionEngine/Orc/LLJIT.cpp

index 0aac1916423f9ac6bfac080358bf52b182f32e37..b1e47d77557c5117455b4518e5fd6f642e7f1af0 100644 (file)
@@ -184,8 +184,8 @@ private:
 
 class LLJITBuilderState {
 public:
-  using ObjectLinkingLayerCreator =
-      std::function<std::unique_ptr<ObjectLayer>(ExecutionSession &)>;
+  using ObjectLinkingLayerCreator = std::function<std::unique_ptr<ObjectLayer>(
+      ExecutionSession &, const Triple &TT)>;
 
   using CompileFunctionCreator =
       std::function<Expected<IRCompileLayer::CompileFunction>(
index 9432363239157897a737a12e2b163cc7431a5226..14b3b6ac7f69ba9d000b794c1a1d51c739263ccb 100644 (file)
@@ -64,12 +64,18 @@ LLJIT::createObjectLinkingLayer(LLJITBuilderState &S, ExecutionSession &ES) {
 
   // If the config state provided an ObjectLinkingLayer factory then use it.
   if (S.CreateObjectLinkingLayer)
-    return S.CreateObjectLinkingLayer(ES);
+    return S.CreateObjectLinkingLayer(ES, S.JTMB->getTargetTriple());
 
   // Otherwise default to creating an RTDyldObjectLinkingLayer that constructs
   // a new SectionMemoryManager for each object.
   auto GetMemMgr = []() { return llvm::make_unique<SectionMemoryManager>(); };
-  return llvm::make_unique<RTDyldObjectLinkingLayer>(ES, std::move(GetMemMgr));
+  auto ObjLinkingLayer =
+      llvm::make_unique<RTDyldObjectLinkingLayer>(ES, std::move(GetMemMgr));
+
+  if (S.JTMB->getTargetTriple().isOSBinFormatCOFF())
+    ObjLinkingLayer->setOverrideObjectFlagsWithResponsibilityFlags(true);
+
+  return ObjLinkingLayer;
 }
 
 Expected<IRCompileLayer::CompileFunction>