diff --git a/doc/src/devdocs/llvm.md b/doc/src/devdocs/llvm.md index 5659d79ada24c..e3b0bfe48299c 100644 --- a/doc/src/devdocs/llvm.md +++ b/doc/src/devdocs/llvm.md @@ -79,7 +79,7 @@ environment. In addition, it exposes the `-julia` meta-pass, which runs the entire Julia pass-pipeline over the IR. As an example, to generate a system image, one could do: ``` -opt -load libjulia-internal.so -julia -o opt.bc unopt.bc +opt -enable-new-pm=0 -load libjulia-internal.so -julia -o opt.bc unopt.bc llc -o sys.o opt.bc cc -shared -o sys.so sys.o ``` diff --git a/src/abi_aarch64.cpp b/src/abi_aarch64.cpp index 3e6b995f07b1e..1a3f160329c6c 100644 --- a/src/abi_aarch64.cpp +++ b/src/abi_aarch64.cpp @@ -187,7 +187,7 @@ Type *isHFAorHVA(jl_datatype_t *dt, size_t &nele, LLVMContext &ctx) const return NULL; } -bool needPassByRef(jl_datatype_t *dt, AttrBuilder &ab, LLVMContext &ctx) override +bool needPassByRef(jl_datatype_t *dt, AttrBuilder &ab, LLVMContext &ctx, Type *Ty) override { // B.2 // If the argument type is an HFA or an HVA, then the argument is used diff --git a/src/abi_arm.cpp b/src/abi_arm.cpp index 032943abd45f0..4987d07657ae6 100644 --- a/src/abi_arm.cpp +++ b/src/abi_arm.cpp @@ -23,7 +23,7 @@ struct ABI_ARMLayout : AbiLayout { -bool needPassByRef(jl_datatype_t *dt, AttrBuilder &abi, LLVMContext &ctx) override +bool needPassByRef(jl_datatype_t *dt, AttrBuilder &abi, LLVMContext &ctx, Type *Ty) override { return false; } diff --git a/src/abi_llvm.cpp b/src/abi_llvm.cpp index f21edeadee03a..181b05ef79979 100644 --- a/src/abi_llvm.cpp +++ b/src/abi_llvm.cpp @@ -45,7 +45,7 @@ bool use_sret(jl_datatype_t *ty, LLVMContext &ctx) override return false; } -bool needPassByRef(jl_datatype_t *ty, AttrBuilder &ab, LLVMContext &ctx) override +bool needPassByRef(jl_datatype_t *ty, AttrBuilder &ab, LLVMContext &ctx, Type *Ty) override { return false; } diff --git a/src/abi_ppc64le.cpp b/src/abi_ppc64le.cpp index da1d8484a0823..a35223c8dde32 100644 --- a/src/abi_ppc64le.cpp +++ b/src/abi_ppc64le.cpp @@ -101,12 +101,16 @@ bool use_sret(jl_datatype_t *dt, LLVMContext &ctx) override return false; } -bool needPassByRef(jl_datatype_t *dt, AttrBuilder &ab, LLVMContext &ctx) override +bool needPassByRef(jl_datatype_t *dt, AttrBuilder &ab, LLVMContext &ctx, Type *Ty) override { jl_datatype_t *ty0 = NULL; bool hva = false; if (jl_datatype_size(dt) > 64 && isHFA(dt, &ty0, &hva) > 8) { +#if JL_LLVM_VERSION < 120000 ab.addAttribute(Attribute::ByVal); +#else + ab.addByValAttr(Ty); +#endif return true; } return false; diff --git a/src/abi_win32.cpp b/src/abi_win32.cpp index a25fcaec9b82a..fa1cfe2225427 100644 --- a/src/abi_win32.cpp +++ b/src/abi_win32.cpp @@ -49,11 +49,15 @@ bool use_sret(jl_datatype_t *dt, LLVMContext &ctx) override return true; } -bool needPassByRef(jl_datatype_t *dt, AttrBuilder &ab, LLVMContext &ctx) override +bool needPassByRef(jl_datatype_t *dt, AttrBuilder &ab, LLVMContext &ctx, Type *Ty) override { // Use pass by reference for all structs if (dt->layout->nfields > 0) { +#if JL_LLVM_VERSION < 120000 ab.addAttribute(Attribute::ByVal); +#else + ab.addByValAttr(Ty); +#endif return true; } return false; diff --git a/src/abi_win64.cpp b/src/abi_win64.cpp index 6f6d407cfc10d..c87e3434f1c1f 100644 --- a/src/abi_win64.cpp +++ b/src/abi_win64.cpp @@ -56,14 +56,19 @@ bool use_sret(jl_datatype_t *dt, LLVMContext &ctx) override return true; } -bool needPassByRef(jl_datatype_t *dt, AttrBuilder &ab, LLVMContext &ctx) override +bool needPassByRef(jl_datatype_t *dt, AttrBuilder &ab, LLVMContext &ctx, Type *Ty) override { nargs++; size_t size = jl_datatype_size(dt); if (win64_reg_size(size)) return false; - if (nargs <= 4) + if (nargs <= 4) { +#if JL_LLVM_VERSION < 120000 ab.addAttribute(Attribute::ByVal); +#else + ab.addByValAttr(Ty); +#endif + } return true; } diff --git a/src/abi_x86.cpp b/src/abi_x86.cpp index c68e657695f3c..3c4617c5a3c1d 100644 --- a/src/abi_x86.cpp +++ b/src/abi_x86.cpp @@ -67,12 +67,16 @@ bool use_sret(jl_datatype_t *dt, LLVMContext &ctx) override return true; } -bool needPassByRef(jl_datatype_t *dt, AttrBuilder &ab, LLVMContext &ctx) override +bool needPassByRef(jl_datatype_t *dt, AttrBuilder &ab, LLVMContext &ctx, Type *Ty) override { size_t size = jl_datatype_size(dt); if (is_complex64(dt) || is_complex128(dt) || (jl_is_primitivetype(dt) && size <= 8)) return false; - ab.addAttribute(Attribute::ByVal); +#if JL_LLVM_VERSION < 120000 + ab.addAttribute(Attribute::ByVal); +#else + ab.addByValAttr(Ty); +#endif return true; } diff --git a/src/abi_x86_64.cpp b/src/abi_x86_64.cpp index 898e98dfcc262..e5beffce39b0d 100644 --- a/src/abi_x86_64.cpp +++ b/src/abi_x86_64.cpp @@ -178,11 +178,15 @@ bool use_sret(jl_datatype_t *dt, LLVMContext &ctx) override return sret; } -bool needPassByRef(jl_datatype_t *dt, AttrBuilder &ab, LLVMContext &ctx) override +bool needPassByRef(jl_datatype_t *dt, AttrBuilder &ab, LLVMContext &ctx, Type *Ty) override { Classification cl = classify(dt); if (cl.isMemory) { +#if JL_LLVM_VERSION < 120000 ab.addAttribute(Attribute::ByVal); +#else + ab.addByValAttr(Ty); +#endif return true; } @@ -202,7 +206,12 @@ bool needPassByRef(jl_datatype_t *dt, AttrBuilder &ab, LLVMContext &ctx) overrid else if (jl_is_structtype(dt)) { // spill to memory even though we would ordinarily pass // it in registers +#if JL_LLVM_VERSION < 120000 ab.addAttribute(Attribute::ByVal); +#else + Type* Ty = preferred_llvm_type(dt, false, ctx); + ab.addByValAttr(Ty); +#endif return true; } return false; diff --git a/src/aotcompile.cpp b/src/aotcompile.cpp index e18b40240cb25..ad705e96b0da2 100644 --- a/src/aotcompile.cpp +++ b/src/aotcompile.cpp @@ -550,6 +550,10 @@ void jl_dump_native_impl(void *native_code, std::unique_ptr sysimage(new Module("sysimage", Context)); sysimage->setTargetTriple(data->M->getTargetTriple()); sysimage->setDataLayout(data->M->getDataLayout()); +#if JL_LLVM_VERSION >= 130000 + sysimage->setStackProtectorGuard(data->M->getStackProtectorGuard()); + sysimage->setOverrideStackAlignment(data->M->getOverrideStackAlignment()); +#endif data->M.reset(); // free memory for data->M if (sysimg_data) { diff --git a/src/ccall.cpp b/src/ccall.cpp index 426abf6b7dcb1..647735edb37d8 100644 --- a/src/ccall.cpp +++ b/src/ccall.cpp @@ -288,7 +288,7 @@ class AbiLayout { public: virtual ~AbiLayout() {} virtual bool use_sret(jl_datatype_t *ty, LLVMContext &ctx) = 0; - virtual bool needPassByRef(jl_datatype_t *ty, AttrBuilder&, LLVMContext &ctx) = 0; + virtual bool needPassByRef(jl_datatype_t *ty, AttrBuilder&, LLVMContext &ctx, Type* llvm_t) = 0; virtual Type *preferred_llvm_type(jl_datatype_t *ty, bool isret, LLVMContext &ctx) const = 0; }; @@ -891,6 +891,10 @@ static jl_cgval_t emit_llvmcall(jl_codectx_t &ctx, jl_value_t **args, size_t nar // copy module properties that should always match Mod->setTargetTriple(jl_Module->getTargetTriple()); Mod->setDataLayout(jl_Module->getDataLayout()); +#if JL_LLVM_VERSION >= 130000 + Mod->setStackProtectorGuard(jl_Module->getStackProtectorGuard()); + Mod->setOverrideStackAlignment(jl_Module->getOverrideStackAlignment()); +#endif // verify the definition Function *def = Mod->getFunction(ir_name); @@ -1086,7 +1090,7 @@ std::string generate_func_sig(const char *fname) } // Whether or not LLVM wants us to emit a pointer to the data - bool byRef = abi->needPassByRef((jl_datatype_t*)tti, ab, jl_LLVMContext); + bool byRef = abi->needPassByRef((jl_datatype_t*)tti, ab, jl_LLVMContext, t); if (jl_is_cpointer_type(tti)) { pat = t; diff --git a/src/codegen.cpp b/src/codegen.cpp index 2ed36f21fa1e2..249a761d1ef0c 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -144,7 +144,7 @@ extern JITEventListener *CreateJuliaJITEventListener(); bool imaging_mode = false; // shared llvm state -JL_DLLEXPORT LLVMContext &jl_LLVMContext = *(new LLVMContext()); +static LLVMContext &jl_LLVMContext = *(new LLVMContext()); TargetMachine *jl_TargetMachine; static DataLayout &jl_data_layout = *(new DataLayout("")); #define jl_Module ctx.f->getParent() @@ -1707,6 +1707,16 @@ static void jl_setup_module(Module *m, const jl_cgparams_t *params = &jl_default llvm::DEBUG_METADATA_VERSION); m->setDataLayout(jl_data_layout); m->setTargetTriple(jl_TargetMachine->getTargetTriple().str()); + +#if defined(_OS_WINDOWS_) && !defined(_CPU_X86_64_) && JL_LLVM_VERSION >= 130000 + // tell Win32 to assume the stack is always 16-byte aligned, + // and to ensure that it is 16-byte aligned for out-going calls, + // to ensure compatibility with GCC codes + m->setOverrideStackAlignment(16); +#endif +#if defined(JL_DEBUG_BUILD) && JL_LLVM_VERSION >= 130000 + m->setStackProtectorGuard("global"); +#endif } Module *jl_create_llvm_module(StringRef name) @@ -4780,7 +4790,7 @@ static Value *get_current_task(jl_codectx_t &ctx) // Get PTLS through current task. static Value *get_current_ptls(jl_codectx_t &ctx) { - return get_current_ptls_from_task(ctx.builder, get_current_task(ctx)); + return get_current_ptls_from_task(ctx.builder, get_current_task(ctx), tbaa_gcframe); } // Store world age at the entry block of the function. This function should be @@ -7679,7 +7689,7 @@ void jl_compile_workqueue( // --- initialization --- -std::pair tbaa_make_child(const char *name, MDNode *parent=nullptr, bool isConstant=false) +static std::pair tbaa_make_child(const char *name, MDNode *parent=nullptr, bool isConstant=false) { MDBuilder mbuilder(jl_LLVMContext); if (tbaa_root == nullptr) { @@ -8033,13 +8043,14 @@ extern "C" void jl_init_llvm(void) TargetOptions options = TargetOptions(); //options.PrintMachineCode = true; //Print machine code produced during JIT compiling -#if defined(_OS_WINDOWS_) && !defined(_CPU_X86_64_) +#if defined(_OS_WINDOWS_) && !defined(_CPU_X86_64_) && JL_LLVM_VERSION < 130000 // tell Win32 to assume the stack is always 16-byte aligned, // and to ensure that it is 16-byte aligned for out-going calls, // to ensure compatibility with GCC codes + // In LLVM 13 and onwards this has turned into a module option options.StackAlignmentOverride = 16; #endif -#ifdef JL_DEBUG_BUILD +#if defined(JL_DEBUG_BUILD) && JL_LLVM_VERSION < 130000 // LLVM defaults to tls stack guard, which causes issues with Julia's tls implementation options.StackProtectorGuard = StackProtectorGuards::Global; #endif diff --git a/src/codegen_shared.h b/src/codegen_shared.h index 93c913fd7a766..883d804a20911 100644 --- a/src/codegen_shared.h +++ b/src/codegen_shared.h @@ -99,9 +99,6 @@ static inline std::pair tbaa_make_child_with_contex return std::make_pair(n, scalar); } -static inline llvm::MDNode *get_tbaa_gcframe(llvm::LLVMContext &ctxt) { - return tbaa_make_child_with_context(ctxt, "jtbaa_gcframe").first; -} static inline llvm::MDNode *get_tbaa_const(llvm::LLVMContext &ctxt) { return tbaa_make_child_with_context(ctxt, "jtbaa_const", nullptr, true).first; } @@ -132,7 +129,7 @@ static inline llvm::Value *emit_bitcast_with_builder(llvm::IRBuilder<> &builder, } // Get PTLS through current task. -static inline llvm::Value *get_current_ptls_from_task(llvm::IRBuilder<> &builder, llvm::Value *current_task) +static inline llvm::Value *get_current_ptls_from_task(llvm::IRBuilder<> &builder, llvm::Value *current_task, llvm::MDNode *tbaa) { using namespace llvm; auto T_ppjlvalue = JuliaType::get_ppjlvalue_ty(builder.getContext()); @@ -145,9 +142,9 @@ static inline llvm::Value *get_current_ptls_from_task(llvm::IRBuilder<> &builder LoadInst *ptls_load = builder.CreateAlignedLoad( emit_bitcast_with_builder(builder, pptls, T_ppjlvalue), Align(sizeof(void *)), "ptls_load"); // Note: Corresponding store (`t->ptls = ptls`) happens in `ctx_switch` of tasks.c. - tbaa_decorate(get_tbaa_gcframe(builder.getContext()), ptls_load); + tbaa_decorate(tbaa, ptls_load); // Using `CastInst::Create` to get an `Instruction*` without explicit cast: auto ptls = CastInst::Create(Instruction::BitCast, ptls_load, T_ppjlvalue, "ptls"); builder.Insert(ptls); return ptls; -} \ No newline at end of file +} diff --git a/src/debuginfo.cpp b/src/debuginfo.cpp index 956559c179985..e7863d5aab34f 100644 --- a/src/debuginfo.cpp +++ b/src/debuginfo.cpp @@ -177,13 +177,6 @@ struct revcomp { { return lhs>rhs; } }; -struct strrefcomp { - bool operator() (const StringRef& lhs, const StringRef& rhs) const - { - return lhs.compare(rhs) > 0; - } -}; - class JuliaJITEventListener: public JITEventListener { std::map objectmap; @@ -234,11 +227,13 @@ class JuliaJITEventListener: public JITEventListener SavedObject.second.release(); object::section_iterator EndSection = debugObj.section_end(); - std::map loadedSections; + StringMap loadedSections; for (const object::SectionRef &lSection: Object.sections()) { auto sName = lSection.getName(); - if (sName) - loadedSections[*sName] = lSection; + if (sName) { + bool inserted = loadedSections.insert(std::make_pair(*sName, lSection)).second; + assert(inserted); (void)inserted; + } } auto getLoadAddress = [&] (const StringRef &sName) -> uint64_t { auto search = loadedSections.find(sName); diff --git a/src/disasm.cpp b/src/disasm.cpp index 73b394b77d0b2..25e7841bde85a 100644 --- a/src/disasm.cpp +++ b/src/disasm.cpp @@ -860,21 +860,21 @@ static void jl_dump_asm_internal( std::unique_ptr MRI(TheTarget->createMCRegInfo(TheTriple.str())); assert(MRI && "Unable to create target register info!"); - std::unique_ptr MOFI(new MCObjectFileInfo()); -#if JL_LLVM_VERSION >= 130000 - MCSubtargetInfo *MSTI = TheTarget->createMCSubtargetInfo(TheTriple.str(), cpu, features); - assert(MSTI && "Unable to create subtarget info!"); + std::unique_ptr STI( + TheTarget->createMCSubtargetInfo(TheTriple.str(), cpu, features)); + assert(STI && "Unable to create subtarget info!"); - MCContext Ctx(TheTriple, MAI.get(), MRI.get(), MSTI, &SrcMgr); - MOFI->initMCObjectFileInfo(Ctx, /* PIC */ false, /* LargeCodeModel */ false); +#if JL_LLVM_VERSION >= 130000 + MCContext Ctx(TheTriple, MAI.get(), MRI.get(), STI.get(), &SrcMgr); + std::unique_ptr MOFI( + TheTarget->createMCObjectFileInfo(Ctx, /*PIC=*/false, /*LargeCodeModel=*/ false)); + Ctx.setObjectFileInfo(MOFI.get()); #else + std::unique_ptr MOFI(new MCObjectFileInfo()); MCContext Ctx(MAI.get(), MRI.get(), MOFI.get(), &SrcMgr); MOFI->InitMCObjectFileInfo(TheTriple, /* PIC */ false, Ctx); #endif - // Set up Subtarget and Disassembler - std::unique_ptr - STI(TheTarget->createMCSubtargetInfo(TheTriple.str(), cpu, features)); std::unique_ptr DisAsm(TheTarget->createMCDisassembler(*STI, Ctx)); if (!DisAsm) { rstream << "ERROR: no disassembler for target " << TheTriple.str(); diff --git a/src/jitlayers.cpp b/src/jitlayers.cpp index 886887f1d329d..c6a3de4f4ad84 100644 --- a/src/jitlayers.cpp +++ b/src/jitlayers.cpp @@ -1045,7 +1045,7 @@ static void jl_add_to_ee(std::unique_ptr m) ConstantAggregateZero::get(atype), "__catchjmp") }; gvs[0]->setSection(".text"); gvs[1]->setSection(".text"); - appendToUsed(*m, makeArrayRef((GlobalValue**)gvs, 2)); + appendToCompilerUsed(*m, makeArrayRef((GlobalValue**)gvs, 2)); #endif jl_jit_share_data(*m); assert(jl_ExecutionEngine); diff --git a/src/llvm-late-gc-lowering.cpp b/src/llvm-late-gc-lowering.cpp index ed5fe7c43a598..533ea8f5b145e 100644 --- a/src/llvm-late-gc-lowering.cpp +++ b/src/llvm-late-gc-lowering.cpp @@ -616,7 +616,7 @@ std::vector LateLowerGCFrame::MaybeExtractVector(State &S, Value *BaseVe std::vector V{Numbers.size()}; Value *V_rnull = ConstantPointerNull::get(cast(T_prjlvalue)); for (unsigned i = 0; i < V.size(); ++i) { - if (Numbers[i] >= 0) + if (Numbers[i] >= 0) // ignores undef and poison values V[i] = GetPtrForNumber(S, Numbers[i], InsertBefore); else V[i] = V_rnull; @@ -860,8 +860,9 @@ std::vector LateLowerGCFrame::NumberAllBase(State &S, Value *CurrentV) { std::vector Numbers2 = NumberAll(S, SVI->getOperand(1)); auto Mask = SVI->getShuffleMask(); for (auto idx : Mask) { - assert(idx != -1 && "Undef tracked value is invalid"); - if ((unsigned)idx < Numbers1.size()) { + if (idx == -1) { + Numbers.push_back(-1); + } else if ((unsigned)idx < Numbers1.size()) { Numbers.push_back(Numbers1.at(idx)); } else { Numbers.push_back(Numbers2.at(idx - Numbers1.size())); @@ -966,8 +967,9 @@ std::vector LateLowerGCFrame::NumberAll(State &S, Value *V) { Number = Numbers[CurrentV.second]; // only needed a subset of the values Numbers.resize(tracked.count, Number); } - else + else { assert(!isa(V->getType())); + } } if (CurrentV.first != V) { if (isa(V->getType())) { @@ -2296,7 +2298,7 @@ bool LateLowerGCFrame::CleanupIR(Function &F, State *S) { // Create a call to the `julia.gc_alloc_bytes` intrinsic, which is like // `julia.gc_alloc_obj` except it doesn't set the tag. auto allocBytesIntrinsic = getOrDeclare(jl_intrinsics::GCAllocBytes); - auto ptlsLoad = get_current_ptls_from_task(builder, CI->getArgOperand(0)); + auto ptlsLoad = get_current_ptls_from_task(builder, CI->getArgOperand(0), tbaa_gcframe); auto ptls = builder.CreateBitCast(ptlsLoad, Type::getInt8PtrTy(builder.getContext())); auto newI = builder.CreateCall( allocBytesIntrinsic, diff --git a/src/llvm-multiversioning.cpp b/src/llvm-multiversioning.cpp index 7cd50ac144c1a..57e90a9aa8056 100644 --- a/src/llvm-multiversioning.cpp +++ b/src/llvm-multiversioning.cpp @@ -40,14 +40,9 @@ using namespace llvm; -extern std::pair tbaa_make_child(const char *name, MDNode *parent=nullptr, - bool isConstant=false); - extern Optional always_have_fma(Function&); namespace { - -// These are valid detail cloning conditions in the target flags. constexpr uint32_t clone_mask = JL_TARGET_CLONE_LOOP | JL_TARGET_CLONE_SIMD | JL_TARGET_CLONE_MATH | JL_TARGET_CLONE_CPU; @@ -346,7 +341,7 @@ CloneCtx::CloneCtx(MultiVersioning *pass, Module &M) T_int32(Type::getInt32Ty(ctx)), T_void(Type::getVoidTy(ctx)), T_psize(PointerType::get(T_size, 0)), - tbaa_const(tbaa_make_child("jtbaa_const", nullptr, true).first), + tbaa_const(tbaa_make_child_with_context(ctx, "jtbaa_const", nullptr, true).first), pass(pass), specs(jl_get_llvm_clone_targets()), fvars(consume_gv(M, "jl_sysimg_fvars")), diff --git a/src/llvm-pass-helpers.cpp b/src/llvm-pass-helpers.cpp index 89263033ce565..f6708ef65ab77 100644 --- a/src/llvm-pass-helpers.cpp +++ b/src/llvm-pass-helpers.cpp @@ -19,27 +19,31 @@ using namespace llvm; -extern std::pair tbaa_make_child(const char *name, MDNode *parent=nullptr, bool isConstant=false); - JuliaPassContext::JuliaPassContext() : T_size(nullptr), T_int8(nullptr), T_int32(nullptr), T_pint8(nullptr), T_jlvalue(nullptr), T_prjlvalue(nullptr), T_ppjlvalue(nullptr), T_pjlvalue(nullptr), T_pjlvalue_der(nullptr), - T_ppjlvalue_der(nullptr), pgcstack_getter(nullptr), gc_flush_func(nullptr), + T_ppjlvalue_der(nullptr), + + tbaa_gcframe(nullptr), tbaa_tag(nullptr), + + pgcstack_getter(nullptr), gc_flush_func(nullptr), gc_preserve_begin_func(nullptr), gc_preserve_end_func(nullptr), pointer_from_objref_func(nullptr), alloc_obj_func(nullptr), typeof_func(nullptr), write_barrier_func(nullptr), module(nullptr) { - tbaa_gcframe = tbaa_make_child("jtbaa_gcframe").first; - MDNode *tbaa_data; - MDNode *tbaa_data_scalar; - std::tie(tbaa_data, tbaa_data_scalar) = tbaa_make_child("jtbaa_data"); - tbaa_tag = tbaa_make_child("jtbaa_tag", tbaa_data_scalar).first; } void JuliaPassContext::initFunctions(Module &M) { module = &M; + LLVMContext &llvmctx = M.getContext(); + + tbaa_gcframe = tbaa_make_child_with_context(llvmctx, "jtbaa_gcframe").first; + MDNode *tbaa_data; + MDNode *tbaa_data_scalar; + std::tie(tbaa_data, tbaa_data_scalar) = tbaa_make_child_with_context(llvmctx, "jtbaa_data"); + tbaa_tag = tbaa_make_child_with_context(llvmctx, "jtbaa_tag", tbaa_data_scalar).first; pgcstack_getter = M.getFunction("julia.get_pgcstack"); gc_flush_func = M.getFunction("julia.gcroot_flush"); diff --git a/src/llvm-ptls.cpp b/src/llvm-ptls.cpp index c971774f23e6c..a573d41dae326 100644 --- a/src/llvm-ptls.cpp +++ b/src/llvm-ptls.cpp @@ -32,9 +32,6 @@ using namespace llvm; typedef Instruction TerminatorInst; -std::pair tbaa_make_child(const char *name, MDNode *parent=nullptr, - bool isConstant=false); - namespace { struct LowerPTLS: public ModulePass { @@ -264,7 +261,7 @@ bool LowerPTLS::runOnModule(Module &_M) return false; ctx = &M->getContext(); - tbaa_const = tbaa_make_child("jtbaa_const", nullptr, true).first; + tbaa_const = tbaa_make_child_with_context(*ctx, "jtbaa_const", nullptr, true).first; T_int8 = Type::getInt8Ty(*ctx); T_size = sizeof(size_t) == 8 ? Type::getInt64Ty(*ctx) : Type::getInt32Ty(*ctx); diff --git a/test/llvmpasses/alloc-opt-gcframe.jl b/test/llvmpasses/alloc-opt-gcframe.jl index 605ff3d213276..8e3de7645595e 100644 --- a/test/llvmpasses/alloc-opt-gcframe.jl +++ b/test/llvmpasses/alloc-opt-gcframe.jl @@ -1,6 +1,6 @@ # This file is a part of Julia. License is MIT: https://julialang.org/license -# RUN: julia --startup-file=no %s | opt -load libjulia-internal%shlibext -AllocOpt -LateLowerGCFrame -FinalLowerGC -S - | FileCheck %s +# RUN: julia --startup-file=no %s | opt -enable-new-pm=0 -load libjulia-codegen%shlibext -AllocOpt -LateLowerGCFrame -FinalLowerGC -S - | FileCheck %s isz = sizeof(UInt) == 8 ? "i64" : "i32" diff --git a/test/llvmpasses/alloc-opt-pass.jl b/test/llvmpasses/alloc-opt-pass.jl index 8fbc9d2c7b7c4..3f2b09ebabb4a 100644 --- a/test/llvmpasses/alloc-opt-pass.jl +++ b/test/llvmpasses/alloc-opt-pass.jl @@ -1,6 +1,6 @@ # This file is a part of Julia. License is MIT: https://julialang.org/license -# RUN: julia --startup-file=no %s | opt -load libjulia-internal%shlibext -AllocOpt -S - | FileCheck %s +# RUN: julia --startup-file=no %s | opt -enable-new-pm=0 -load libjulia-codegen%shlibext -AllocOpt -S - | FileCheck %s isz = sizeof(UInt) == 8 ? "i64" : "i32" diff --git a/test/llvmpasses/final-lower-gc.ll b/test/llvmpasses/final-lower-gc.ll index 6caf6dead7038..5e4a23770c4e0 100644 --- a/test/llvmpasses/final-lower-gc.ll +++ b/test/llvmpasses/final-lower-gc.ll @@ -1,4 +1,4 @@ -; RUN: opt -load libjulia-internal%shlibext -FinalLowerGC -S %s | FileCheck %s +; RUN: opt -enable-new-pm=0 -load libjulia-codegen%shlibext -FinalLowerGC -S %s | FileCheck %s @tag = external addrspace(10) global {} diff --git a/test/llvmpasses/gcroots.ll b/test/llvmpasses/gcroots.ll index 00ea20e504bee..29cb8683244d1 100644 --- a/test/llvmpasses/gcroots.ll +++ b/test/llvmpasses/gcroots.ll @@ -1,4 +1,4 @@ -; RUN: opt -load libjulia-internal%shlibext -LateLowerGCFrame -FinalLowerGC -S %s | FileCheck %s +; RUN: opt -enable-new-pm=0 -load libjulia-codegen%shlibext -LateLowerGCFrame -FinalLowerGC -S %s | FileCheck %s declare void @boxed_simple({} addrspace(10)*, {} addrspace(10)*) diff --git a/test/llvmpasses/late-lower-gc.ll b/test/llvmpasses/late-lower-gc.ll index 9c3b26385417f..441fce2bbac08 100644 --- a/test/llvmpasses/late-lower-gc.ll +++ b/test/llvmpasses/late-lower-gc.ll @@ -1,4 +1,4 @@ -; RUN: opt -load libjulia-internal%shlibext -LateLowerGCFrame -S %s | FileCheck %s +; RUN: opt -enable-new-pm=0 -load libjulia-codegen%shlibext -LateLowerGCFrame -S %s | FileCheck %s @tag = external addrspace(10) global {}, align 16 @@ -77,11 +77,11 @@ top: %v = call noalias {} addrspace(10)* @julia.gc_alloc_obj({}** %current_task, i64 8, {} addrspace(10)* @tag) ; CHECK-NEXT: %v64 = bitcast {} addrspace(10)* %v to i64 addrspace(10)* %v64 = bitcast {} addrspace(10)* %v to i64 addrspace(10)* -; CHECK-NEXT: %loadedval = load i64, i64 addrspace(10)* %v64, align 8, !range !9 +; CHECK-NEXT: %loadedval = load i64, i64 addrspace(10)* %v64, align 8, !range !7 %loadedval = load i64, i64 addrspace(10)* %v64, align 8, !range !0, !invariant.load !1 -; CHECK-NEXT: store i64 %loadedval, i64 addrspace(10)* %v64, align 8, !noalias !10 +; CHECK-NEXT: store i64 %loadedval, i64 addrspace(10)* %v64, align 8, !noalias !8 store i64 %loadedval, i64 addrspace(10)* %v64, align 8, !noalias !2 -; CHECK-NEXT: %lv2 = load i64, i64 addrspace(10)* %v64, align 8, !tbaa !11, !range !9 +; CHECK-NEXT: %lv2 = load i64, i64 addrspace(10)* %v64, align 8, !tbaa !9, !range !7 %lv2 = load i64, i64 addrspace(10)* %v64, align 8, !range !0, !tbaa !4 ; CHECK-NEXT: ret void ret void @@ -118,8 +118,6 @@ top: ; CHECK-NEXT: !3 = !{!"jtbaa"} ; CHECK-NEXT: !4 = !{!5, !5, i64 0} ; CHECK-NEXT: !5 = !{!"jtbaa_tag", !6, i64 0} -; CHECK-NEXT: !6 = !{!"jtbaa_data", !7, i64 0} -; CHECK-NEXT: !7 = !{!"jtbaa", !8, i64 0} -; CHECK-NEXT: !8 = !{!"jtbaa"} -; CHECK-NEXT: !9 = !{i64 0, i64 23} -; CHECK-NEXT: !10 = distinct !{!10} \ No newline at end of file +; CHECK-NEXT: !6 = !{!"jtbaa_data", !2, i64 0} +; CHECK-NEXT: !7 = !{i64 0, i64 23} +; CHECK-NEXT: !8 = distinct !{!8} diff --git a/test/llvmpasses/loopinfo.jl b/test/llvmpasses/loopinfo.jl index 4df485c0debcb..b1831772a49f6 100644 --- a/test/llvmpasses/loopinfo.jl +++ b/test/llvmpasses/loopinfo.jl @@ -2,7 +2,7 @@ # RUN: julia --startup-file=no %s %t && llvm-link -S %t/* -o %t/module.ll # RUN: cat %t/module.ll | FileCheck %s -# RUN: cat %t/module.ll | opt -load libjulia-internal%shlibext -LowerSIMDLoop -S - | FileCheck %s -check-prefix=LOWER +# RUN: cat %t/module.ll | opt -enable-new-pm=0 -load libjulia-codegen%shlibext -LowerSIMDLoop -S - | FileCheck %s -check-prefix=LOWER # RUN: julia --startup-file=no %s %t -O && llvm-link -S %t/* -o %t/module.ll # RUN: cat %t/module.ll | FileCheck %s -check-prefix=FINAL diff --git a/test/llvmpasses/lower-handlers.ll b/test/llvmpasses/lower-handlers.ll index 4191fa664c6cd..80b6be683c024 100644 --- a/test/llvmpasses/lower-handlers.ll +++ b/test/llvmpasses/lower-handlers.ll @@ -1,4 +1,4 @@ -; RUN: opt -load libjulia-internal%shlibext -LowerExcHandlers -S %s | FileCheck %s +; RUN: opt -enable-new-pm=0 -load libjulia-codegen%shlibext -LowerExcHandlers -S %s | FileCheck %s attributes #1 = { returns_twice } declare i32 @julia.except_enter() #1 diff --git a/test/llvmpasses/muladd.ll b/test/llvmpasses/muladd.ll index ec36f7bd1fa12..42a6bcff96b96 100644 --- a/test/llvmpasses/muladd.ll +++ b/test/llvmpasses/muladd.ll @@ -1,4 +1,4 @@ -; RUN: opt -load libjulia-internal%shlibext -CombineMulAdd -S %s | FileCheck %s +; RUN: opt -enable-new-pm=0 -load libjulia-codegen%shlibext -CombineMulAdd -S %s | FileCheck %s define double @fast_muladd1(double %a, double %b, double %c) { top: diff --git a/test/llvmpasses/propagate-addrspace.ll b/test/llvmpasses/propagate-addrspace.ll index 1c50c54b4dc9a..4fc357e03a7f1 100644 --- a/test/llvmpasses/propagate-addrspace.ll +++ b/test/llvmpasses/propagate-addrspace.ll @@ -1,4 +1,4 @@ -; RUN: opt -load libjulia-internal%shlibext -PropagateJuliaAddrspaces -dce -S %s | FileCheck %s +; RUN: opt -enable-new-pm=0 -load libjulia-codegen%shlibext -PropagateJuliaAddrspaces -dce -S %s | FileCheck %s define i64 @simple() { ; CHECK-LABEL: @simple diff --git a/test/llvmpasses/refinements.ll b/test/llvmpasses/refinements.ll index 40dd020bca260..0da965e538db8 100644 --- a/test/llvmpasses/refinements.ll +++ b/test/llvmpasses/refinements.ll @@ -1,4 +1,4 @@ -; RUN: opt -load libjulia-internal%shlibext -LateLowerGCFrame -FinalLowerGC -S %s | FileCheck %s +; RUN: opt -enable-new-pm=0 -load libjulia-codegen%shlibext -LateLowerGCFrame -FinalLowerGC -S %s | FileCheck %s declare {}*** @julia.ptls_states() diff --git a/test/llvmpasses/remove-addrspaces.ll b/test/llvmpasses/remove-addrspaces.ll index f8b6de024bfdd..80eab21a51467 100644 --- a/test/llvmpasses/remove-addrspaces.ll +++ b/test/llvmpasses/remove-addrspaces.ll @@ -1,4 +1,4 @@ -; RUN: opt -load libjulia-internal%shlibext -RemoveJuliaAddrspaces -S %s | FileCheck %s +; RUN: opt -enable-new-pm=0 -load libjulia-codegen%shlibext -RemoveJuliaAddrspaces -S %s | FileCheck %s define i64 @getindex({} addrspace(10)* nonnull align 16 dereferenceable(40)) { diff --git a/test/llvmpasses/returnstwicegc.ll b/test/llvmpasses/returnstwicegc.ll index da281fe85fd57..ebc6127813876 100644 --- a/test/llvmpasses/returnstwicegc.ll +++ b/test/llvmpasses/returnstwicegc.ll @@ -1,4 +1,4 @@ -; RUN: opt -load libjulia-internal%shlibext -LateLowerGCFrame -FinalLowerGC -S %s | FileCheck %s +; RUN: opt -enable-new-pm=0 -load libjulia-codegen%shlibext -LateLowerGCFrame -FinalLowerGC -S %s | FileCheck %s declare void @boxed_simple({} addrspace(10)*, {} addrspace(10)*) diff --git a/test/llvmpasses/safepoint_stress.jl b/test/llvmpasses/safepoint_stress.jl index c5345ad07e786..7ecf01a194851 100644 --- a/test/llvmpasses/safepoint_stress.jl +++ b/test/llvmpasses/safepoint_stress.jl @@ -1,6 +1,6 @@ # This file is a part of Julia. License is MIT: https://julialang.org/license -# RUN: julia --startup-file=no %s | opt -load libjulia-internal%shlibext -LateLowerGCFrame -FinalLowerGC -S - | FileCheck %s +# RUN: julia --startup-file=no %s | opt -enable-new-pm=0 -load libjulia-codegen%shlibext -LateLowerGCFrame -FinalLowerGC -S - | FileCheck %s println(""" declare {} addrspace(10)* @alloc() diff --git a/test/llvmpasses/simdloop.ll b/test/llvmpasses/simdloop.ll index 469e0699b2d99..ac3c92092b3ce 100644 --- a/test/llvmpasses/simdloop.ll +++ b/test/llvmpasses/simdloop.ll @@ -1,4 +1,4 @@ -; RUN: opt -load libjulia-internal%shlibext -LowerSIMDLoop -S %s | FileCheck %s +; RUN: opt -enable-new-pm=0 -load libjulia-codegen%shlibext -LowerSIMDLoop -S %s | FileCheck %s declare void @julia.loopinfo_marker()