diff options
Diffstat (limited to 'llvm/lib/ExecutionEngine/Orc/LLJIT.cpp')
| -rw-r--r-- | llvm/lib/ExecutionEngine/Orc/LLJIT.cpp | 36 | 
1 files changed, 30 insertions, 6 deletions
| diff --git a/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp b/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp index a80f78afe80f..54473ab46423 100644 --- a/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp +++ b/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp @@ -7,6 +7,8 @@  //===----------------------------------------------------------------------===//  #include "llvm/ExecutionEngine/Orc/LLJIT.h" +#include "llvm/ExecutionEngine/JITLink/JITLinkMemoryManager.h" +#include "llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h"  #include "llvm/ExecutionEngine/Orc/OrcError.h"  #include "llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h"  #include "llvm/ExecutionEngine/SectionMemoryManager.h" @@ -24,6 +26,26 @@ Error LLJITBuilderState::prepareForConstruction() {        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) { + +    auto &TT = JTMB->getTargetTriple(); +    if (TT.isOSBinFormatMachO() && +        (TT.getArch() == Triple::aarch64 || TT.getArch() == Triple::x86_64)) { + +      JTMB->setRelocationModel(Reloc::PIC_); +      JTMB->setCodeModel(CodeModel::Small); +      CreateObjectLinkingLayer = +          [](ExecutionSession &ES, +             const Triple &) -> std::unique_ptr<ObjectLayer> { +        return std::make_unique<ObjectLinkingLayer>( +            ES, std::make_unique<jitlink::InProcessMemoryManager>()); +      }; +    } +  } +    return Error::success();  } @@ -51,12 +73,14 @@ Error LLJIT::addIRModule(JITDylib &JD, ThreadSafeModule TSM) {  Error LLJIT::addObjectFile(JITDylib &JD, std::unique_ptr<MemoryBuffer> Obj) {    assert(Obj && "Can not add null object"); -  return ObjLinkingLayer->add(JD, std::move(Obj), ES->allocateVModule()); +  return ObjTransformLayer.add(JD, std::move(Obj), ES->allocateVModule());  }  Expected<JITEvaluatedSymbol> LLJIT::lookupLinkerMangled(JITDylib &JD,                                                          StringRef Name) { -  return ES->lookup(JITDylibSearchList({{&JD, true}}), ES->intern(Name)); +  return ES->lookup( +      makeJITDylibSearchOrder(&JD, JITDylibLookupFlags::MatchAllSymbols), +      ES->intern(Name));  }  std::unique_ptr<ObjectLayer> @@ -103,13 +127,13 @@ LLJIT::createCompileFunction(LLJITBuilderState &S,  LLJIT::LLJIT(LLJITBuilderState &S, Error &Err)      : ES(S.ES ? std::move(S.ES) : std::make_unique<ExecutionSession>()), -      Main(this->ES->getMainJITDylib()), DL(""), CtorRunner(Main), +      Main(this->ES->createJITDylib("<main>")), DL(""), +      ObjLinkingLayer(createObjectLinkingLayer(S, *ES)), +      ObjTransformLayer(*this->ES, *ObjLinkingLayer), CtorRunner(Main),        DtorRunner(Main) {    ErrorAsOutParameter _(&Err); -  ObjLinkingLayer = createObjectLinkingLayer(S, *ES); -    if (auto DLOrErr = S.JTMB->getDefaultDataLayoutForTarget())      DL = std::move(*DLOrErr);    else { @@ -124,7 +148,7 @@ LLJIT::LLJIT(LLJITBuilderState &S, Error &Err)        return;      }      CompileLayer = std::make_unique<IRCompileLayer>( -        *ES, *ObjLinkingLayer, std::move(*CompileFunction)); +        *ES, ObjTransformLayer, std::move(*CompileFunction));    }    if (S.NumCompileThreads > 0) { | 
