[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