Path: blob/main/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp
35266 views
//===--------- LLJIT.cpp - An ORC-based JIT for compiling LLVM IR ---------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include "llvm/ExecutionEngine/Orc/LLJIT.h"9#include "llvm/ExecutionEngine/JITLink/EHFrameSupport.h"10#include "llvm/ExecutionEngine/JITLink/JITLinkMemoryManager.h"11#include "llvm/ExecutionEngine/Orc/COFFPlatform.h"12#include "llvm/ExecutionEngine/Orc/ELFNixPlatform.h"13#include "llvm/ExecutionEngine/Orc/EPCDynamicLibrarySearchGenerator.h"14#include "llvm/ExecutionEngine/Orc/EPCEHFrameRegistrar.h"15#include "llvm/ExecutionEngine/Orc/ExecutorProcessControl.h"16#include "llvm/ExecutionEngine/Orc/MachOPlatform.h"17#include "llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h"18#include "llvm/ExecutionEngine/Orc/ObjectTransformLayer.h"19#include "llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h"20#include "llvm/ExecutionEngine/Orc/Shared/OrcError.h"21#include "llvm/ExecutionEngine/Orc/TargetProcess/RegisterEHFrames.h"22#include "llvm/ExecutionEngine/SectionMemoryManager.h"23#include "llvm/IR/GlobalVariable.h"24#include "llvm/IR/IRBuilder.h"25#include "llvm/IR/Mangler.h"26#include "llvm/IR/Module.h"27#include "llvm/Support/DynamicLibrary.h"2829#define DEBUG_TYPE "orc"3031using namespace llvm;32using namespace llvm::orc;3334namespace {3536/// Adds helper function decls and wrapper functions that call the helper with37/// some additional prefix arguments.38///39/// E.g. For wrapper "foo" with type i8(i8, i64), helper "bar", and prefix40/// args i32 4 and i16 12345, this function will add:41///42/// declare i8 @bar(i32, i16, i8, i64)43///44/// define i8 @foo(i8, i64) {45/// entry:46/// %2 = call i8 @bar(i32 4, i16 12345, i8 %0, i64 %1)47/// ret i8 %248/// }49///50Function *addHelperAndWrapper(Module &M, StringRef WrapperName,51FunctionType *WrapperFnType,52GlobalValue::VisibilityTypes WrapperVisibility,53StringRef HelperName,54ArrayRef<Value *> HelperPrefixArgs) {55std::vector<Type *> HelperArgTypes;56for (auto *Arg : HelperPrefixArgs)57HelperArgTypes.push_back(Arg->getType());58for (auto *T : WrapperFnType->params())59HelperArgTypes.push_back(T);60auto *HelperFnType =61FunctionType::get(WrapperFnType->getReturnType(), HelperArgTypes, false);62auto *HelperFn = Function::Create(HelperFnType, GlobalValue::ExternalLinkage,63HelperName, M);6465auto *WrapperFn = Function::Create(66WrapperFnType, GlobalValue::ExternalLinkage, WrapperName, M);67WrapperFn->setVisibility(WrapperVisibility);6869auto *EntryBlock = BasicBlock::Create(M.getContext(), "entry", WrapperFn);70IRBuilder<> IB(EntryBlock);7172std::vector<Value *> HelperArgs;73for (auto *Arg : HelperPrefixArgs)74HelperArgs.push_back(Arg);75for (auto &Arg : WrapperFn->args())76HelperArgs.push_back(&Arg);77auto *HelperResult = IB.CreateCall(HelperFn, HelperArgs);78if (HelperFn->getReturnType()->isVoidTy())79IB.CreateRetVoid();80else81IB.CreateRet(HelperResult);8283return WrapperFn;84}8586class GenericLLVMIRPlatformSupport;8788/// orc::Platform component of Generic LLVM IR Platform support.89/// Just forwards calls to the GenericLLVMIRPlatformSupport class below.90class GenericLLVMIRPlatform : public Platform {91public:92GenericLLVMIRPlatform(GenericLLVMIRPlatformSupport &S) : S(S) {}93Error setupJITDylib(JITDylib &JD) override;94Error teardownJITDylib(JITDylib &JD) override;95Error notifyAdding(ResourceTracker &RT,96const MaterializationUnit &MU) override;97Error notifyRemoving(ResourceTracker &RT) override {98// Noop -- Nothing to do (yet).99return Error::success();100}101102private:103GenericLLVMIRPlatformSupport &S;104};105106/// This transform parses llvm.global_ctors to produce a single initialization107/// function for the module, records the function, then deletes108/// llvm.global_ctors.109class GlobalCtorDtorScraper {110public:111GlobalCtorDtorScraper(GenericLLVMIRPlatformSupport &PS,112StringRef InitFunctionPrefix,113StringRef DeInitFunctionPrefix)114: PS(PS), InitFunctionPrefix(InitFunctionPrefix),115DeInitFunctionPrefix(DeInitFunctionPrefix) {}116Expected<ThreadSafeModule> operator()(ThreadSafeModule TSM,117MaterializationResponsibility &R);118119private:120GenericLLVMIRPlatformSupport &PS;121StringRef InitFunctionPrefix;122StringRef DeInitFunctionPrefix;123};124125/// Generic IR Platform Support126///127/// Scrapes llvm.global_ctors and llvm.global_dtors and replaces them with128/// specially named 'init' and 'deinit'. Injects definitions / interposes for129/// some runtime API, including __cxa_atexit, dlopen, and dlclose.130class GenericLLVMIRPlatformSupport : public LLJIT::PlatformSupport {131public:132GenericLLVMIRPlatformSupport(LLJIT &J, JITDylib &PlatformJD)133: J(J), InitFunctionPrefix(J.mangle("__orc_init_func.")),134DeInitFunctionPrefix(J.mangle("__orc_deinit_func.")) {135136getExecutionSession().setPlatform(137std::make_unique<GenericLLVMIRPlatform>(*this));138139setInitTransform(J, GlobalCtorDtorScraper(*this, InitFunctionPrefix,140DeInitFunctionPrefix));141142SymbolMap StdInterposes;143144StdInterposes[J.mangleAndIntern("__lljit.platform_support_instance")] = {145ExecutorAddr::fromPtr(this), JITSymbolFlags::Exported};146StdInterposes[J.mangleAndIntern("__lljit.cxa_atexit_helper")] = {147ExecutorAddr::fromPtr(registerCxaAtExitHelper), JITSymbolFlags()};148149cantFail(PlatformJD.define(absoluteSymbols(std::move(StdInterposes))));150cantFail(setupJITDylib(PlatformJD));151cantFail(J.addIRModule(PlatformJD, createPlatformRuntimeModule()));152}153154ExecutionSession &getExecutionSession() { return J.getExecutionSession(); }155156/// Adds a module that defines the __dso_handle global.157Error setupJITDylib(JITDylib &JD) {158159// Add per-jitdylib standard interposes.160SymbolMap PerJDInterposes;161PerJDInterposes[J.mangleAndIntern("__lljit.run_atexits_helper")] = {162ExecutorAddr::fromPtr(runAtExitsHelper), JITSymbolFlags()};163PerJDInterposes[J.mangleAndIntern("__lljit.atexit_helper")] = {164ExecutorAddr::fromPtr(registerAtExitHelper), JITSymbolFlags()};165cantFail(JD.define(absoluteSymbols(std::move(PerJDInterposes))));166167auto Ctx = std::make_unique<LLVMContext>();168auto M = std::make_unique<Module>("__standard_lib", *Ctx);169M->setDataLayout(J.getDataLayout());170171auto *Int64Ty = Type::getInt64Ty(*Ctx);172auto *DSOHandle = new GlobalVariable(173*M, Int64Ty, true, GlobalValue::ExternalLinkage,174ConstantInt::get(Int64Ty, reinterpret_cast<uintptr_t>(&JD)),175"__dso_handle");176DSOHandle->setVisibility(GlobalValue::DefaultVisibility);177DSOHandle->setInitializer(178ConstantInt::get(Int64Ty, ExecutorAddr::fromPtr(&JD).getValue()));179180auto *GenericIRPlatformSupportTy =181StructType::create(*Ctx, "lljit.GenericLLJITIRPlatformSupport");182183auto *PlatformInstanceDecl = new GlobalVariable(184*M, GenericIRPlatformSupportTy, true, GlobalValue::ExternalLinkage,185nullptr, "__lljit.platform_support_instance");186187auto *VoidTy = Type::getVoidTy(*Ctx);188addHelperAndWrapper(189*M, "__lljit_run_atexits", FunctionType::get(VoidTy, {}, false),190GlobalValue::HiddenVisibility, "__lljit.run_atexits_helper",191{PlatformInstanceDecl, DSOHandle});192193auto *IntTy = Type::getIntNTy(*Ctx, sizeof(int) * CHAR_BIT);194auto *AtExitCallbackTy = FunctionType::get(VoidTy, {}, false);195auto *AtExitCallbackPtrTy = PointerType::getUnqual(AtExitCallbackTy);196addHelperAndWrapper(*M, "atexit",197FunctionType::get(IntTy, {AtExitCallbackPtrTy}, false),198GlobalValue::HiddenVisibility, "__lljit.atexit_helper",199{PlatformInstanceDecl, DSOHandle});200201return J.addIRModule(JD, ThreadSafeModule(std::move(M), std::move(Ctx)));202}203204Error notifyAdding(ResourceTracker &RT, const MaterializationUnit &MU) {205auto &JD = RT.getJITDylib();206if (auto &InitSym = MU.getInitializerSymbol())207InitSymbols[&JD].add(InitSym, SymbolLookupFlags::WeaklyReferencedSymbol);208else {209// If there's no identified init symbol attached, but there is a symbol210// with the GenericIRPlatform::InitFunctionPrefix, then treat that as211// an init function. Add the symbol to both the InitSymbols map (which212// will trigger a lookup to materialize the module) and the InitFunctions213// map (which holds the names of the symbols to execute).214for (auto &KV : MU.getSymbols())215if ((*KV.first).starts_with(InitFunctionPrefix)) {216InitSymbols[&JD].add(KV.first,217SymbolLookupFlags::WeaklyReferencedSymbol);218InitFunctions[&JD].add(KV.first);219} else if ((*KV.first).starts_with(DeInitFunctionPrefix)) {220DeInitFunctions[&JD].add(KV.first);221}222}223return Error::success();224}225226Error initialize(JITDylib &JD) override {227LLVM_DEBUG({228dbgs() << "GenericLLVMIRPlatformSupport getting initializers to run\n";229});230if (auto Initializers = getInitializers(JD)) {231LLVM_DEBUG(232{ dbgs() << "GenericLLVMIRPlatformSupport running initializers\n"; });233for (auto InitFnAddr : *Initializers) {234LLVM_DEBUG({235dbgs() << " Running init " << formatv("{0:x16}", InitFnAddr)236<< "...\n";237});238auto *InitFn = InitFnAddr.toPtr<void (*)()>();239InitFn();240}241} else242return Initializers.takeError();243return Error::success();244}245246Error deinitialize(JITDylib &JD) override {247LLVM_DEBUG({248dbgs() << "GenericLLVMIRPlatformSupport getting deinitializers to run\n";249});250if (auto Deinitializers = getDeinitializers(JD)) {251LLVM_DEBUG({252dbgs() << "GenericLLVMIRPlatformSupport running deinitializers\n";253});254for (auto DeinitFnAddr : *Deinitializers) {255LLVM_DEBUG({256dbgs() << " Running deinit " << formatv("{0:x16}", DeinitFnAddr)257<< "...\n";258});259auto *DeinitFn = DeinitFnAddr.toPtr<void (*)()>();260DeinitFn();261}262} else263return Deinitializers.takeError();264265return Error::success();266}267268void registerInitFunc(JITDylib &JD, SymbolStringPtr InitName) {269getExecutionSession().runSessionLocked([&]() {270InitFunctions[&JD].add(InitName);271});272}273274void registerDeInitFunc(JITDylib &JD, SymbolStringPtr DeInitName) {275getExecutionSession().runSessionLocked(276[&]() { DeInitFunctions[&JD].add(DeInitName); });277}278279private:280Expected<std::vector<ExecutorAddr>> getInitializers(JITDylib &JD) {281if (auto Err = issueInitLookups(JD))282return std::move(Err);283284DenseMap<JITDylib *, SymbolLookupSet> LookupSymbols;285std::vector<JITDylibSP> DFSLinkOrder;286287if (auto Err = getExecutionSession().runSessionLocked([&]() -> Error {288if (auto DFSLinkOrderOrErr = JD.getDFSLinkOrder())289DFSLinkOrder = std::move(*DFSLinkOrderOrErr);290else291return DFSLinkOrderOrErr.takeError();292293for (auto &NextJD : DFSLinkOrder) {294auto IFItr = InitFunctions.find(NextJD.get());295if (IFItr != InitFunctions.end()) {296LookupSymbols[NextJD.get()] = std::move(IFItr->second);297InitFunctions.erase(IFItr);298}299}300return Error::success();301}))302return std::move(Err);303304LLVM_DEBUG({305dbgs() << "JITDylib init order is [ ";306for (auto &JD : llvm::reverse(DFSLinkOrder))307dbgs() << "\"" << JD->getName() << "\" ";308dbgs() << "]\n";309dbgs() << "Looking up init functions:\n";310for (auto &KV : LookupSymbols)311dbgs() << " \"" << KV.first->getName() << "\": " << KV.second << "\n";312});313314auto &ES = getExecutionSession();315auto LookupResult = Platform::lookupInitSymbols(ES, LookupSymbols);316317if (!LookupResult)318return LookupResult.takeError();319320std::vector<ExecutorAddr> Initializers;321while (!DFSLinkOrder.empty()) {322auto &NextJD = *DFSLinkOrder.back();323DFSLinkOrder.pop_back();324auto InitsItr = LookupResult->find(&NextJD);325if (InitsItr == LookupResult->end())326continue;327for (auto &KV : InitsItr->second)328Initializers.push_back(KV.second.getAddress());329}330331return Initializers;332}333334Expected<std::vector<ExecutorAddr>> getDeinitializers(JITDylib &JD) {335auto &ES = getExecutionSession();336337auto LLJITRunAtExits = J.mangleAndIntern("__lljit_run_atexits");338339DenseMap<JITDylib *, SymbolLookupSet> LookupSymbols;340std::vector<JITDylibSP> DFSLinkOrder;341342if (auto Err = ES.runSessionLocked([&]() -> Error {343if (auto DFSLinkOrderOrErr = JD.getDFSLinkOrder())344DFSLinkOrder = std::move(*DFSLinkOrderOrErr);345else346return DFSLinkOrderOrErr.takeError();347348for (auto &NextJD : DFSLinkOrder) {349auto &JDLookupSymbols = LookupSymbols[NextJD.get()];350auto DIFItr = DeInitFunctions.find(NextJD.get());351if (DIFItr != DeInitFunctions.end()) {352LookupSymbols[NextJD.get()] = std::move(DIFItr->second);353DeInitFunctions.erase(DIFItr);354}355JDLookupSymbols.add(LLJITRunAtExits,356SymbolLookupFlags::WeaklyReferencedSymbol);357}358return Error::success();359}))360return std::move(Err);361362LLVM_DEBUG({363dbgs() << "JITDylib deinit order is [ ";364for (auto &JD : DFSLinkOrder)365dbgs() << "\"" << JD->getName() << "\" ";366dbgs() << "]\n";367dbgs() << "Looking up deinit functions:\n";368for (auto &KV : LookupSymbols)369dbgs() << " \"" << KV.first->getName() << "\": " << KV.second << "\n";370});371372auto LookupResult = Platform::lookupInitSymbols(ES, LookupSymbols);373374if (!LookupResult)375return LookupResult.takeError();376377std::vector<ExecutorAddr> DeInitializers;378for (auto &NextJD : DFSLinkOrder) {379auto DeInitsItr = LookupResult->find(NextJD.get());380assert(DeInitsItr != LookupResult->end() &&381"Every JD should have at least __lljit_run_atexits");382383auto RunAtExitsItr = DeInitsItr->second.find(LLJITRunAtExits);384if (RunAtExitsItr != DeInitsItr->second.end())385DeInitializers.push_back(RunAtExitsItr->second.getAddress());386387for (auto &KV : DeInitsItr->second)388if (KV.first != LLJITRunAtExits)389DeInitializers.push_back(KV.second.getAddress());390}391392return DeInitializers;393}394395/// Issue lookups for all init symbols required to initialize JD (and any396/// JITDylibs that it depends on).397Error issueInitLookups(JITDylib &JD) {398DenseMap<JITDylib *, SymbolLookupSet> RequiredInitSymbols;399std::vector<JITDylibSP> DFSLinkOrder;400401if (auto Err = getExecutionSession().runSessionLocked([&]() -> Error {402if (auto DFSLinkOrderOrErr = JD.getDFSLinkOrder())403DFSLinkOrder = std::move(*DFSLinkOrderOrErr);404else405return DFSLinkOrderOrErr.takeError();406407for (auto &NextJD : DFSLinkOrder) {408auto ISItr = InitSymbols.find(NextJD.get());409if (ISItr != InitSymbols.end()) {410RequiredInitSymbols[NextJD.get()] = std::move(ISItr->second);411InitSymbols.erase(ISItr);412}413}414return Error::success();415}))416return Err;417418return Platform::lookupInitSymbols(getExecutionSession(),419RequiredInitSymbols)420.takeError();421}422423static void registerCxaAtExitHelper(void *Self, void (*F)(void *), void *Ctx,424void *DSOHandle) {425LLVM_DEBUG({426dbgs() << "Registering cxa atexit function " << (void *)F << " for JD "427<< (*static_cast<JITDylib **>(DSOHandle))->getName() << "\n";428});429static_cast<GenericLLVMIRPlatformSupport *>(Self)->AtExitMgr.registerAtExit(430F, Ctx, DSOHandle);431}432433static void registerAtExitHelper(void *Self, void *DSOHandle, void (*F)()) {434LLVM_DEBUG({435dbgs() << "Registering atexit function " << (void *)F << " for JD "436<< (*static_cast<JITDylib **>(DSOHandle))->getName() << "\n";437});438static_cast<GenericLLVMIRPlatformSupport *>(Self)->AtExitMgr.registerAtExit(439reinterpret_cast<void (*)(void *)>(F), nullptr, DSOHandle);440}441442static void runAtExitsHelper(void *Self, void *DSOHandle) {443LLVM_DEBUG({444dbgs() << "Running atexit functions for JD "445<< (*static_cast<JITDylib **>(DSOHandle))->getName() << "\n";446});447static_cast<GenericLLVMIRPlatformSupport *>(Self)->AtExitMgr.runAtExits(448DSOHandle);449}450451// Constructs an LLVM IR module containing platform runtime globals,452// functions, and interposes.453ThreadSafeModule createPlatformRuntimeModule() {454auto Ctx = std::make_unique<LLVMContext>();455auto M = std::make_unique<Module>("__standard_lib", *Ctx);456M->setDataLayout(J.getDataLayout());457458auto *GenericIRPlatformSupportTy =459StructType::create(*Ctx, "lljit.GenericLLJITIRPlatformSupport");460461auto *PlatformInstanceDecl = new GlobalVariable(462*M, GenericIRPlatformSupportTy, true, GlobalValue::ExternalLinkage,463nullptr, "__lljit.platform_support_instance");464465auto *Int8Ty = Type::getInt8Ty(*Ctx);466auto *IntTy = Type::getIntNTy(*Ctx, sizeof(int) * CHAR_BIT);467auto *VoidTy = Type::getVoidTy(*Ctx);468auto *BytePtrTy = PointerType::getUnqual(Int8Ty);469auto *CxaAtExitCallbackTy = FunctionType::get(VoidTy, {BytePtrTy}, false);470auto *CxaAtExitCallbackPtrTy = PointerType::getUnqual(CxaAtExitCallbackTy);471472addHelperAndWrapper(473*M, "__cxa_atexit",474FunctionType::get(IntTy, {CxaAtExitCallbackPtrTy, BytePtrTy, BytePtrTy},475false),476GlobalValue::DefaultVisibility, "__lljit.cxa_atexit_helper",477{PlatformInstanceDecl});478479return ThreadSafeModule(std::move(M), std::move(Ctx));480}481482LLJIT &J;483std::string InitFunctionPrefix;484std::string DeInitFunctionPrefix;485DenseMap<JITDylib *, SymbolLookupSet> InitSymbols;486DenseMap<JITDylib *, SymbolLookupSet> InitFunctions;487DenseMap<JITDylib *, SymbolLookupSet> DeInitFunctions;488ItaniumCXAAtExitSupport AtExitMgr;489};490491Error GenericLLVMIRPlatform::setupJITDylib(JITDylib &JD) {492return S.setupJITDylib(JD);493}494495Error GenericLLVMIRPlatform::teardownJITDylib(JITDylib &JD) {496return Error::success();497}498499Error GenericLLVMIRPlatform::notifyAdding(ResourceTracker &RT,500const MaterializationUnit &MU) {501return S.notifyAdding(RT, MU);502}503504Expected<ThreadSafeModule>505GlobalCtorDtorScraper::operator()(ThreadSafeModule TSM,506MaterializationResponsibility &R) {507auto Err = TSM.withModuleDo([&](Module &M) -> Error {508auto &Ctx = M.getContext();509auto *GlobalCtors = M.getNamedGlobal("llvm.global_ctors");510auto *GlobalDtors = M.getNamedGlobal("llvm.global_dtors");511512auto RegisterCOrDtors = [&](GlobalVariable *GlobalCOrDtors,513bool isCtor) -> Error {514// If there's no llvm.global_c/dtor or it's just a decl then skip.515if (!GlobalCOrDtors || GlobalCOrDtors->isDeclaration())516return Error::success();517std::string InitOrDeInitFunctionName;518if (isCtor)519raw_string_ostream(InitOrDeInitFunctionName)520<< InitFunctionPrefix << M.getModuleIdentifier();521else522raw_string_ostream(InitOrDeInitFunctionName)523<< DeInitFunctionPrefix << M.getModuleIdentifier();524525MangleAndInterner Mangle(PS.getExecutionSession(), M.getDataLayout());526auto InternedInitOrDeInitName = Mangle(InitOrDeInitFunctionName);527if (auto Err = R.defineMaterializing(528{{InternedInitOrDeInitName, JITSymbolFlags::Callable}}))529return Err;530531auto *InitOrDeInitFunc = Function::Create(532FunctionType::get(Type::getVoidTy(Ctx), {}, false),533GlobalValue::ExternalLinkage, InitOrDeInitFunctionName, &M);534InitOrDeInitFunc->setVisibility(GlobalValue::HiddenVisibility);535std::vector<std::pair<Function *, unsigned>> InitsOrDeInits;536auto COrDtors = isCtor ? getConstructors(M) : getDestructors(M);537538for (auto E : COrDtors)539InitsOrDeInits.push_back(std::make_pair(E.Func, E.Priority));540llvm::stable_sort(InitsOrDeInits, llvm::less_second());541542auto *InitOrDeInitFuncEntryBlock =543BasicBlock::Create(Ctx, "entry", InitOrDeInitFunc);544IRBuilder<> IB(InitOrDeInitFuncEntryBlock);545for (auto &KV : InitsOrDeInits)546IB.CreateCall(KV.first);547IB.CreateRetVoid();548549if (isCtor)550PS.registerInitFunc(R.getTargetJITDylib(), InternedInitOrDeInitName);551else552PS.registerDeInitFunc(R.getTargetJITDylib(), InternedInitOrDeInitName);553554GlobalCOrDtors->eraseFromParent();555return Error::success();556};557558if (auto Err = RegisterCOrDtors(GlobalCtors, true))559return Err;560if (auto Err = RegisterCOrDtors(GlobalDtors, false))561return Err;562563return Error::success();564});565566if (Err)567return std::move(Err);568569return std::move(TSM);570}571572/// Inactive Platform Support573///574/// Explicitly disables platform support. JITDylibs are not scanned for special575/// init/deinit symbols. No runtime API interposes are injected.576class InactivePlatformSupport : public LLJIT::PlatformSupport {577public:578InactivePlatformSupport() = default;579580Error initialize(JITDylib &JD) override {581LLVM_DEBUG(dbgs() << "InactivePlatformSupport: no initializers running for "582<< JD.getName() << "\n");583return Error::success();584}585586Error deinitialize(JITDylib &JD) override {587LLVM_DEBUG(588dbgs() << "InactivePlatformSupport: no deinitializers running for "589<< JD.getName() << "\n");590return Error::success();591}592};593594} // end anonymous namespace595596namespace llvm {597namespace orc {598599Error ORCPlatformSupport::initialize(orc::JITDylib &JD) {600using llvm::orc::shared::SPSExecutorAddr;601using llvm::orc::shared::SPSString;602using SPSDLOpenSig = SPSExecutorAddr(SPSString, int32_t);603enum dlopen_mode : int32_t {604ORC_RT_RTLD_LAZY = 0x1,605ORC_RT_RTLD_NOW = 0x2,606ORC_RT_RTLD_LOCAL = 0x4,607ORC_RT_RTLD_GLOBAL = 0x8608};609610auto &ES = J.getExecutionSession();611auto MainSearchOrder = J.getMainJITDylib().withLinkOrderDo(612[](const JITDylibSearchOrder &SO) { return SO; });613614if (auto WrapperAddr = ES.lookup(615MainSearchOrder, J.mangleAndIntern("__orc_rt_jit_dlopen_wrapper"))) {616return ES.callSPSWrapper<SPSDLOpenSig>(WrapperAddr->getAddress(),617DSOHandles[&JD], JD.getName(),618int32_t(ORC_RT_RTLD_LAZY));619} else620return WrapperAddr.takeError();621}622623Error ORCPlatformSupport::deinitialize(orc::JITDylib &JD) {624using llvm::orc::shared::SPSExecutorAddr;625using SPSDLCloseSig = int32_t(SPSExecutorAddr);626627auto &ES = J.getExecutionSession();628auto MainSearchOrder = J.getMainJITDylib().withLinkOrderDo(629[](const JITDylibSearchOrder &SO) { return SO; });630631if (auto WrapperAddr = ES.lookup(632MainSearchOrder, J.mangleAndIntern("__orc_rt_jit_dlclose_wrapper"))) {633int32_t result;634auto E = J.getExecutionSession().callSPSWrapper<SPSDLCloseSig>(635WrapperAddr->getAddress(), result, DSOHandles[&JD]);636if (E)637return E;638else if (result)639return make_error<StringError>("dlclose failed",640inconvertibleErrorCode());641DSOHandles.erase(&JD);642} else643return WrapperAddr.takeError();644return Error::success();645}646647void LLJIT::PlatformSupport::setInitTransform(648LLJIT &J, IRTransformLayer::TransformFunction T) {649J.InitHelperTransformLayer->setTransform(std::move(T));650}651652LLJIT::PlatformSupport::~PlatformSupport() = default;653654Error LLJITBuilderState::prepareForConstruction() {655656LLVM_DEBUG(dbgs() << "Preparing to create LLJIT instance...\n");657658if (!JTMB) {659LLVM_DEBUG({660dbgs() << " No explicitly set JITTargetMachineBuilder. "661"Detecting host...\n";662});663if (auto JTMBOrErr = JITTargetMachineBuilder::detectHost())664JTMB = std::move(*JTMBOrErr);665else666return JTMBOrErr.takeError();667}668669if ((ES || EPC) && NumCompileThreads)670return make_error<StringError>(671"NumCompileThreads cannot be used with a custom ExecutionSession or "672"ExecutorProcessControl",673inconvertibleErrorCode());674675#if !LLVM_ENABLE_THREADS676if (NumCompileThreads)677return make_error<StringError>(678"LLJIT num-compile-threads is " + Twine(NumCompileThreads) +679" but LLVM was compiled with LLVM_ENABLE_THREADS=Off",680inconvertibleErrorCode());681#endif // !LLVM_ENABLE_THREADS682683// Only used in debug builds.684[[maybe_unused]] bool ConcurrentCompilationSettingDefaulted =685!SupportConcurrentCompilation;686687if (!SupportConcurrentCompilation) {688#if LLVM_ENABLE_THREADS689SupportConcurrentCompilation = NumCompileThreads || ES || EPC;690#else691SupportConcurrentCompilation = false;692#endif // LLVM_ENABLE_THREADS693} else {694#if !LLVM_ENABLE_THREADS695if (*SupportConcurrentCompilation)696return make_error<StringError>(697"LLJIT concurrent compilation support requested, but LLVM was built "698"with LLVM_ENABLE_THREADS=Off",699inconvertibleErrorCode());700#endif // !LLVM_ENABLE_THREADS701}702703LLVM_DEBUG({704dbgs() << " JITTargetMachineBuilder is "705<< JITTargetMachineBuilderPrinter(*JTMB, " ")706<< " Pre-constructed ExecutionSession: " << (ES ? "Yes" : "No")707<< "\n"708<< " DataLayout: ";709if (DL)710dbgs() << DL->getStringRepresentation() << "\n";711else712dbgs() << "None (will be created by JITTargetMachineBuilder)\n";713714dbgs() << " Custom object-linking-layer creator: "715<< (CreateObjectLinkingLayer ? "Yes" : "No") << "\n"716<< " Custom compile-function creator: "717<< (CreateCompileFunction ? "Yes" : "No") << "\n"718<< " Custom platform-setup function: "719<< (SetUpPlatform ? "Yes" : "No") << "\n"720<< " Support concurrent compilation: "721<< (*SupportConcurrentCompilation ? "Yes" : "No");722if (ConcurrentCompilationSettingDefaulted)723dbgs() << " (defaulted based on ES / EPC / NumCompileThreads)\n";724else725dbgs() << "\n";726dbgs() << " Number of compile threads: " << NumCompileThreads << "\n";727});728729// Create DL if not specified.730if (!DL) {731if (auto DLOrErr = JTMB->getDefaultDataLayoutForTarget())732DL = std::move(*DLOrErr);733else734return DLOrErr.takeError();735}736737// If neither ES nor EPC has been set then create an EPC instance.738if (!ES && !EPC) {739LLVM_DEBUG({740dbgs() << "ExecutorProcessControl not specified, "741"Creating SelfExecutorProcessControl instance\n";742});743744std::unique_ptr<TaskDispatcher> D = nullptr;745#if LLVM_ENABLE_THREADS746if (*SupportConcurrentCompilation) {747std::optional<size_t> NumThreads = std ::nullopt;748if (NumCompileThreads)749NumThreads = NumCompileThreads;750D = std::make_unique<DynamicThreadPoolTaskDispatcher>(NumThreads);751} else752D = std::make_unique<InPlaceTaskDispatcher>();753#endif // LLVM_ENABLE_THREADS754if (auto EPCOrErr =755SelfExecutorProcessControl::Create(nullptr, std::move(D), nullptr))756EPC = std::move(*EPCOrErr);757else758return EPCOrErr.takeError();759} else if (EPC) {760LLVM_DEBUG({761dbgs() << "Using explicitly specified ExecutorProcessControl instance "762<< EPC.get() << "\n";763});764} else {765LLVM_DEBUG({766dbgs() << "Using explicitly specified ExecutionSession instance "767<< ES.get() << "\n";768});769}770771// If the client didn't configure any linker options then auto-configure the772// JIT linker.773if (!CreateObjectLinkingLayer) {774auto &TT = JTMB->getTargetTriple();775bool UseJITLink = false;776switch (TT.getArch()) {777case Triple::riscv64:778case Triple::loongarch64:779UseJITLink = true;780break;781case Triple::aarch64:782UseJITLink = !TT.isOSBinFormatCOFF();783break;784case Triple::arm:785case Triple::armeb:786case Triple::thumb:787case Triple::thumbeb:788UseJITLink = TT.isOSBinFormatELF();789break;790case Triple::x86_64:791UseJITLink = !TT.isOSBinFormatCOFF();792break;793case Triple::ppc64:794UseJITLink = TT.isPPC64ELFv2ABI();795break;796case Triple::ppc64le:797UseJITLink = TT.isOSBinFormatELF();798break;799default:800break;801}802if (UseJITLink) {803if (!JTMB->getCodeModel())804JTMB->setCodeModel(CodeModel::Small);805JTMB->setRelocationModel(Reloc::PIC_);806CreateObjectLinkingLayer =807[](ExecutionSession &ES,808const Triple &) -> Expected<std::unique_ptr<ObjectLayer>> {809auto ObjLinkingLayer = std::make_unique<ObjectLinkingLayer>(ES);810if (auto EHFrameRegistrar = EPCEHFrameRegistrar::Create(ES))811ObjLinkingLayer->addPlugin(812std::make_unique<EHFrameRegistrationPlugin>(813ES, std::move(*EHFrameRegistrar)));814else815return EHFrameRegistrar.takeError();816return std::move(ObjLinkingLayer);817};818}819}820821// If we need a process JITDylib but no setup function has been given then822// create a default one.823if (!SetupProcessSymbolsJITDylib && LinkProcessSymbolsByDefault) {824LLVM_DEBUG(dbgs() << "Creating default Process JD setup function\n");825SetupProcessSymbolsJITDylib = [](LLJIT &J) -> Expected<JITDylibSP> {826auto &JD =827J.getExecutionSession().createBareJITDylib("<Process Symbols>");828auto G = EPCDynamicLibrarySearchGenerator::GetForTargetProcess(829J.getExecutionSession());830if (!G)831return G.takeError();832JD.addGenerator(std::move(*G));833return &JD;834};835}836837return Error::success();838}839840LLJIT::~LLJIT() {841if (auto Err = ES->endSession())842ES->reportError(std::move(Err));843}844845JITDylibSP LLJIT::getProcessSymbolsJITDylib() { return ProcessSymbols; }846847JITDylibSP LLJIT::getPlatformJITDylib() { return Platform; }848849Expected<JITDylib &> LLJIT::createJITDylib(std::string Name) {850auto JD = ES->createJITDylib(std::move(Name));851if (!JD)852return JD.takeError();853854JD->addToLinkOrder(DefaultLinks);855return JD;856}857858Expected<JITDylib &> LLJIT::loadPlatformDynamicLibrary(const char *Path) {859auto G = EPCDynamicLibrarySearchGenerator::Load(*ES, Path);860if (!G)861return G.takeError();862863if (auto *ExistingJD = ES->getJITDylibByName(Path))864return *ExistingJD;865866auto &JD = ES->createBareJITDylib(Path);867JD.addGenerator(std::move(*G));868return JD;869}870871Error LLJIT::linkStaticLibraryInto(JITDylib &JD,872std::unique_ptr<MemoryBuffer> LibBuffer) {873auto G = StaticLibraryDefinitionGenerator::Create(*ObjLinkingLayer,874std::move(LibBuffer));875if (!G)876return G.takeError();877878JD.addGenerator(std::move(*G));879880return Error::success();881}882883Error LLJIT::linkStaticLibraryInto(JITDylib &JD, const char *Path) {884auto G = StaticLibraryDefinitionGenerator::Load(*ObjLinkingLayer, Path);885if (!G)886return G.takeError();887888JD.addGenerator(std::move(*G));889890return Error::success();891}892893Error LLJIT::addIRModule(ResourceTrackerSP RT, ThreadSafeModule TSM) {894assert(TSM && "Can not add null module");895896if (auto Err =897TSM.withModuleDo([&](Module &M) { return applyDataLayout(M); }))898return Err;899900return InitHelperTransformLayer->add(std::move(RT), std::move(TSM));901}902903Error LLJIT::addIRModule(JITDylib &JD, ThreadSafeModule TSM) {904return addIRModule(JD.getDefaultResourceTracker(), std::move(TSM));905}906907Error LLJIT::addObjectFile(ResourceTrackerSP RT,908std::unique_ptr<MemoryBuffer> Obj) {909assert(Obj && "Can not add null object");910911return ObjTransformLayer->add(std::move(RT), std::move(Obj));912}913914Error LLJIT::addObjectFile(JITDylib &JD, std::unique_ptr<MemoryBuffer> Obj) {915return addObjectFile(JD.getDefaultResourceTracker(), std::move(Obj));916}917918Expected<ExecutorAddr> LLJIT::lookupLinkerMangled(JITDylib &JD,919SymbolStringPtr Name) {920if (auto Sym = ES->lookup(921makeJITDylibSearchOrder(&JD, JITDylibLookupFlags::MatchAllSymbols),922Name))923return Sym->getAddress();924else925return Sym.takeError();926}927928Expected<std::unique_ptr<ObjectLayer>>929LLJIT::createObjectLinkingLayer(LLJITBuilderState &S, ExecutionSession &ES) {930931// If the config state provided an ObjectLinkingLayer factory then use it.932if (S.CreateObjectLinkingLayer)933return S.CreateObjectLinkingLayer(ES, S.JTMB->getTargetTriple());934935// Otherwise default to creating an RTDyldObjectLinkingLayer that constructs936// a new SectionMemoryManager for each object.937auto GetMemMgr = []() { return std::make_unique<SectionMemoryManager>(); };938auto Layer =939std::make_unique<RTDyldObjectLinkingLayer>(ES, std::move(GetMemMgr));940941if (S.JTMB->getTargetTriple().isOSBinFormatCOFF()) {942Layer->setOverrideObjectFlagsWithResponsibilityFlags(true);943Layer->setAutoClaimResponsibilityForObjectSymbols(true);944}945946if (S.JTMB->getTargetTriple().isOSBinFormatELF() &&947(S.JTMB->getTargetTriple().getArch() == Triple::ArchType::ppc64 ||948S.JTMB->getTargetTriple().getArch() == Triple::ArchType::ppc64le))949Layer->setAutoClaimResponsibilityForObjectSymbols(true);950951// FIXME: Explicit conversion to std::unique_ptr<ObjectLayer> added to silence952// errors from some GCC / libstdc++ bots. Remove this conversion (i.e.953// just return ObjLinkingLayer) once those bots are upgraded.954return std::unique_ptr<ObjectLayer>(std::move(Layer));955}956957Expected<std::unique_ptr<IRCompileLayer::IRCompiler>>958LLJIT::createCompileFunction(LLJITBuilderState &S,959JITTargetMachineBuilder JTMB) {960961/// If there is a custom compile function creator set then use it.962if (S.CreateCompileFunction)963return S.CreateCompileFunction(std::move(JTMB));964965// If using a custom EPC then use a ConcurrentIRCompiler by default.966if (*S.SupportConcurrentCompilation)967return std::make_unique<ConcurrentIRCompiler>(std::move(JTMB));968969auto TM = JTMB.createTargetMachine();970if (!TM)971return TM.takeError();972973return std::make_unique<TMOwningSimpleCompiler>(std::move(*TM));974}975976LLJIT::LLJIT(LLJITBuilderState &S, Error &Err)977: DL(std::move(*S.DL)), TT(S.JTMB->getTargetTriple()) {978979ErrorAsOutParameter _(&Err);980981assert(!(S.EPC && S.ES) && "EPC and ES should not both be set");982983if (S.EPC) {984ES = std::make_unique<ExecutionSession>(std::move(S.EPC));985} else if (S.ES)986ES = std::move(S.ES);987else {988if (auto EPC = SelfExecutorProcessControl::Create()) {989ES = std::make_unique<ExecutionSession>(std::move(*EPC));990} else {991Err = EPC.takeError();992return;993}994}995996auto ObjLayer = createObjectLinkingLayer(S, *ES);997if (!ObjLayer) {998Err = ObjLayer.takeError();999return;1000}1001ObjLinkingLayer = std::move(*ObjLayer);1002ObjTransformLayer =1003std::make_unique<ObjectTransformLayer>(*ES, *ObjLinkingLayer);10041005{1006auto CompileFunction = createCompileFunction(S, std::move(*S.JTMB));1007if (!CompileFunction) {1008Err = CompileFunction.takeError();1009return;1010}1011CompileLayer = std::make_unique<IRCompileLayer>(1012*ES, *ObjTransformLayer, std::move(*CompileFunction));1013TransformLayer = std::make_unique<IRTransformLayer>(*ES, *CompileLayer);1014InitHelperTransformLayer =1015std::make_unique<IRTransformLayer>(*ES, *TransformLayer);1016}10171018if (*S.SupportConcurrentCompilation)1019InitHelperTransformLayer->setCloneToNewContextOnEmit(true);10201021if (S.SetupProcessSymbolsJITDylib) {1022if (auto ProcSymsJD = S.SetupProcessSymbolsJITDylib(*this)) {1023ProcessSymbols = ProcSymsJD->get();1024} else {1025Err = ProcSymsJD.takeError();1026return;1027}1028}10291030if (S.PrePlatformSetup) {1031if (auto Err2 = S.PrePlatformSetup(*this)) {1032Err = std::move(Err2);1033return;1034}1035}10361037if (!S.SetUpPlatform)1038S.SetUpPlatform = setUpGenericLLVMIRPlatform;10391040if (auto PlatformJDOrErr = S.SetUpPlatform(*this)) {1041Platform = PlatformJDOrErr->get();1042if (Platform)1043DefaultLinks.push_back(1044{Platform, JITDylibLookupFlags::MatchExportedSymbolsOnly});1045} else {1046Err = PlatformJDOrErr.takeError();1047return;1048}10491050if (S.LinkProcessSymbolsByDefault)1051DefaultLinks.push_back(1052{ProcessSymbols, JITDylibLookupFlags::MatchExportedSymbolsOnly});10531054if (auto MainOrErr = createJITDylib("main"))1055Main = &*MainOrErr;1056else {1057Err = MainOrErr.takeError();1058return;1059}1060}10611062std::string LLJIT::mangle(StringRef UnmangledName) const {1063std::string MangledName;1064{1065raw_string_ostream MangledNameStream(MangledName);1066Mangler::getNameWithPrefix(MangledNameStream, UnmangledName, DL);1067}1068return MangledName;1069}10701071Error LLJIT::applyDataLayout(Module &M) {1072if (M.getDataLayout().isDefault())1073M.setDataLayout(DL);10741075if (M.getDataLayout() != DL)1076return make_error<StringError>(1077"Added modules have incompatible data layouts: " +1078M.getDataLayout().getStringRepresentation() + " (module) vs " +1079DL.getStringRepresentation() + " (jit)",1080inconvertibleErrorCode());10811082return Error::success();1083}10841085Error setUpOrcPlatformManually(LLJIT &J) {1086LLVM_DEBUG({ dbgs() << "Setting up orc platform support for LLJIT\n"; });1087J.setPlatformSupport(std::make_unique<ORCPlatformSupport>(J));1088return Error::success();1089}10901091class LoadAndLinkDynLibrary {1092public:1093LoadAndLinkDynLibrary(LLJIT &J) : J(J) {}1094Error operator()(JITDylib &JD, StringRef DLLName) {1095if (!DLLName.ends_with_insensitive(".dll"))1096return make_error<StringError>("DLLName not ending with .dll",1097inconvertibleErrorCode());1098auto DLLNameStr = DLLName.str(); // Guarantees null-termination.1099auto DLLJD = J.loadPlatformDynamicLibrary(DLLNameStr.c_str());1100if (!DLLJD)1101return DLLJD.takeError();1102JD.addToLinkOrder(*DLLJD);1103return Error::success();1104}11051106private:1107LLJIT &J;1108};11091110Expected<JITDylibSP> ExecutorNativePlatform::operator()(LLJIT &J) {1111auto ProcessSymbolsJD = J.getProcessSymbolsJITDylib();1112if (!ProcessSymbolsJD)1113return make_error<StringError>(1114"Native platforms require a process symbols JITDylib",1115inconvertibleErrorCode());11161117const Triple &TT = J.getTargetTriple();1118ObjectLinkingLayer *ObjLinkingLayer =1119dyn_cast<ObjectLinkingLayer>(&J.getObjLinkingLayer());11201121if (!ObjLinkingLayer)1122return make_error<StringError>(1123"ExecutorNativePlatform requires ObjectLinkingLayer",1124inconvertibleErrorCode());11251126std::unique_ptr<MemoryBuffer> RuntimeArchiveBuffer;1127if (OrcRuntime.index() == 0) {1128auto A = errorOrToExpected(MemoryBuffer::getFile(std::get<0>(OrcRuntime)));1129if (!A)1130return A.takeError();1131RuntimeArchiveBuffer = std::move(*A);1132} else1133RuntimeArchiveBuffer = std::move(std::get<1>(OrcRuntime));11341135auto &ES = J.getExecutionSession();1136auto &PlatformJD = ES.createBareJITDylib("<Platform>");1137PlatformJD.addToLinkOrder(*ProcessSymbolsJD);11381139J.setPlatformSupport(std::make_unique<ORCPlatformSupport>(J));11401141switch (TT.getObjectFormat()) {1142case Triple::COFF: {1143const char *VCRuntimePath = nullptr;1144bool StaticVCRuntime = false;1145if (VCRuntime) {1146VCRuntimePath = VCRuntime->first.c_str();1147StaticVCRuntime = VCRuntime->second;1148}1149if (auto P = COFFPlatform::Create(1150ES, *ObjLinkingLayer, PlatformJD, std::move(RuntimeArchiveBuffer),1151LoadAndLinkDynLibrary(J), StaticVCRuntime, VCRuntimePath))1152J.getExecutionSession().setPlatform(std::move(*P));1153else1154return P.takeError();1155break;1156}1157case Triple::ELF: {1158auto G = StaticLibraryDefinitionGenerator::Create(1159*ObjLinkingLayer, std::move(RuntimeArchiveBuffer));1160if (!G)1161return G.takeError();11621163if (auto P = ELFNixPlatform::Create(ES, *ObjLinkingLayer, PlatformJD,1164std::move(*G)))1165J.getExecutionSession().setPlatform(std::move(*P));1166else1167return P.takeError();1168break;1169}1170case Triple::MachO: {1171auto G = StaticLibraryDefinitionGenerator::Create(1172*ObjLinkingLayer, std::move(RuntimeArchiveBuffer));1173if (!G)1174return G.takeError();11751176if (auto P = MachOPlatform::Create(ES, *ObjLinkingLayer, PlatformJD,1177std::move(*G)))1178ES.setPlatform(std::move(*P));1179else1180return P.takeError();1181break;1182}1183default:1184return make_error<StringError>("Unsupported object format in triple " +1185TT.str(),1186inconvertibleErrorCode());1187}11881189return &PlatformJD;1190}11911192Expected<JITDylibSP> setUpGenericLLVMIRPlatform(LLJIT &J) {1193LLVM_DEBUG(1194{ dbgs() << "Setting up GenericLLVMIRPlatform support for LLJIT\n"; });1195auto ProcessSymbolsJD = J.getProcessSymbolsJITDylib();1196if (!ProcessSymbolsJD)1197return make_error<StringError>(1198"Native platforms require a process symbols JITDylib",1199inconvertibleErrorCode());12001201auto &PlatformJD = J.getExecutionSession().createBareJITDylib("<Platform>");1202PlatformJD.addToLinkOrder(*ProcessSymbolsJD);12031204J.setPlatformSupport(1205std::make_unique<GenericLLVMIRPlatformSupport>(J, PlatformJD));12061207return &PlatformJD;1208}12091210Expected<JITDylibSP> setUpInactivePlatform(LLJIT &J) {1211LLVM_DEBUG(1212{ dbgs() << "Explicitly deactivated platform support for LLJIT\n"; });1213J.setPlatformSupport(std::make_unique<InactivePlatformSupport>());1214return nullptr;1215}12161217Error LLLazyJITBuilderState::prepareForConstruction() {1218if (auto Err = LLJITBuilderState::prepareForConstruction())1219return Err;1220TT = JTMB->getTargetTriple();1221return Error::success();1222}12231224Error LLLazyJIT::addLazyIRModule(JITDylib &JD, ThreadSafeModule TSM) {1225assert(TSM && "Can not add null module");12261227if (auto Err = TSM.withModuleDo(1228[&](Module &M) -> Error { return applyDataLayout(M); }))1229return Err;12301231return CODLayer->add(JD, std::move(TSM));1232}12331234LLLazyJIT::LLLazyJIT(LLLazyJITBuilderState &S, Error &Err) : LLJIT(S, Err) {12351236// If LLJIT construction failed then bail out.1237if (Err)1238return;12391240ErrorAsOutParameter _(&Err);12411242/// Take/Create the lazy-compile callthrough manager.1243if (S.LCTMgr)1244LCTMgr = std::move(S.LCTMgr);1245else {1246if (auto LCTMgrOrErr = createLocalLazyCallThroughManager(1247S.TT, *ES, S.LazyCompileFailureAddr))1248LCTMgr = std::move(*LCTMgrOrErr);1249else {1250Err = LCTMgrOrErr.takeError();1251return;1252}1253}12541255// Take/Create the indirect stubs manager builder.1256auto ISMBuilder = std::move(S.ISMBuilder);12571258// If none was provided, try to build one.1259if (!ISMBuilder)1260ISMBuilder = createLocalIndirectStubsManagerBuilder(S.TT);12611262// No luck. Bail out.1263if (!ISMBuilder) {1264Err = make_error<StringError>("Could not construct "1265"IndirectStubsManagerBuilder for target " +1266S.TT.str(),1267inconvertibleErrorCode());1268return;1269}12701271// Create the COD layer.1272CODLayer = std::make_unique<CompileOnDemandLayer>(1273*ES, *InitHelperTransformLayer, *LCTMgr, std::move(ISMBuilder));12741275if (*S.SupportConcurrentCompilation)1276CODLayer->setCloneToNewContextOnEmit(true);1277}12781279// In-process LLJIT uses eh-frame section wrappers via EPC, so we need to force1280// them to be linked in.1281LLVM_ATTRIBUTE_USED void linkComponents() {1282errs() << (void *)&llvm_orc_registerEHFrameSectionWrapper1283<< (void *)&llvm_orc_deregisterEHFrameSectionWrapper;1284}12851286} // End namespace orc.1287} // End namespace llvm.128812891290