diff --git a/llvm/lib/Target/AMDGPU/AMDGPUCtorDtorLowering.cpp b/llvm/lib/Target/AMDGPU/AMDGPUCtorDtorLowering.cpp --- a/llvm/lib/Target/AMDGPU/AMDGPUCtorDtorLowering.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUCtorDtorLowering.cpp @@ -63,6 +63,16 @@ for (Value *V : GA->operands()) { auto *CS = cast(V); + if (auto *F = dyn_cast(CS->getOperand(1))) { + uint64_t Priority = cast(CS->getOperand(0))->getSExtValue(); + std::string PriorityStr = "." + std::to_string(Priority); + auto *GV = new GlobalVariable( + M, F->getType(), /*IsConstant=*/true, GlobalValue::InternalLinkage, F, + F->getName() + (IsCtor ? ".init" : ".fini")); + GV->setSection(IsCtor ? ".init_array" + PriorityStr + : ".fini_array" + PriorityStr); + appendToUsed(M, {GV}); + } IRB.CreateCall(ConstructorTy, CS->getOperand(1)); } diff --git a/llvm/test/CodeGen/AMDGPU/lower-ctor-dtor.ll b/llvm/test/CodeGen/AMDGPU/lower-ctor-dtor.ll --- a/llvm/test/CodeGen/AMDGPU/lower-ctor-dtor.ll +++ b/llvm/test/CodeGen/AMDGPU/lower-ctor-dtor.ll @@ -4,12 +4,16 @@ ; Make sure we get the same result if we run multiple times ; RUN: opt -S -mtriple=amdgcn-- -passes=amdgpu-lower-ctor-dtor,amdgpu-lower-ctor-dtor < %s | FileCheck %s ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx700 -filetype=obj -o - < %s | llvm-readelf -s - 2>&1 | FileCheck %s -check-prefix=VISIBILITY +; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx700 -filetype=obj -o - < %s | llvm-readelf -S - 2>&1 | FileCheck %s -check-prefix=SECTION @llvm.global_ctors = appending addrspace(1) global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 1, ptr @foo, ptr null }] @llvm.global_dtors = appending addrspace(1) global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 1, ptr @bar, ptr null }] ; CHECK-NOT: @llvm.global_ctors ; CHECK-NOT: @llvm.global_dtors +; CHECK: @foo.init = internal constant ptr @foo, section ".init_array.1" +; CHECK: @bar.fini = internal constant ptr @bar, section ".fini_array.1" +; CHECK: @llvm.used = appending global [4 x ptr] [ptr @foo.init, ptr @amdgcn.device.init, ptr @bar.fini, ptr @amdgcn.device.fini] ; CHECK-LABEL: amdgpu_kernel void @amdgcn.device.init() #0 ; CHECK-NEXT: call void @foo @@ -25,6 +29,8 @@ ; VISIBILITY: OBJECT GLOBAL DEFAULT {{.*}} amdgcn.device.init.kd ; VISIBILITY: FUNC GLOBAL PROTECTED {{.*}} amdgcn.device.fini ; VISIBILITY: OBJECT GLOBAL DEFAULT {{.*}} amdgcn.device.fini.kd +; SECTION: .init_array.1 INIT_ARRAY {{.*}} {{.*}} 000008 00 WA 0 0 8 +; SECTION: .fini_array.1 FINI_ARRAY {{.*}} {{.*}} 000008 00 WA 0 0 8 define internal void @foo() { ret void