[llvm] b430743 - [ModuleUtils] Handle globals_ctors/dtors with non-literal type (PR56809)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Tue Mar 21 08:19:14 PDT 2023
Author: Nikita Popov
Date: 2023-03-21T16:19:05+01:00
New Revision: b4307437e51d3a400de21de624a1610aee23346b
URL: https://github.com/llvm/llvm-project/commit/b4307437e51d3a400de21de624a1610aee23346b
DIFF: https://github.com/llvm/llvm-project/commit/b4307437e51d3a400de21de624a1610aee23346b.diff
LOG: [ModuleUtils] Handle globals_ctors/dtors with non-literal type (PR56809)
If the global already exists, use its existing type, so we don't
try to mix literal and non-literal structs among the elements.
Fixes https://github.com/llvm/llvm-project/issues/56809.
Added:
llvm/test/Transforms/LowerGlobalDestructors/non-literal-type.ll
Modified:
llvm/lib/Transforms/Utils/ModuleUtils.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Utils/ModuleUtils.cpp b/llvm/lib/Transforms/Utils/ModuleUtils.cpp
index 6d17a466957e4..adc2fc0610f3b 100644
--- a/llvm/lib/Transforms/Utils/ModuleUtils.cpp
+++ b/llvm/lib/Transforms/Utils/ModuleUtils.cpp
@@ -31,11 +31,9 @@ static void appendToGlobalArray(StringRef ArrayName, Module &M, Function *F,
// Get the current set of static global constructors and add the new ctor
// to the list.
SmallVector<Constant *, 16> CurrentCtors;
- StructType *EltTy = StructType::get(
- IRB.getInt32Ty(), PointerType::get(FnTy, F->getAddressSpace()),
- IRB.getInt8PtrTy());
-
+ StructType *EltTy;
if (GlobalVariable *GVCtor = M.getNamedGlobal(ArrayName)) {
+ EltTy = cast<StructType>(GVCtor->getValueType()->getArrayElementType());
if (Constant *Init = GVCtor->getInitializer()) {
unsigned n = Init->getNumOperands();
CurrentCtors.reserve(n + 1);
@@ -43,6 +41,10 @@ static void appendToGlobalArray(StringRef ArrayName, Module &M, Function *F,
CurrentCtors.push_back(cast<Constant>(Init->getOperand(i)));
}
GVCtor->eraseFromParent();
+ } else {
+ EltTy = StructType::get(
+ IRB.getInt32Ty(), PointerType::get(FnTy, F->getAddressSpace()),
+ IRB.getInt8PtrTy());
}
// Build a 3 field global_ctor entry. We don't take a comdat key.
diff --git a/llvm/test/Transforms/LowerGlobalDestructors/non-literal-type.ll b/llvm/test/Transforms/LowerGlobalDestructors/non-literal-type.ll
new file mode 100644
index 0000000000000..38f72e7ac70e5
--- /dev/null
+++ b/llvm/test/Transforms/LowerGlobalDestructors/non-literal-type.ll
@@ -0,0 +1,36 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals --include-generated-funcs --version 2
+; RUN: opt -passes=lower-global-dtors -S < %s | FileCheck %s
+
+%ty = type { i32, ptr, ptr }
+
+declare void @ctor()
+declare void @dtor()
+
+ at llvm.global_ctors = appending global [1 x %ty] [%ty {i32 65535, ptr @ctor, ptr zeroinitializer }], align 8
+ at llvm.global_dtors = appending global [1 x %ty] [%ty {i32 65535, ptr @dtor, ptr zeroinitializer }], align 8
+
+;.
+; CHECK: @[[__DSO_HANDLE:[a-zA-Z0-9_$"\\.-]+]] = extern_weak hidden constant i8
+; CHECK: @[[LLVM_GLOBAL_CTORS:[a-zA-Z0-9_$"\\.-]+]] = appending global [2 x %ty] [[[TY:%.*]] { i32 65535, ptr @ctor, ptr null }, [[TY]] { i32 65535, ptr @register_call_dtors, ptr null }]
+;.
+; CHECK-LABEL: define private void @call_dtors
+; CHECK-SAME: (ptr [[TMP0:%.*]]) {
+; CHECK-NEXT: body:
+; CHECK-NEXT: call void @dtor()
+; CHECK-NEXT: ret void
+;
+;
+; CHECK-LABEL: define private void @register_call_dtors() {
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[CALL:%.*]] = call i32 @__cxa_atexit(ptr @call_dtors, ptr null, ptr @__dso_handle)
+; CHECK-NEXT: [[TMP0:%.*]] = icmp ne i32 [[CALL]], 0
+; CHECK-NEXT: br i1 [[TMP0]], label [[FAIL:%.*]], label [[RETURN:%.*]]
+; CHECK: fail:
+; CHECK-NEXT: call void @llvm.trap()
+; CHECK-NEXT: unreachable
+; CHECK: return:
+; CHECK-NEXT: ret void
+;
+;.
+; CHECK: attributes #[[ATTR0:[0-9]+]] = { cold noreturn nounwind }
+;.
More information about the llvm-commits
mailing list