From f5436c2be75dc66c18b9ae99f4c4f266c98cff7f Mon Sep 17 00:00:00 2001 From: liushuyu Date: Tue, 4 Feb 2025 17:22:34 -0700 Subject: [PATCH 1/8] tree-wide: replace pointerTo() with LLPointerType::get(...) --- gen/abi/aarch64.cpp | 2 +- gen/classes.cpp | 2 +- gen/dcompute/druntime.h | 2 +- gen/dynamiccompile.cpp | 7 ++++--- gen/nested.cpp | 4 ++-- gen/toir.cpp | 2 +- gen/variable_lifetime.cpp | 5 +++-- ir/irtypefunction.cpp | 2 +- ir/irtypestruct.cpp | 2 +- 9 files changed, 15 insertions(+), 13 deletions(-) diff --git a/gen/abi/aarch64.cpp b/gen/abi/aarch64.cpp index 0b9cd0f3a8c..f90efa298a8 100644 --- a/gen/abi/aarch64.cpp +++ b/gen/abi/aarch64.cpp @@ -130,7 +130,7 @@ struct AArch64TargetABI : TargetABI { // compiler magic: pass va_list args implicitly by reference if (!isReturnVal && isAAPCS64VaList(t)) { arg.byref = true; - arg.ltype = arg.ltype->getPointerTo(); + arg.ltype = LLPointerType::getUnqual(arg.ltype); return; } diff --git a/gen/classes.cpp b/gen/classes.cpp index fba0ab178ad..6fe9612d9ab 100644 --- a/gen/classes.cpp +++ b/gen/classes.cpp @@ -483,7 +483,7 @@ DtoVirtualFunctionPointer(DValue *inst, FuncDeclaration *fdecl) { // get the vtbl for objects vtable = DtoGEP(irtc->getMemoryLLType(), vthis, 0u, 0); // load vtbl ptr - vtable = DtoLoad(vtblType->getPointerTo(), vtable); + vtable = DtoLoad(LLPointerType::getUnqual(vtblType), vtable); // index vtbl const std::string name = fdecl->toChars(); const auto vtblname = name + "@vtbl"; diff --git a/gen/dcompute/druntime.h b/gen/dcompute/druntime.h index 2b1a2a6a859..1008c3cb399 100644 --- a/gen/dcompute/druntime.h +++ b/gen/dcompute/druntime.h @@ -41,7 +41,7 @@ struct DcomputePointer { int as = addrspace; if (translate) as = gIR->dcomputetarget->mapping[as]; - return llType->getPointerTo(as); + return LLPointerType::get(llType, as); } }; llvm::Optional toDcomputePointer(StructDeclaration *sd); diff --git a/gen/dynamiccompile.cpp b/gen/dynamiccompile.cpp index 817e3c009ee..d2cf0858c5d 100644 --- a/gen/dynamiccompile.cpp +++ b/gen/dynamiccompile.cpp @@ -652,7 +652,7 @@ llvm::GlobalVariable *generateModuleListElem(IRState *irs, const Types &types, auto *modListElem = new llvm::GlobalVariable( irs->module, elem_type, false, llvm::GlobalValue::PrivateLinkage, init, ".rtcompile_modlist_elem"); - modListElem->setAlignment(irs->module.getDataLayout().getABITypeAlign(elem_type->getPointerTo())); + modListElem->setAlignment(irs->module.getDataLayout().getABITypeAlign(LLPointerType::getUnqual(elem_type))); return modListElem; } @@ -687,7 +687,8 @@ void generateCtorBody(IRState *irs, const Types &types, llvm::Function *func, auto modListHeadPtr = declareModListHead(irs->module, types); llvm::Value *gepVals[] = {zero64, elemIndex}; auto elemNextPtr = builder.CreateGEP(types.modListElemType, modListElem, gepVals); - auto prevHeadVal = builder.CreateLoad(types.modListElemType->getPointerTo()->getPointerTo(), modListHeadPtr); + auto modListElemPtr = LLPointerType::getUnqual(types.modListElemType); + auto prevHeadVal = builder.CreateLoad(LLPointerType::getUnqual(modListElemPtr), modListHeadPtr); auto voidPtr = builder.CreateBitOrPointerCast( modListElem, getI8PtrType(irs->context())); builder.CreateStore(voidPtr, modListHeadPtr); @@ -835,7 +836,7 @@ void defineDynamicCompiledFunction(IRState *irs, IrFunction *func) { auto srcFunc = func->getLLVMFunc(); auto it = irs->dynamicCompiledFunctions.find(srcFunc); assert(irs->dynamicCompiledFunctions.end() != it); - auto thunkVarType = srcFunc->getFunctionType()->getPointerTo(); + auto thunkVarType = LLPointerType::getUnqual(srcFunc->getFunctionType()); auto thunkVar = new llvm::GlobalVariable( irs->module, thunkVarType, false, llvm::GlobalValue::PrivateLinkage, llvm::ConstantPointerNull::get(thunkVarType), diff --git a/gen/nested.cpp b/gen/nested.cpp index 06da6c7e342..ac9e257d849 100644 --- a/gen/nested.cpp +++ b/gen/nested.cpp @@ -170,7 +170,7 @@ DValue *DtoNestedVariable(Loc loc, Type *astype, VarDeclaration *vd, IF_LOG Logger::cout() << "Frame index: " << *val << '\n'; currFrame = getIrFunc(fd)->frameType; gIR->DBuilder.OpDeref(dwarfAddrOps); - val = DtoAlignedLoad(currFrame->getPointerTo(), val, + val = DtoAlignedLoad(LLPointerType::getUnqual(currFrame), val, (std::string(".frame.") + vdparent->toChars()).c_str()); IF_LOG Logger::cout() << "Frame: " << *val << '\n'; } @@ -505,7 +505,7 @@ void DtoCreateNestedContext(FuncGenState &funcGen) { mem = gIR->ir->CreateAdd(mem, DtoConstSize_t(mask)); mem = gIR->ir->CreateAnd(mem, DtoConstSize_t(~mask)); frame = - gIR->ir->CreateIntToPtr(mem, frameType->getPointerTo(), ".frame"); + gIR->ir->CreateIntToPtr(mem, LLPointerType::getUnqual(frameType), ".frame"); } } else { frame = DtoRawAlloca(frameType, frameAlignment, ".frame"); diff --git a/gen/toir.cpp b/gen/toir.cpp index 73991fec6a5..e39f2e08fe0 100644 --- a/gen/toir.cpp +++ b/gen/toir.cpp @@ -2826,7 +2826,7 @@ class ToElemVisitor : public Visitor { LLValue *val = DtoRVal(ex); // Get and load vtbl pointer. - llvm::Value *vtbl = DtoLoad(vtblType->getPointerTo(), + llvm::Value *vtbl = DtoLoad(LLPointerType::getUnqual(vtblType), DtoGEP(irtc->getMemoryLLType(), val, 0u, 0)); // TypeInfo ptr is first vtbl entry. diff --git a/gen/variable_lifetime.cpp b/gen/variable_lifetime.cpp index 488739cd83d..e479238fa45 100644 --- a/gen/variable_lifetime.cpp +++ b/gen/variable_lifetime.cpp @@ -16,6 +16,7 @@ #include "driver/cl_options.h" #include "gen/irstate.h" +#include "gen/llvm.h" #include #include @@ -30,8 +31,8 @@ static llvm::cl::opt fEmitLocalVarLifetime( LocalVariableLifetimeAnnotator::LocalVariableLifetimeAnnotator(IRState &irs) : irs(irs) { allocaType = - llvm::Type::getInt8Ty(irs.context()) - ->getPointerTo(irs.module.getDataLayout().getAllocaAddrSpace()); + LLPointerType::get(LLType::getInt8Ty(irs.context()), + irs.module.getDataLayout().getAllocaAddrSpace()); } void LocalVariableLifetimeAnnotator::pushScope() { scopes.emplace_back(); } diff --git a/ir/irtypefunction.cpp b/ir/irtypefunction.cpp index 93629b2acfa..85eaed2e4fd 100644 --- a/ir/irtypefunction.cpp +++ b/ir/irtypefunction.cpp @@ -55,7 +55,7 @@ IrTypeDelegate *IrTypeDelegate::get(Type *t) { IrFuncTy irFty(tf); llvm::Type *ltf = DtoFunctionType(tf, irFty, nullptr, pointerTo(Type::tvoid)); - llvm::Type *fptr = ltf->getPointerTo(gDataLayout->getProgramAddressSpace()); + llvm::Type *fptr = LLPointerType::get(ltf, gDataLayout->getProgramAddressSpace()); llvm::Type *types[] = {getOpaquePtrType(), fptr}; LLStructType *lt = LLStructType::get(gIR->context(), types, false); diff --git a/ir/irtypestruct.cpp b/ir/irtypestruct.cpp index fba984498a1..4ce3041224a 100644 --- a/ir/irtypestruct.cpp +++ b/ir/irtypestruct.cpp @@ -80,7 +80,7 @@ IrTypeStruct *IrTypeStruct::get(StructDeclaration *sd) { int realAS = gIR->dcomputetarget->mapping[p->addrspace]; llvm::SmallVector body; - body.push_back(DtoMemType(p->type)->getPointerTo(realAS)); + body.push_back(LLPointerType::get(DtoMemType(p->type), realAS)); isaStruct(t->type)->setBody(body, false); VarGEPIndices v; From 9cd04079e3ac045b698a0af3ab98d90c9dafbd82 Mon Sep 17 00:00:00 2001 From: liushuyu Date: Tue, 4 Feb 2025 17:45:03 -0700 Subject: [PATCH 2/8] tree-wide: shuffle headers around --- driver/cl_options_sanitizers.h | 4 ++++ gen/optimizer.cpp | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/driver/cl_options_sanitizers.h b/driver/cl_options_sanitizers.h index 16b38f70c8f..e1eaa3c9349 100644 --- a/driver/cl_options_sanitizers.h +++ b/driver/cl_options_sanitizers.h @@ -14,7 +14,11 @@ #pragma once #include "driver/cl_helpers.h" +#if LDC_LLVM_VER >= 2000 +#include "llvm/Transforms/Utils/Instrumentation.h" +#else #include "llvm/Transforms/Instrumentation.h" +#endif class FuncDeclaration; namespace llvm { diff --git a/gen/optimizer.cpp b/gen/optimizer.cpp index 27d4026e2d8..16152fd90a7 100644 --- a/gen/optimizer.cpp +++ b/gen/optimizer.cpp @@ -52,7 +52,11 @@ #include "llvm/LinkAllPasses.h" #include "llvm/Support/CommandLine.h" #include "llvm/Target/TargetMachine.h" +#if LDC_LLVM_VER >= 2000 +#include "llvm/Transforms/Utils/Instrumentation.h" +#else #include "llvm/Transforms/Instrumentation.h" +#endif #include "llvm/Transforms/IPO.h" #if LDC_LLVM_VER < 1700 #include "llvm/Transforms/IPO/PassManagerBuilder.h" From 3e3190603e1465417e19577ae243fc0e23acf54b Mon Sep 17 00:00:00 2001 From: liushuyu Date: Tue, 4 Feb 2025 17:45:35 -0700 Subject: [PATCH 3/8] gen/llvm.h: adapt GET_INTRINSIC_DECL macro to LLVM 20 API --- gen/llvm.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/gen/llvm.h b/gen/llvm.h index 5dfe68e9e95..45f051aa93a 100644 --- a/gen/llvm.h +++ b/gen/llvm.h @@ -35,7 +35,10 @@ using llvm::APFloat; using llvm::APInt; using llvm::IRBuilder; -#if LDC_LLVM_VER >= 1900 +#if LDC_LLVM_VER >= 2000 +#define GET_INTRINSIC_DECL(_X, _TY) \ + (llvm::Intrinsic::getOrInsertDeclaration(&gIR->module, llvm::Intrinsic::_X, _TY)) +#elif LDC_LLVM_VER >= 1900 #define GET_INTRINSIC_DECL(_X, _TY) \ (llvm::Intrinsic::getDeclaration(&gIR->module, llvm::Intrinsic::_X, _TY)) #else From 147170ef46509881c9fdecdff5c2e3ab2619b826 Mon Sep 17 00:00:00 2001 From: liushuyu Date: Tue, 4 Feb 2025 17:48:49 -0700 Subject: [PATCH 4/8] utils/gen_gccbuiltins.cpp: mark most variables as const This is now required by LLVM API starting from LLVM 20 --- utils/gen_gccbuiltins.cpp | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/utils/gen_gccbuiltins.cpp b/utils/gen_gccbuiltins.cpp index e483abbe26e..01a86ee8b3e 100644 --- a/utils/gen_gccbuiltins.cpp +++ b/utils/gen_gccbuiltins.cpp @@ -31,9 +31,15 @@ using namespace llvm; #define BUILTIN_NAME_STRING "ClangBuiltinName" -string dtype(Record* rec, bool readOnlyMem) +#if LDC_LLVM_VER >= 2000 +#define LLVM_20_CONST const +#else +#define LLVM_20_CONST +#endif + +string dtype(LLVM_20_CONST Record* rec, bool readOnlyMem) { - Init* typeInit = rec->getValueInit("VT"); + LLVM_20_CONST Init* typeInit = rec->getValueInit("VT"); if(!typeInit) return ""; @@ -72,7 +78,7 @@ string dtype(Record* rec, bool readOnlyMem) return ""; } -StringRef attributes(ListInit* propertyList) +StringRef attributes(LLVM_20_CONST ListInit* propertyList) { const auto prop = propertyList->size() ? propertyList->getElementAsRecord(0)->getName() @@ -100,13 +106,13 @@ void processRecord(raw_ostream& os, Record& rec, string arch) replace(name.begin(), name.end(), '_', '.'); name = string("llvm.") + name; - ListInit* propsList = rec.getValueAsListInit("IntrProperties"); + LLVM_20_CONST ListInit* propsList = rec.getValueAsListInit("IntrProperties"); const StringRef prop = propsList->size() ? propsList->getElementAsRecord(0)->getName() : ""; bool readOnlyMem = prop == "IntrReadArgMem" || prop == "IntrReadMem"; - ListInit* paramsList = rec.getValueAsListInit("ParamTypes"); + LLVM_20_CONST ListInit* paramsList = rec.getValueAsListInit("ParamTypes"); vector params; for(unsigned int i = 0; i < paramsList->size(); i++) { @@ -117,7 +123,7 @@ void processRecord(raw_ostream& os, Record& rec, string arch) params.push_back(t); } - ListInit* retList = rec.getValueAsListInit("RetTypes"); + LLVM_20_CONST ListInit* retList = rec.getValueAsListInit("RetTypes"); string ret; size_t sz = retList->size(); if(sz == 0) @@ -145,7 +151,7 @@ void processRecord(raw_ostream& os, Record& rec, string arch) std::string arch; -bool emit(raw_ostream& os, RecordKeeper& records) +bool emit(raw_ostream& os, LLVM_20_CONST RecordKeeper& records) { os << "module ldc.gccbuiltins_"; os << arch; From df2b7f447628a7862b84ce4b12c8445f15ae997f Mon Sep 17 00:00:00 2001 From: liushuyu Date: Tue, 4 Feb 2025 18:01:07 -0700 Subject: [PATCH 5/8] gen/classes.cpp: suppress unused variable warning --- gen/classes.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gen/classes.cpp b/gen/classes.cpp index 6fe9612d9ab..832ef2398fd 100644 --- a/gen/classes.cpp +++ b/gen/classes.cpp @@ -382,7 +382,7 @@ DValue *DtoDynamicCastObject(Loc loc, DValue *val, Type *_to) { // Object _d_dynamic_cast(Object o, ClassInfo c) llvm::Function *func = getRuntimeFunction(loc, gIR->module, "_d_dynamic_cast"); - LLFunctionType *funcTy = func->getFunctionType(); + [[maybe_unused]] LLFunctionType *funcTy = func->getFunctionType(); // Object o LLValue *obj = DtoRVal(val); From 5f883c7c3180acf615f8e091df6648acfd3ca3dc Mon Sep 17 00:00:00 2001 From: liushuyu Date: Tue, 4 Feb 2025 18:03:56 -0700 Subject: [PATCH 6/8] gen/optimizer.cpp: add the new LTO parameter everywhere --- gen/optimizer.cpp | 76 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 60 insertions(+), 16 deletions(-) diff --git a/gen/optimizer.cpp b/gen/optimizer.cpp index 16152fd90a7..2159a7464e3 100644 --- a/gen/optimizer.cpp +++ b/gen/optimizer.cpp @@ -211,7 +211,12 @@ static OptimizationLevel getOptimizationLevel(){ #ifndef IN_JITRT static void addAddressSanitizerPasses(ModulePassManager &mpm, - OptimizationLevel level ) { + OptimizationLevel level +#if LDC_LLVM_VER >= 2000 + , + ThinOrFullLTOPhase +#endif +) { AddressSanitizerOptions aso; aso.CompileKernel = false; aso.Recover = opts::isSanitizerRecoveryEnabled(opts::AddressSanitizer); @@ -254,13 +259,23 @@ static void addMemorySanitizerPass(ModulePassManager &mpm, } } static void addThreadSanitizerPass(ModulePassManager &mpm, - OptimizationLevel level ) { + OptimizationLevel level +#if LDC_LLVM_VER >= 2000 + , + ThinOrFullLTOPhase +#endif +) { mpm.addPass(ModuleThreadSanitizerPass()); mpm.addPass(createModuleToFunctionPassAdaptor(ThreadSanitizerPass())); } static void addSanitizerCoveragePass(ModulePassManager &mpm, - OptimizationLevel level ) { + OptimizationLevel level +#if LDC_LLVM_VER >= 2000 + , + ThinOrFullLTOPhase +#endif +) { #if LDC_LLVM_VER >= 1600 mpm.addPass(SanitizerCoveragePass( opts::getSanitizerCoverageOptions())); @@ -270,8 +285,7 @@ static void addSanitizerCoveragePass(ModulePassManager &mpm, #endif } // Adds PGO instrumentation generation and use passes. -static void addPGOPasses(ModulePassManager &mpm, - OptimizationLevel level ) { +static void addPGOPasses(ModulePassManager &mpm, OptimizationLevel level) { if (opts::isInstrumentingForASTBasedPGO()) { InstrProfOptions options; options.NoRedZone = global.params.disableRedZone; @@ -295,8 +309,12 @@ static void addPGOPasses(ModulePassManager &mpm, #endif // !IN_JITRT static void addStripExternalsPass(ModulePassManager &mpm, - OptimizationLevel level ) { - + OptimizationLevel level +#if LDC_LLVM_VER >= 2000 + , + ThinOrFullLTOPhase +#endif +) { if (level == OptimizationLevel::O1 || level == OptimizationLevel::O2 || level == OptimizationLevel::O3) { mpm.addPass(StripExternalsPass()); @@ -308,7 +326,12 @@ static void addStripExternalsPass(ModulePassManager &mpm, } static void addSimplifyDRuntimeCallsPass(ModulePassManager &mpm, - OptimizationLevel level ) { + OptimizationLevel level +#if LDC_LLVM_VER >= 2000 + , + ThinOrFullLTOPhase +#endif +) { if (level == OptimizationLevel::O2 || level == OptimizationLevel::O3) { mpm.addPass(createModuleToFunctionPassAdaptor(SimplifyDRuntimeCallsPass())); if (verifyEach) { @@ -318,7 +341,12 @@ static void addSimplifyDRuntimeCallsPass(ModulePassManager &mpm, } static void addGarbageCollect2StackPass(ModulePassManager &mpm, - OptimizationLevel level ) { + OptimizationLevel level +#if LDC_LLVM_VER >= 2000 + , + ThinOrFullLTOPhase +#endif +) { if (level == OptimizationLevel::O2 || level == OptimizationLevel::O3) { mpm.addPass(createModuleToFunctionPassAdaptor(GarbageCollect2StackPass())); if (verifyEach) { @@ -461,10 +489,11 @@ void runOptimizationPasses(llvm::Module *M, llvm::TargetMachine *TM) { ModulePassManager mpm; if (!noVerify) { - pb.registerPipelineStartEPCallback([&](ModulePassManager &mpm, - OptimizationLevel level) { - mpm.addPass(VerifierPass()); - }); + pb.registerPipelineStartEPCallback( + [&](ModulePassManager &mpm, OptimizationLevel level, + ThinOrFullLTOPhase phase = ThinOrFullLTOPhase::None) { + mpm.addPass(VerifierPass()); + }); } // TODO: port over strip-debuginfos pass for -strip-debug @@ -478,7 +507,8 @@ void runOptimizationPasses(llvm::Module *M, llvm::TargetMachine *TM) { if (opts::isSanitizerEnabled(opts::MemorySanitizer)) { pb.registerOptimizerLastEPCallback( - [&](ModulePassManager &mpm, OptimizationLevel level) { + [&](ModulePassManager &mpm, OptimizationLevel level, + ThinOrFullLTOPhase phase = ThinOrFullLTOPhase::None) { FunctionPassManager fpm; addMemorySanitizerPass(mpm, fpm, level); mpm.addPass(createModuleToFunctionPassAdaptor(std::move(fpm))); @@ -527,9 +557,23 @@ void runOptimizationPasses(llvm::Module *M, llvm::TargetMachine *TM) { if (optLevelVal == 0) { #ifdef IN_JITRT - mpm = pb.buildO0DefaultPipeline(level, false); +#if LDC_LLVM_VER >= 2000 + const ThinOrFullLTOPhase ltoPrelink = ThinOrFullLTOPhase::None; +#else + const bool ltoPrelink = false; +#endif // LDC_LLVM_VER >= 2000 + mpm = pb.buildO0DefaultPipeline(level, ltoPrelink); +#else +#if LDC_LLVM_VER >= 2000 + const ThinOrFullLTOPhase ltoPrelink = + opts::isUsingLTO() + ? (opts::isUsingThinLTO() ? ThinOrFullLTOPhase::ThinLTOPreLink + : ThinOrFullLTOPhase::FullLTOPreLink) + : ThinOrFullLTOPhase::None; #else - mpm = pb.buildO0DefaultPipeline(level, opts::isUsingLTO()); + const bool ltoPrelink = opts::isUsingLTO(); +#endif // LDC_LLVM_VER >= 2000 + mpm = pb.buildO0DefaultPipeline(level, ltoPrelink); #if LDC_LLVM_VER >= 1700 } else if (opts::ltoFatObjects && opts::isUsingLTO()) { mpm = pb.buildFatLTODefaultPipeline(level, From fd37f7bcc2ce44201b16ce949580997f83a9f72b Mon Sep 17 00:00:00 2001 From: liushuyu Date: Sat, 15 Feb 2025 01:02:02 -0700 Subject: [PATCH 7/8] gen/dibuilder.cpp: adapt to API changes --- gen/dibuilder.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/gen/dibuilder.cpp b/gen/dibuilder.cpp index a6137084173..3e0b5f8e952 100644 --- a/gen/dibuilder.cpp +++ b/gen/dibuilder.cpp @@ -753,7 +753,11 @@ DISubroutineType DIBuilder::CreateFunctionType(Type *type, if (pointeeType) { DIType ditype = DBuilder.createReferenceType( llvm::dwarf::DW_TAG_pointer_type, pointeeType, target.ptrsize * 8); - ditype = DBuilder.createObjectPointerType(ditype); + ditype = DBuilder.createObjectPointerType(ditype +#if LDC_LLVM_VER >= 2000 + , /* Implicit */ true +#endif + ); params.emplace_back(ditype); } } From 37b4ce70f9e4a9867b2f9b47ddb31f70ed4811b3 Mon Sep 17 00:00:00 2001 From: liushuyu Date: Sat, 15 Feb 2025 01:02:25 -0700 Subject: [PATCH 8/8] jit-rt: adapt to LLVM 20 header changes --- runtime/jit-rt/cpp-so/jit_context.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/runtime/jit-rt/cpp-so/jit_context.cpp b/runtime/jit-rt/cpp-so/jit_context.cpp index 8e6dc15d15c..88dcac4d0e4 100644 --- a/runtime/jit-rt/cpp-so/jit_context.cpp +++ b/runtime/jit-rt/cpp-so/jit_context.cpp @@ -18,6 +18,9 @@ #include "llvm/ADT/StringExtras.h" #include "llvm/ExecutionEngine/JITLink/EHFrameSupport.h" +#if LDC_LLVM_VER >= 2000 && defined(LDC_JITRT_USE_JITLINK) +#include "llvm/ExecutionEngine/Orc/EHFrameRegistrationPlugin.h" +#endif #include "llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h" #include "llvm/ExecutionEngine/Orc/ObjectTransformLayer.h" #include "llvm/IR/LLVMContext.h"