From 527117ea045cf6a8e76a2b33a36b078ebc43a587 Mon Sep 17 00:00:00 2001 From: Valentin Churavy Date: Thu, 27 Apr 2023 10:05:40 -0400 Subject: [PATCH] Fix attributes and opaque pointer usage for LLVM15 (#49528) Co-authored-by: Gabriel Baraldi Co-authored-by: Prem Chintalapudi --- src/cgutils.cpp | 4 ++-- src/codegen.cpp | 25 ++++++++++++++++--------- src/llvm-remove-addrspaces.cpp | 4 ++-- 3 files changed, 20 insertions(+), 13 deletions(-) diff --git a/src/cgutils.cpp b/src/cgutils.cpp index a6d41b9e41214..380c6f7bc0be0 100644 --- a/src/cgutils.cpp +++ b/src/cgutils.cpp @@ -942,10 +942,10 @@ static void emit_memcpy_llvm(jl_codectx_t &ctx, Value *dst, jl_aliasinfo_t const const DataLayout &DL = jl_Module->getDataLayout(); auto srcty = cast(src->getType()); //TODO unsafe nonopaque pointer - auto srcel = srcty->getPointerElementType(); + auto srcel = srcty->getNonOpaquePointerElementType(); auto dstty = cast(dst->getType()); //TODO unsafe nonopaque pointer - auto dstel = dstty->getPointerElementType(); + auto dstel = dstty->getNonOpaquePointerElementType(); while (srcel->isArrayTy() && srcel->getArrayNumElements() == 1) { src = ctx.builder.CreateConstInBoundsGEP2_32(srcel, src, 0, 0); srcel = srcel->getArrayElementType(); diff --git a/src/codegen.cpp b/src/codegen.cpp index b50110a20a8fc..329c4b452a9dc 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -921,15 +921,20 @@ static const auto jl_alloc_obj_func = new JuliaFunction{ return FunctionType::get(T_prjlvalue, {T_ppjlvalue, T_size, T_prjlvalue}, false); }, - [](LLVMContext &C) { return AttributeList::get(C, - AttributeSet::get(C, makeArrayRef({Attribute::getWithAllocSizeArgs(C, 1, None)})), // returns %1 bytes - - Attributes(C, {Attribute::NoAlias, Attribute::NonNull, + [](LLVMContext &C) { + auto FnAttrs = AttrBuilder(C); + FnAttrs.addAllocSizeAttr(1, None); // returns %1 bytes #if JL_LLVM_VERSION >= 150000 - Attribute::get(C, Attribute::AllocKind, AllocFnKind::Alloc | AllocFnKind::Uninitialized | AllocFnKind::Aligned), + FnAttrs.addAllocKindAttr(AllocFnKind::Alloc | AllocFnKind::Uninitialized | AllocFnKind::Aligned); #endif - }), - None); }, + auto RetAttrs = AttrBuilder(C); + RetAttrs.addAttribute(Attribute::NoAlias); + RetAttrs.addAttribute(Attribute::NonNull); + return AttributeList::get(C, + AttributeSet::get(C, FnAttrs), + AttributeSet::get(C, RetAttrs), + None); + }, }; static const auto jl_newbits_func = new JuliaFunction<>{ XSTR(jl_new_bits), @@ -2349,7 +2354,11 @@ static void jl_init_function(Function *F, const Triple &TT) attr.addStackAlignmentAttr(16); } if (TT.isOSWindows() && TT.getArch() == Triple::x86_64) { +#if JL_LLVM_VERSION < 150000 attr.addAttribute(Attribute::UWTable); // force NeedsWinEH +#else + attr.addUWTableAttr(llvm::UWTableKind::Default); // force NeedsWinEH +#endif } if (jl_fpo_disabled(TT)) attr.addAttribute("frame-pointer", "all"); @@ -6312,8 +6321,6 @@ static Function* gen_cfun_wrapper( } else if (!type_is_ghost(sig.lrt)) { Type *prt = sig.prt; - if (sig.sret) - prt = sig.fargt_sig[0]->getContainedType(0); // sret is a PointerType bool issigned = jl_signed_type && jl_subtype(declrt, (jl_value_t*)jl_signed_type); Value *v = emit_unbox(ctx, sig.lrt, retval, retval.typ); r = llvm_type_rewrite(ctx, v, prt, issigned); diff --git a/src/llvm-remove-addrspaces.cpp b/src/llvm-remove-addrspaces.cpp index e263467ba600c..a005d3cfaa352 100644 --- a/src/llvm-remove-addrspaces.cpp +++ b/src/llvm-remove-addrspaces.cpp @@ -51,7 +51,7 @@ class AddrspaceRemoveTypeRemapper : public ValueMapTypeRemapper { else { //Remove once opaque pointer transition is complete DstTy = PointerType::get( - remapType(Ty->getPointerElementType()), + remapType(Ty->getNonOpaquePointerElementType()), ASRemapper(Ty->getAddressSpace())); } } @@ -161,7 +161,7 @@ class AddrspaceRemoveValueMaterializer : public ValueMaterializer { auto ptrty = cast(Src->getType()->getScalarType()); //Remove once opaque pointer transition is complete if (!ptrty->isOpaque()) { - Type *SrcTy = remapType(ptrty->getPointerElementType()); + Type *SrcTy = remapType(ptrty->getNonOpaquePointerElementType()); DstV = CE->getWithOperands(Ops, Ty, false, SrcTy); } }