diff --git a/llvm/include/llvm/ExecutionEngine/Orc/JITTargetMachineBuilder.h b/llvm/include/llvm/ExecutionEngine/Orc/JITTargetMachineBuilder.h index c8c4ecdaff160f..4f2f5577099699 100644 --- a/llvm/include/llvm/ExecutionEngine/Orc/JITTargetMachineBuilder.h +++ b/llvm/include/llvm/ExecutionEngine/Orc/JITTargetMachineBuilder.h @@ -79,12 +79,18 @@ class JITTargetMachineBuilder { return *this; } + /// Get the relocation model. + const Optional &getRelocationModel() const { return RM; } + /// Set the code model. JITTargetMachineBuilder &setCodeModel(Optional CM) { this->CM = std::move(CM); return *this; } + /// Get the code model. + const Optional &getCodeModel() const { return CM; } + /// Set the LLVM CodeGen optimization level. JITTargetMachineBuilder &setCodeGenOptLevel(CodeGenOpt::Level OptLevel) { this->OptLevel = OptLevel; diff --git a/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp b/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp index 5c393739f401c6..54473ab46423cf 100644 --- a/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp +++ b/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp @@ -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_);