[Orc][LLJIT] Use JITLink even if a custom JITTargetMachineBuilder is supplied.
authorLang Hames <lhames@gmail.com>
Mon, 16 Dec 2019 10:45:51 +0000 (02:45 -0800)
committerLang Hames <lhames@gmail.com>
Wed, 18 Dec 2019 22:17:25 +0000 (14:17 -0800)
LLJITBuilder will now use JITLink on supported platforms even if a custom
JITTargetMachineBuilder is supplied, provided that neither the code model,
nor the relocation model, nor the ObjectLinkingLayerCreator is set.

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

index c8c4ecd..4f2f557 100644 (file)
@@ -79,12 +79,18 @@ public:
     return *this;
   }
 
+  /// Get the relocation model.
+  const Optional<Reloc::Model> &getRelocationModel() const { return RM; }
+
   /// Set the code model.
   JITTargetMachineBuilder &setCodeModel(Optional<CodeModel::Model> CM) {
     this->CM = std::move(CM);
     return *this;
   }
 
+  /// Get the code model.
+  const Optional<CodeModel::Model> &getCodeModel() const { return CM; }
+
   /// Set the LLVM CodeGen optimization level.
   JITTargetMachineBuilder &setCodeGenOptLevel(CodeGenOpt::Level OptLevel) {
     this->OptLevel = OptLevel;
index 5c39373..54473ab 100644 (file)
@@ -24,11 +24,15 @@ Error LLJITBuilderState::prepareForConstruction() {
       JTMB = std::move(*JTMBOrErr);
     else
       return JTMBOrErr.takeError();
+  }
+
+  // If the client didn't configure any linker options then auto-configure the
+  // JIT linker.
+  if (!CreateObjectLinkingLayer && JTMB->getCodeModel() == None &&
+      JTMB->getRelocationModel() == None) {
 
-    // If no ObjectLinkingLayer creator was set and the target supports JITLink
-    // then configure for JITLink.
     auto &TT = JTMB->getTargetTriple();
-    if (!CreateObjectLinkingLayer && TT.isOSBinFormatMachO() &&
+    if (TT.isOSBinFormatMachO() &&
         (TT.getArch() == Triple::aarch64 || TT.getArch() == Triple::x86_64)) {
 
       JTMB->setRelocationModel(Reloc::PIC_);