Author: Johannes Doerfert Date: 2026-06-04T02:14:30Z New Revision: 9263a42920ea470ff7377fa3ca3b3759aeb86fa1
URL: https://github.com/llvm/llvm-project/commit/9263a42920ea470ff7377fa3ca3b3759aeb86fa1 DIFF: https://github.com/llvm/llvm-project/commit/9263a42920ea470ff7377fa3ca3b3759aeb86fa1.diff LOG: [OpenMP] Use ext linkage for kernels handles and globals handles keep… (#200964) … linkage Host handles are now emmitted with external linkage to clash if two kernels with the same name are registered. This could have happen right now and silently corrupt the program, but it can happen more easily once we allow users to name their kernels. In the same patch we make global variable handles retain the linkage of the global variable, forcing clashes for external ones and continue to support weak use cases. --------- Co-authored-by: Shilei Tian <[email protected]> Added: Modified: clang/test/OpenMP/amdgcn_weak_alias.c clang/test/OpenMP/declare_target_codegen.cpp clang/test/OpenMP/target_codegen.cpp clang/test/OpenMP/target_depend_codegen.cpp clang/test/OpenMP/target_indirect_codegen.cpp clang/test/OpenMP/target_parallel_depend_codegen.cpp clang/test/OpenMP/target_parallel_for_depend_codegen.cpp clang/test/OpenMP/target_parallel_for_simd_depend_codegen.cpp clang/test/OpenMP/target_simd_codegen.cpp clang/test/OpenMP/target_simd_depend_codegen.cpp clang/test/OpenMP/target_teams_depend_codegen.cpp clang/test/OpenMP/target_teams_distribute_depend_codegen.cpp clang/test/OpenMP/target_teams_distribute_parallel_for_depend_codegen.cpp clang/test/OpenMP/target_teams_distribute_parallel_for_simd_depend_codegen.cpp clang/test/OpenMP/target_teams_distribute_simd_depend_codegen.cpp llvm/include/llvm/Frontend/Offloading/Utility.h llvm/lib/Frontend/Offloading/Utility.cpp llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp mlir/test/Target/LLVMIR/omptarget-declare-target-llvm-host.mlir mlir/test/Target/LLVMIR/omptarget-declare-target-to-host.mlir Removed: ################################################################################ diff --git a/clang/test/OpenMP/amdgcn_weak_alias.c b/clang/test/OpenMP/amdgcn_weak_alias.c index 4cc54b9f15b43..6292bb5640a79 100644 --- a/clang/test/OpenMP/amdgcn_weak_alias.c +++ b/clang/test/OpenMP/amdgcn_weak_alias.c @@ -10,9 +10,9 @@ // HOST: @__Two_var = global i32 2, align 4 // HOST: @__Three_var = global i32 3, align 4 // HOST: @.offloading.entry_name = internal unnamed_addr constant [10 x i8] c"__Two_var\00", section ".llvm.rodata.offloading", align 1 -// HOST: @.offloading.entry.__Two_var = weak constant %struct.__tgt_offload_entry { i64 0, i16 1, i16 1, i32 0, ptr @__Two_var, ptr @.offloading.entry_name, i64 4, i64 0, ptr null }, section "llvm_offload_entries", align 8 +// HOST: @.offloading.entry.__Two_var = constant %struct.__tgt_offload_entry { i64 0, i16 1, i16 1, i32 0, ptr @__Two_var, ptr @.offloading.entry_name, i64 4, i64 0, ptr null }, section "llvm_offload_entries", align 8 // HOST: @.offloading.entry_name.1 = internal unnamed_addr constant [12 x i8] c"__Three_var\00", section ".llvm.rodata.offloading", align 1 -// HOST: @.offloading.entry.__Three_var = weak constant %struct.__tgt_offload_entry { i64 0, i16 1, i16 1, i32 0, ptr @__Three_var, ptr @.offloading.entry_name.1, i64 4, i64 0, ptr null }, section "llvm_offload_entries", align 8 +// HOST: @.offloading.entry.__Three_var = constant %struct.__tgt_offload_entry { i64 0, i16 1, i16 1, i32 0, ptr @__Three_var, ptr @.offloading.entry_name.1, i64 4, i64 0, ptr null }, section "llvm_offload_entries", align 8 // HOST: @One = weak alias i32 (), ptr @__One // HOST: @One_ = alias i32 (), ptr @__One // HOST: @One_var = weak alias i32, ptr @__One_var diff --git a/clang/test/OpenMP/declare_target_codegen.cpp b/clang/test/OpenMP/declare_target_codegen.cpp index 6add3eed1f226..89899a1cb4f30 100644 --- a/clang/test/OpenMP/declare_target_codegen.cpp +++ b/clang/test/OpenMP/declare_target_codegen.cpp @@ -30,7 +30,7 @@ // CHECK-DAG: @dx = {{protected | }}global i32 0, // CHECK-DAG: @dy = {{protected | }}global i32 0, // CHECK-DAG: @bbb = {{protected | }}global i32 0, -// CHECK-DAG: weak constant %struct.__tgt_offload_entry { +// CHECK-DAG: constant %struct.__tgt_offload_entry { // CHECK-DAG: @ccc = external global i32, // CHECK-DAG: @ddd = {{protected | }}global i32 0, // CHECK-DAG: @hhh_decl_tgt_ref_ptr = weak global ptr null diff --git a/clang/test/OpenMP/target_codegen.cpp b/clang/test/OpenMP/target_codegen.cpp index 431b09e81714b..34a02d85858ac 100644 --- a/clang/test/OpenMP/target_codegen.cpp +++ b/clang/test/OpenMP/target_codegen.cpp @@ -102,17 +102,17 @@ // CHECK-DAG: @{{.*}} = weak constant i8 0 // CHECK-DAG: @{{.*}} = weak constant i8 0 -// TCHECK: @{{.+}} = weak constant [[ENTTY]] -// TCHECK: @{{.+}} = weak constant [[ENTTY]] -// TCHECK: @{{.+}} = weak constant [[ENTTY]] -// TCHECK: @{{.+}} = weak constant [[ENTTY]] -// TCHECK: @{{.+}} = weak constant [[ENTTY]] -// TCHECK: @{{.+}} = weak constant [[ENTTY]] -// TCHECK: @{{.+}} = weak constant [[ENTTY]] -// TCHECK: @{{.+}} = weak constant [[ENTTY]] -// TCHECK: @{{.+}} = weak constant [[ENTTY]] -// TCHECK: @{{.+}} = weak constant [[ENTTY]] -// TCHECK-NOT: @{{.+}} = weak constant [[ENTTY]] +// TCHECK: @{{.+}} = constant [[ENTTY]] +// TCHECK: @{{.+}} = constant [[ENTTY]] +// TCHECK: @{{.+}} = constant [[ENTTY]] +// TCHECK: @{{.+}} = constant [[ENTTY]] +// TCHECK: @{{.+}} = constant [[ENTTY]] +// TCHECK: @{{.+}} = constant [[ENTTY]] +// TCHECK: @{{.+}} = constant [[ENTTY]] +// TCHECK: @{{.+}} = constant [[ENTTY]] +// TCHECK: @{{.+}} = constant [[ENTTY]] +// TCHECK: @{{.+}} = constant [[ENTTY]] +// TCHECK-NOT: @{{.+}} = constant [[ENTTY]] template<typename tx, typename ty> struct TT{ diff --git a/clang/test/OpenMP/target_depend_codegen.cpp b/clang/test/OpenMP/target_depend_codegen.cpp index 86b70dd73680d..cf221386eaee9 100644 --- a/clang/test/OpenMP/target_depend_codegen.cpp +++ b/clang/test/OpenMP/target_depend_codegen.cpp @@ -47,9 +47,9 @@ // CHECK-DAG: [[MAPT:@.+]] = private unnamed_addr constant [4 x i64] [i64 544, i64 800, i64 3, i64 288] // CHECK-DAG: @{{.*}} = weak constant i8 0 -// TCHECK: @{{.+}} = weak constant [[ENTTY]] +// TCHECK: @{{.+}} = constant [[ENTTY]] // TCHECK: @{{.+}} = {{.*}}constant [[ENTTY]] -// TCHECK-NOT: @{{.+}} = weak constant [[ENTTY]] +// TCHECK-NOT: @{{.+}} = constant [[ENTTY]] template<typename tx, typename ty> struct TT{ diff --git a/clang/test/OpenMP/target_indirect_codegen.cpp b/clang/test/OpenMP/target_indirect_codegen.cpp index fd8b6c76d0881..ba161ff8cf94d 100644 --- a/clang/test/OpenMP/target_indirect_codegen.cpp +++ b/clang/test/OpenMP/target_indirect_codegen.cpp @@ -23,13 +23,13 @@ // HOST: @indirect_foo = global ptr @_Z3foov, align 8 // HOST: @indirect_array = global [3 x ptr] [ptr @_Z3foov, ptr @_ZL3barv, ptr @_Z3bazv], align 8 // HOST: @[[FOO_ENTRY_NAME:.+]] = internal unnamed_addr constant [{{[0-9]+}} x i8] c"[[FOO_NAME:__omp_offloading_[0-9a-z]+_[0-9a-z]+_foo_l[0-9]+]]\00" -// HOST: @.offloading.entry.[[FOO_NAME]] = weak constant %struct.__tgt_offload_entry { i64 0, i16 1, i16 1, i32 8, ptr @_Z3foov, ptr @[[FOO_ENTRY_NAME]], i64 8, i64 0, ptr null } +// HOST: @.offloading.entry.[[FOO_NAME]] = weak_odr constant %struct.__tgt_offload_entry { i64 0, i16 1, i16 1, i32 8, ptr @_Z3foov, ptr @[[FOO_ENTRY_NAME]], i64 8, i64 0, ptr null } // HOST: @[[BAZ_ENTRY_NAME:.+]] = internal unnamed_addr constant [{{[0-9]+}} x i8] c"[[BAZ_NAME:__omp_offloading_[0-9a-z]+_[0-9a-z]+_baz_l[0-9]+]]\00" -// HOST: @.offloading.entry.[[BAZ_NAME]] = weak constant %struct.__tgt_offload_entry { i64 0, i16 1, i16 1, i32 8, ptr @_Z3bazv, ptr @[[BAZ_ENTRY_NAME]], i64 8, i64 0, ptr null } +// HOST: @.offloading.entry.[[BAZ_NAME]] = weak_odr constant %struct.__tgt_offload_entry { i64 0, i16 1, i16 1, i32 8, ptr @_Z3bazv, ptr @[[BAZ_ENTRY_NAME]], i64 8, i64 0, ptr null } // HOST: @[[VAR_ENTRY_NAME:.+]] = internal unnamed_addr constant [4 x i8] c"var\00" -// HOST: @.offloading.entry.var = weak constant %struct.__tgt_offload_entry { i64 0, i16 1, i16 1, i32 0, ptr @[[VAR]], ptr @[[VAR_ENTRY_NAME]], i64 1, i64 0, ptr null } +// HOST: @.offloading.entry.var = constant %struct.__tgt_offload_entry { i64 0, i16 1, i16 1, i32 0, ptr @[[VAR]], ptr @[[VAR_ENTRY_NAME]], i64 1, i64 0, ptr null } // HOST: @[[BAR_ENTRY_NAME:.+]] = internal unnamed_addr constant [{{[0-9]+}} x i8] c"[[BAR_NAME:__omp_offloading_[0-9a-z]+_[0-9a-z]+_bar_l[0-9]+]]\00" -// HOST: @.offloading.entry.[[BAR_NAME]] = weak constant %struct.__tgt_offload_entry { i64 0, i16 1, i16 1, i32 8, ptr @_ZL3barv, ptr @[[BAR_ENTRY_NAME]], i64 8, i64 0, ptr null } +// HOST: @.offloading.entry.[[BAR_NAME]] = weak_odr constant %struct.__tgt_offload_entry { i64 0, i16 1, i16 1, i32 8, ptr @_ZL3barv, ptr @[[BAR_ENTRY_NAME]], i64 8, i64 0, ptr null } //. // DEVICE: @[[FOO_NAME:__omp_offloading_[0-9a-z]+_[0-9a-z]+_foo_l[0-9]+]] = protected addrspace(1) constant {{ptr|ptr addrspace\(9\)}} @_Z3foov // DEVICE: @[[BAZ_NAME:__omp_offloading_[0-9a-z]+_[0-9a-z]+_baz_l[0-9]+]] = protected addrspace(1) constant {{ptr|ptr addrspace\(9\)}} @_Z3bazv diff --git a/clang/test/OpenMP/target_parallel_depend_codegen.cpp b/clang/test/OpenMP/target_parallel_depend_codegen.cpp index ae41454a5c376..6966f1bbc5a7b 100644 --- a/clang/test/OpenMP/target_parallel_depend_codegen.cpp +++ b/clang/test/OpenMP/target_parallel_depend_codegen.cpp @@ -47,9 +47,9 @@ // CHECK-DAG: [[MAPT:@.+]] = private unnamed_addr constant [3 x i64] [i64 544, i64 800, i64 288] // CHECK-DAG: @{{.*}} = weak constant i8 0 -// TCHECK: @{{.+}} = weak constant [[ENTTY]] +// TCHECK: @{{.+}} = constant [[ENTTY]] // TCHECK: @{{.+}} = {{.*}}constant [[ENTTY]] -// TCHECK-NOT: @{{.+}} = weak constant [[ENTTY]] +// TCHECK-NOT: @{{.+}} = constant [[ENTTY]] template<typename tx, typename ty> struct TT{ diff --git a/clang/test/OpenMP/target_parallel_for_depend_codegen.cpp b/clang/test/OpenMP/target_parallel_for_depend_codegen.cpp index 7cccb2549c2c8..8d79b37ea46c9 100644 --- a/clang/test/OpenMP/target_parallel_for_depend_codegen.cpp +++ b/clang/test/OpenMP/target_parallel_for_depend_codegen.cpp @@ -47,9 +47,9 @@ // CHECK-DAG: [[MAPT:@.+]] = private unnamed_addr constant [3 x i64] [i64 544, i64 800, i64 288] // CHECK-DAG: @{{.*}} = weak constant i8 0 -// TCHECK: @{{.+}} = weak constant [[ENTTY]] +// TCHECK: @{{.+}} = constant [[ENTTY]] // TCHECK: @{{.+}} = {{.*}}constant [[ENTTY]] -// TCHECK-NOT: @{{.+}} = weak constant [[ENTTY]] +// TCHECK-NOT: @{{.+}} = constant [[ENTTY]] template<typename tx, typename ty> struct TT{ diff --git a/clang/test/OpenMP/target_parallel_for_simd_depend_codegen.cpp b/clang/test/OpenMP/target_parallel_for_simd_depend_codegen.cpp index f1391cd26e2d4..cacde85ca6e82 100644 --- a/clang/test/OpenMP/target_parallel_for_simd_depend_codegen.cpp +++ b/clang/test/OpenMP/target_parallel_for_simd_depend_codegen.cpp @@ -47,9 +47,9 @@ // CHECK-DAG: [[MAPT:@.+]] = private unnamed_addr constant [3 x i64] [i64 544, i64 800, i64 288] // CHECK-DAG: @{{.*}} = weak constant i8 0 -// TCHECK: @{{.+}} = weak constant [[ENTTY]] +// TCHECK: @{{.+}} = constant [[ENTTY]] // TCHECK: @{{.+}} = {{.*}}constant [[ENTTY]] -// TCHECK-NOT: @{{.+}} = weak constant [[ENTTY]] +// TCHECK-NOT: @{{.+}} = constant [[ENTTY]] template<typename tx, typename ty> struct TT{ diff --git a/clang/test/OpenMP/target_simd_codegen.cpp b/clang/test/OpenMP/target_simd_codegen.cpp index 0c2dde23f6c46..141fa6ffe385b 100644 --- a/clang/test/OpenMP/target_simd_codegen.cpp +++ b/clang/test/OpenMP/target_simd_codegen.cpp @@ -101,14 +101,14 @@ // CHECK-DAG: @{{.*}} = weak constant i8 0 // CHECK-DAG: @{{.*}} = weak constant i8 0 -// TCHECK: @{{.+}} = weak constant [[ENTTY]] -// TCHECK: @{{.+}} = weak constant [[ENTTY]] -// TCHECK: @{{.+}} = weak constant [[ENTTY]] -// TCHECK: @{{.+}} = weak constant [[ENTTY]] -// TCHECK: @{{.+}} = weak constant [[ENTTY]] -// TCHECK: @{{.+}} = weak constant [[ENTTY]] -// TCHECK: @{{.+}} = weak constant [[ENTTY]] -// TCHECK-NOT: @{{.+}} = weak constant [[ENTTY]] +// TCHECK: @{{.+}} = constant [[ENTTY]] +// TCHECK: @{{.+}} = constant [[ENTTY]] +// TCHECK: @{{.+}} = constant [[ENTTY]] +// TCHECK: @{{.+}} = constant [[ENTTY]] +// TCHECK: @{{.+}} = constant [[ENTTY]] +// TCHECK: @{{.+}} = constant [[ENTTY]] +// TCHECK: @{{.+}} = constant [[ENTTY]] +// TCHECK-NOT: @{{.+}} = constant [[ENTTY]] template<typename tx, typename ty> struct TT{ diff --git a/clang/test/OpenMP/target_simd_depend_codegen.cpp b/clang/test/OpenMP/target_simd_depend_codegen.cpp index e399998869cf5..53a4f6ce9897b 100644 --- a/clang/test/OpenMP/target_simd_depend_codegen.cpp +++ b/clang/test/OpenMP/target_simd_depend_codegen.cpp @@ -47,9 +47,9 @@ // CHECK-DAG: [[MAPT:@.+]] = private unnamed_addr constant [3 x i64] [i64 544, i64 800, i64 288] // CHECK-DAG: @{{.*}} = weak constant i8 0 -// TCHECK: @{{.+}} = weak constant [[ENTTY]] +// TCHECK: @{{.+}} = constant [[ENTTY]] // TCHECK: @{{.+}} = {{.*}}constant [[ENTTY]] -// TCHECK-NOT: @{{.+}} = weak constant [[ENTTY]] +// TCHECK-NOT: @{{.+}} = constant [[ENTTY]] template<typename tx, typename ty> struct TT{ diff --git a/clang/test/OpenMP/target_teams_depend_codegen.cpp b/clang/test/OpenMP/target_teams_depend_codegen.cpp index 1b7e25ee7e936..3bc16dc41c610 100644 --- a/clang/test/OpenMP/target_teams_depend_codegen.cpp +++ b/clang/test/OpenMP/target_teams_depend_codegen.cpp @@ -47,9 +47,9 @@ // CHECK-DAG: [[MAPT:@.+]] = private unnamed_addr constant [3 x i64] [i64 544, i64 800, i64 288] // CHECK-DAG: @{{.*}} = weak constant i8 0 -// TCHECK: @{{.+}} = weak constant [[ENTTY]] +// TCHECK: @{{.+}} = constant [[ENTTY]] // TCHECK: @{{.+}} = {{.*}}constant [[ENTTY]] -// TCHECK-NOT: @{{.+}} = weak constant [[ENTTY]] +// TCHECK-NOT: @{{.+}} = constant [[ENTTY]] template<typename tx, typename ty> struct TT{ diff --git a/clang/test/OpenMP/target_teams_distribute_depend_codegen.cpp b/clang/test/OpenMP/target_teams_distribute_depend_codegen.cpp index 5bf4615fe7b70..c146a36ec9b90 100644 --- a/clang/test/OpenMP/target_teams_distribute_depend_codegen.cpp +++ b/clang/test/OpenMP/target_teams_distribute_depend_codegen.cpp @@ -47,9 +47,9 @@ // CHECK-DAG: [[MAPT:@.+]] = private unnamed_addr constant [3 x i64] [i64 544, i64 800, i64 288] // CHECK-DAG: @{{.*}} = weak constant i8 0 -// TCHECK: @{{.+}} = weak constant [[ENTTY]] +// TCHECK: @{{.+}} = constant [[ENTTY]] // TCHECK: @{{.+}} = {{.*}}constant [[ENTTY]] -// TCHECK-NOT: @{{.+}} = weak constant [[ENTTY]] +// TCHECK-NOT: @{{.+}} = constant [[ENTTY]] template<typename tx, typename ty> struct TT{ diff --git a/clang/test/OpenMP/target_teams_distribute_parallel_for_depend_codegen.cpp b/clang/test/OpenMP/target_teams_distribute_parallel_for_depend_codegen.cpp index 9fd3ca822a38b..f4d6c005d7d54 100644 --- a/clang/test/OpenMP/target_teams_distribute_parallel_for_depend_codegen.cpp +++ b/clang/test/OpenMP/target_teams_distribute_parallel_for_depend_codegen.cpp @@ -47,9 +47,9 @@ // CHECK-DAG: [[MAPT:@.+]] = private unnamed_addr constant [3 x i64] [i64 544, i64 800, i64 288] // CHECK-DAG: @{{.*}} = weak constant i8 0 -// TCHECK: @{{.+}} = weak constant [[ENTTY]] +// TCHECK: @{{.+}} = constant [[ENTTY]] // TCHECK: @{{.+}} = {{.*}}constant [[ENTTY]] -// TCHECK-NOT: @{{.+}} = weak constant [[ENTTY]] +// TCHECK-NOT: @{{.+}} = constant [[ENTTY]] template<typename tx, typename ty> struct TT{ diff --git a/clang/test/OpenMP/target_teams_distribute_parallel_for_simd_depend_codegen.cpp b/clang/test/OpenMP/target_teams_distribute_parallel_for_simd_depend_codegen.cpp index 9393d9d0474bd..fc8114ed70f7f 100644 --- a/clang/test/OpenMP/target_teams_distribute_parallel_for_simd_depend_codegen.cpp +++ b/clang/test/OpenMP/target_teams_distribute_parallel_for_simd_depend_codegen.cpp @@ -47,9 +47,9 @@ // CHECK-DAG: [[MAPT:@.+]] = private unnamed_addr constant [3 x i64] [i64 544, i64 800, i64 288] // CHECK-DAG: @{{.*}} = weak constant i8 0 -// TCHECK: @{{.+}} = weak constant [[ENTTY]] +// TCHECK: @{{.+}} = constant [[ENTTY]] // TCHECK: @{{.+}} = {{.*}}constant [[ENTTY]] -// TCHECK-NOT: @{{.+}} = weak constant [[ENTTY]] +// TCHECK-NOT: @{{.+}} = constant [[ENTTY]] template<typename tx, typename ty> struct TT{ diff --git a/clang/test/OpenMP/target_teams_distribute_simd_depend_codegen.cpp b/clang/test/OpenMP/target_teams_distribute_simd_depend_codegen.cpp index fd5cea7ebd9a0..47cef10da1b4e 100644 --- a/clang/test/OpenMP/target_teams_distribute_simd_depend_codegen.cpp +++ b/clang/test/OpenMP/target_teams_distribute_simd_depend_codegen.cpp @@ -61,9 +61,9 @@ // OMP50-DAG: @{{.*}} = weak constant i8 0 -// TCHECK: @{{.+}} = weak constant [[ENTTY]] +// TCHECK: @{{.+}} = constant [[ENTTY]] // TCHECK: @{{.+}} = {{.*}}constant [[ENTTY]] -// TCHECK-NOT: @{{.+}} = weak constant [[ENTTY]] +// TCHECK-NOT: @{{.+}} = constant [[ENTTY]] template<typename tx, typename ty> struct TT{ diff --git a/llvm/include/llvm/Frontend/Offloading/Utility.h b/llvm/include/llvm/Frontend/Offloading/Utility.h index 4c0bc87786dfb..b681e8bb59bc9 100644 --- a/llvm/include/llvm/Frontend/Offloading/Utility.h +++ b/llvm/include/llvm/Frontend/Offloading/Utility.h @@ -91,10 +91,10 @@ LLVM_ABI StructType *getEntryTy(Module &M); LLVM_ABI StringRef getOffloadEntrySection(Module &M); /// \return The emitted global variable containing the offloading entry. -LLVM_ABI GlobalVariable * -emitOffloadingEntry(Module &M, object::OffloadKind Kind, Constant *Addr, - StringRef Name, uint64_t Size, uint32_t Flags, - uint64_t Data, Constant *AuxAddr = nullptr); +LLVM_ABI GlobalVariable *emitOffloadingEntry( + Module &M, object::OffloadKind Kind, Constant *Addr, StringRef Name, + uint64_t Size, uint32_t Flags, uint64_t Data, Constant *AuxAddr = nullptr, + GlobalValue::LinkageTypes Linkage = GlobalValue::WeakAnyLinkage); /// Create a constant struct initializer used to register this global at /// runtime. diff --git a/llvm/lib/Frontend/Offloading/Utility.cpp b/llvm/lib/Frontend/Offloading/Utility.cpp index c07d276244ee1..bec13d67bb9ae 100644 --- a/llvm/lib/Frontend/Offloading/Utility.cpp +++ b/llvm/lib/Frontend/Offloading/Utility.cpp @@ -104,7 +104,8 @@ getOffloadEntryBoundarySymbols(const Triple &T, StringRef SectionName) { GlobalVariable *offloading::emitOffloadingEntry( Module &M, object::OffloadKind Kind, Constant *Addr, StringRef Name, - uint64_t Size, uint32_t Flags, uint64_t Data, Constant *AuxAddr) { + uint64_t Size, uint32_t Flags, uint64_t Data, Constant *AuxAddr, + GlobalValue::LinkageTypes Linkage) { const llvm::Triple &Triple = M.getTargetTriple(); StringRef SectionName = getOffloadEntrySection(M); @@ -113,11 +114,11 @@ GlobalVariable *offloading::emitOffloadingEntry( StringRef Prefix = Triple.isNVPTX() ? "$offloading$entry$" : ".offloading.entry."; - auto *Entry = new GlobalVariable( - M, getEntryTy(M), - /*isConstant=*/true, GlobalValue::WeakAnyLinkage, EntryInitializer, - Prefix + Name, nullptr, GlobalValue::NotThreadLocal, - M.getDataLayout().getDefaultGlobalsAddressSpace()); + auto *Entry = + new GlobalVariable(M, getEntryTy(M), + /*isConstant=*/true, Linkage, EntryInitializer, + Prefix + Name, nullptr, GlobalValue::NotThreadLocal, + M.getDataLayout().getDefaultGlobalsAddressSpace()); // The entry has to be created in the section the linker expects it to be. if (Triple.isOSBinFormatCOFF()) diff --git a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp index c03497e162c9a..19dbcf21f6982 100644 --- a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp +++ b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp @@ -11791,12 +11791,13 @@ std::unique_ptr<CodeExtractor> DeviceSharedMemOutlineInfo::createCodeExtractor( void OpenMPIRBuilder::createOffloadEntry(Constant *ID, Constant *Addr, uint64_t Size, int32_t Flags, - GlobalValue::LinkageTypes, + GlobalValue::LinkageTypes Linkage, StringRef Name) { if (!Config.isGPU()) { llvm::offloading::emitOffloadingEntry( M, object::OffloadKind::OFK_OpenMP, ID, - Name.empty() ? Addr->getName() : Name, Size, Flags, /*Data=*/0); + Name.empty() ? Addr->getName() : Name, Size, Flags, /*Data=*/0, + /*AuxAddr=*/nullptr, Linkage); return; } // TODO: Add support for global variables on the device after declare target @@ -11907,7 +11908,7 @@ void OpenMPIRBuilder::createOffloadEntriesAndInfoMetadata( } createOffloadEntry(CE->getID(), CE->getAddress(), /*Size=*/0, CE->getFlags(), - GlobalValue::WeakAnyLinkage); + GlobalValue::ExternalLinkage); } else if (const auto *CE = dyn_cast< OffloadEntriesInfoManager::OffloadEntryInfoDeviceGlobalVar>( E.first)) { diff --git a/mlir/test/Target/LLVMIR/omptarget-declare-target-llvm-host.mlir b/mlir/test/Target/LLVMIR/omptarget-declare-target-llvm-host.mlir index 92c85738dbc72..425d8d52f0a82 100644 --- a/mlir/test/Target/LLVMIR/omptarget-declare-target-llvm-host.mlir +++ b/mlir/test/Target/LLVMIR/omptarget-declare-target-llvm-host.mlir @@ -53,7 +53,7 @@ module attributes {llvm.target_triple = "x86_64-unknown-linux-gnu", omp.is_targe // CHECK-DAG: @_QMtest_0Edata_extended_to_1 = global float 2.000000e+00 // CHECK-DAG: @.offloading.entry_name{{.*}} = internal unnamed_addr constant [29 x i8] c"_QMtest_0Edata_extended_to_1\00" - // CHECK-DAG: @.offloading.entry._QMtest_0Edata_extended_to_1 = weak constant %struct.__tgt_offload_entry { i64 0, i16 1, i16 1, i32 0, ptr @_QMtest_0Edata_extended_to_1, ptr @.offloading.entry_name{{.*}}, i64 4, i64 0, ptr null }, section "llvm_offload_entries" + // CHECK-DAG: @.offloading.entry._QMtest_0Edata_extended_to_1 = constant %struct.__tgt_offload_entry { i64 0, i16 1, i16 1, i32 0, ptr @_QMtest_0Edata_extended_to_1, ptr @.offloading.entry_name{{.*}}, i64 4, i64 0, ptr null }, section "llvm_offload_entries" // CHECK-DAG: !{{.*}} = !{i32 {{.*}}, !"_QMtest_0Edata_extended_to_1", i32 {{.*}}, i32 {{.*}}} llvm.mlir.global external @_QMtest_0Edata_extended_to_1() {addr_space = 0 : i32, omp.declare_target = #omp.declaretarget<device_type = (any), capture_clause = (to)>} : f32 { %0 = llvm.mlir.constant(2.000000e+00 : f32) : f32 @@ -62,7 +62,7 @@ module attributes {llvm.target_triple = "x86_64-unknown-linux-gnu", omp.is_targe // CHECK-DAG: @_QMtest_0Edata_extended_enter_1 = global float 2.000000e+00 // CHECK-DAG: @.offloading.entry_name{{.*}} = internal unnamed_addr constant [32 x i8] c"_QMtest_0Edata_extended_enter_1\00" - // CHECK-DAG: @.offloading.entry._QMtest_0Edata_extended_enter_1 = weak constant %struct.__tgt_offload_entry { i64 0, i16 1, i16 1, i32 0, ptr @_QMtest_0Edata_extended_enter_1, ptr @.offloading.entry_name{{.*}}, i64 4, i64 0, ptr null }, section "llvm_offload_entries" + // CHECK-DAG: @.offloading.entry._QMtest_0Edata_extended_enter_1 = constant %struct.__tgt_offload_entry { i64 0, i16 1, i16 1, i32 0, ptr @_QMtest_0Edata_extended_enter_1, ptr @.offloading.entry_name{{.*}}, i64 4, i64 0, ptr null }, section "llvm_offload_entries" // CHECK-DAG: !{{.*}} = !{i32 {{.*}}, !"_QMtest_0Edata_extended_enter_1", i32 {{.*}}, i32 {{.*}}} llvm.mlir.global external @_QMtest_0Edata_extended_enter_1() {addr_space = 0 : i32, omp.declare_target = #omp.declaretarget<device_type = (any), capture_clause = (enter)>} : f32 { %0 = llvm.mlir.constant(2.000000e+00 : f32) : f32 @@ -71,7 +71,7 @@ module attributes {llvm.target_triple = "x86_64-unknown-linux-gnu", omp.is_targe // CHECK-DAG: @_QMtest_0Edata_extended_to_2 = global float 3.000000e+00 // CHECK-DAG: @.offloading.entry_name{{.*}} = internal unnamed_addr constant [29 x i8] c"_QMtest_0Edata_extended_to_2\00" - // CHECK-DAG: @.offloading.entry._QMtest_0Edata_extended_to_2 = weak constant %struct.__tgt_offload_entry { i64 0, i16 1, i16 1, i32 0, ptr @_QMtest_0Edata_extended_to_2, ptr @.offloading.entry_name{{.*}}, i64 4, i64 0, ptr null }, section "llvm_offload_entries" + // CHECK-DAG: @.offloading.entry._QMtest_0Edata_extended_to_2 = constant %struct.__tgt_offload_entry { i64 0, i16 1, i16 1, i32 0, ptr @_QMtest_0Edata_extended_to_2, ptr @.offloading.entry_name{{.*}}, i64 4, i64 0, ptr null }, section "llvm_offload_entries" // CHECK-DAG: !{{.*}} = !{i32 {{.*}}, !"_QMtest_0Edata_extended_to_2", i32 {{.*}}, i32 {{.*}}} llvm.mlir.global external @_QMtest_0Edata_extended_to_2() {addr_space = 0 : i32, omp.declare_target = #omp.declaretarget<device_type = (any), capture_clause = (to)>} : f32 { %0 = llvm.mlir.constant(3.000000e+00 : f32) : f32 @@ -80,7 +80,7 @@ module attributes {llvm.target_triple = "x86_64-unknown-linux-gnu", omp.is_targe // CHECK-DAG: @_QMtest_0Edata_extended_enter_2 = global float 3.000000e+00 // CHECK-DAG: @.offloading.entry_name{{.*}} = internal unnamed_addr constant [32 x i8] c"_QMtest_0Edata_extended_enter_2\00" - // CHECK-DAG: @.offloading.entry._QMtest_0Edata_extended_enter_2 = weak constant %struct.__tgt_offload_entry { i64 0, i16 1, i16 1, i32 0, ptr @_QMtest_0Edata_extended_enter_2, ptr @.offloading.entry_name{{.*}}, i64 4, i64 0, ptr null }, section "llvm_offload_entries" + // CHECK-DAG: @.offloading.entry._QMtest_0Edata_extended_enter_2 = constant %struct.__tgt_offload_entry { i64 0, i16 1, i16 1, i32 0, ptr @_QMtest_0Edata_extended_enter_2, ptr @.offloading.entry_name{{.*}}, i64 4, i64 0, ptr null }, section "llvm_offload_entries" // CHECK-DAG: !{{.*}} = !{i32 {{.*}}, !"_QMtest_0Edata_extended_enter_2", i32 {{.*}}, i32 {{.*}}} llvm.mlir.global external @_QMtest_0Edata_extended_enter_2() {addr_space = 0 : i32, omp.declare_target = #omp.declaretarget<device_type = (any), capture_clause = (enter)>} : f32 { %0 = llvm.mlir.constant(3.000000e+00 : f32) : f32 @@ -99,7 +99,7 @@ module attributes {llvm.target_triple = "x86_64-unknown-linux-gnu", omp.is_targe // CHECK-DAG: @_QMtest_0Edata_int_clauseless_to = global i32 1 // CHECK-DAG: @.offloading.entry_name{{.*}} = internal unnamed_addr constant [33 x i8] c"_QMtest_0Edata_int_clauseless_to\00" - // CHECK-DAG: @.offloading.entry._QMtest_0Edata_int_clauseless_to = weak constant %struct.__tgt_offload_entry { i64 0, i16 1, i16 1, i32 0, ptr @_QMtest_0Edata_int_clauseless_to, ptr @.offloading.entry_name{{.*}}, i64 4, i64 0, ptr null }, section "llvm_offload_entries" + // CHECK-DAG: @.offloading.entry._QMtest_0Edata_int_clauseless_to = constant %struct.__tgt_offload_entry { i64 0, i16 1, i16 1, i32 0, ptr @_QMtest_0Edata_int_clauseless_to, ptr @.offloading.entry_name{{.*}}, i64 4, i64 0, ptr null }, section "llvm_offload_entries" // CHECK-DAG: !{{.*}} = !{i32 {{.*}}, !"_QMtest_0Edata_int_clauseless_to", i32 {{.*}}, i32 {{.*}}} llvm.mlir.global external @_QMtest_0Edata_int_clauseless_to() {addr_space = 0 : i32, omp.declare_target = #omp.declaretarget<device_type = (any), capture_clause = (to)>} : i32 { %0 = llvm.mlir.constant(1 : i32) : i32 @@ -108,7 +108,7 @@ module attributes {llvm.target_triple = "x86_64-unknown-linux-gnu", omp.is_targe // CHECK-DAG: @_QMtest_0Edata_int_clauseless_enter = global i32 1 // CHECK-DAG: @.offloading.entry_name{{.*}} = internal unnamed_addr constant [36 x i8] c"_QMtest_0Edata_int_clauseless_enter\00" - // CHECK-DAG: @.offloading.entry._QMtest_0Edata_int_clauseless_enter = weak constant %struct.__tgt_offload_entry { i64 0, i16 1, i16 1, i32 0, ptr @_QMtest_0Edata_int_clauseless_enter, ptr @.offloading.entry_name{{.*}}, i64 4, i64 0, ptr null }, section "llvm_offload_entries" + // CHECK-DAG: @.offloading.entry._QMtest_0Edata_int_clauseless_enter = constant %struct.__tgt_offload_entry { i64 0, i16 1, i16 1, i32 0, ptr @_QMtest_0Edata_int_clauseless_enter, ptr @.offloading.entry_name{{.*}}, i64 4, i64 0, ptr null }, section "llvm_offload_entries" // CHECK-DAG: !{{.*}} = !{i32 {{.*}}, !"_QMtest_0Edata_int_clauseless_enter", i32 {{.*}}, i32 {{.*}}} llvm.mlir.global external @_QMtest_0Edata_int_clauseless_enter() {addr_space = 0 : i32, omp.declare_target = #omp.declaretarget<device_type = (any), capture_clause = (enter)>} : i32 { %0 = llvm.mlir.constant(1 : i32) : i32 @@ -117,7 +117,7 @@ module attributes {llvm.target_triple = "x86_64-unknown-linux-gnu", omp.is_targe // CHECK-DAG: @_QMtest_0Edata_int_to = global i32 5 // CHECK-DAG: @.offloading.entry_name{{.*}} = internal unnamed_addr constant [22 x i8] c"_QMtest_0Edata_int_to\00" - // CHECK-DAG: @.offloading.entry._QMtest_0Edata_int_to = weak constant %struct.__tgt_offload_entry { i64 0, i16 1, i16 1, i32 0, ptr @_QMtest_0Edata_int_to, ptr @.offloading.entry_name{{.*}}, i64 4, i64 0, ptr null }, section "llvm_offload_entries" + // CHECK-DAG: @.offloading.entry._QMtest_0Edata_int_to = constant %struct.__tgt_offload_entry { i64 0, i16 1, i16 1, i32 0, ptr @_QMtest_0Edata_int_to, ptr @.offloading.entry_name{{.*}}, i64 4, i64 0, ptr null }, section "llvm_offload_entries" // CHECK-DAG: !{{.*}} = !{i32 {{.*}}, !"_QMtest_0Edata_int_to", i32 {{.*}}, i32 {{.*}}} llvm.mlir.global external @_QMtest_0Edata_int_to() {addr_space = 0 : i32, omp.declare_target = #omp.declaretarget<device_type = (any), capture_clause = (to)>} : i32 { %0 = llvm.mlir.constant(5 : i32) : i32 @@ -126,7 +126,7 @@ module attributes {llvm.target_triple = "x86_64-unknown-linux-gnu", omp.is_targe // CHECK-DAG: @_QMtest_0Edata_int_enter = global i32 5 // CHECK-DAG: @.offloading.entry_name{{.*}} = internal unnamed_addr constant [25 x i8] c"_QMtest_0Edata_int_enter\00" - // CHECK-DAG: @.offloading.entry._QMtest_0Edata_int_enter = weak constant %struct.__tgt_offload_entry { i64 0, i16 1, i16 1, i32 0, ptr @_QMtest_0Edata_int_enter, ptr @.offloading.entry_name{{.*}}, i64 4, i64 0, ptr null }, section "llvm_offload_entries" + // CHECK-DAG: @.offloading.entry._QMtest_0Edata_int_enter = constant %struct.__tgt_offload_entry { i64 0, i16 1, i16 1, i32 0, ptr @_QMtest_0Edata_int_enter, ptr @.offloading.entry_name{{.*}}, i64 4, i64 0, ptr null }, section "llvm_offload_entries" // CHECK-DAG: !{{.*}} = !{i32 {{.*}}, !"_QMtest_0Edata_int_enter", i32 {{.*}}, i32 {{.*}}} llvm.mlir.global external @_QMtest_0Edata_int_enter() {addr_space = 0 : i32, omp.declare_target = #omp.declaretarget<device_type = (any), capture_clause = (enter)>} : i32 { %0 = llvm.mlir.constant(5 : i32) : i32 diff --git a/mlir/test/Target/LLVMIR/omptarget-declare-target-to-host.mlir b/mlir/test/Target/LLVMIR/omptarget-declare-target-to-host.mlir index 11be736c820a9..5da3b0f80b565 100644 --- a/mlir/test/Target/LLVMIR/omptarget-declare-target-to-host.mlir +++ b/mlir/test/Target/LLVMIR/omptarget-declare-target-to-host.mlir @@ -4,7 +4,7 @@ module attributes {llvm.target_triple = "x86_64-unknown-linux-gnu", omp.is_gpu = // CHECK-DAG: @_QMtest_0Ezii = global [11 x float] zeroinitializer // CHECK-DAG: @.offload_sizes = private unnamed_addr constant [2 x i64] [i64 48, i64 0] // CHECK-DAG: @.offload_maptypes = private unnamed_addr constant [2 x i64] [i64 3, i64 288] - // CHECK-DAG: @.offloading.entry._QMtest_0Ezii = weak constant %struct.__tgt_offload_entry {{.*}} ptr @_QMtest_0Ezii, {{.*}}, i64 44,{{.*}} + // CHECK-DAG: @.offloading.entry._QMtest_0Ezii = constant %struct.__tgt_offload_entry {{.*}} ptr @_QMtest_0Ezii, {{.*}}, i64 44,{{.*}} llvm.mlir.global external @_QMtest_0Ezii() {addr_space = 0 : i32, omp.declare_target = #omp.declaretarget<device_type = (any), capture_clause = (to)>} : !llvm.array<11 x f32> { %0 = llvm.mlir.zero : !llvm.array<11 x f32> llvm.return %0 : !llvm.array<11 x f32> _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
