@@ -22,22 +22,24 @@ struct S {
2222// CIR: %[[HANDLE:.*]] = cir.get_global @__dso_handle : !cir.ptr<i8>
2323// CIR: cir.call @__cxa_atexit(%[[DTOR_CAST]], %[[HD_CAST]], %[[HANDLE]])
2424
25- // CIR: cir.func private @_GLOBAL__sub_I_static_members.cpp()
26- // CIR: cir.call @__cxx_global_var_init()
27-
2825// LLVM: @_ZN1S2hdE = linkonce_odr global %struct.HasDtor zeroinitializer, comdat
26+ // LLVM: @_ZN5Outer5Inner2hdE = linkonce_odr global %struct.HasDtor zeroinitializer, comdat
27+
2928// LLVM: @llvm.global_ctors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr @_GLOBAL__sub_I_static_members.cpp, ptr null }]
3029// LLVM: define internal void @__cxx_global_var_init()
3130// LLVM: call void @__cxa_atexit(ptr @_ZN7HasDtorD1Ev, ptr @_ZN1S2hdE, ptr @__dso_handle)
32- // LLVM: define void @_GLOBAL__sub_I_static_members.cpp()
33- // LLVM: call void @__cxx_global_var_init()
3431
3532// FIXME(cir): OGCG has a guard variable for this case that we don't generate in CIR.
3633// This is needed because the variable linkonce_odr linkage.
3734
3835// OGCG: @_ZN1S2hdE = linkonce_odr global %struct.HasDtor zeroinitializer, comdat
3936// OGCG: @_ZGVN1S2hdE = linkonce_odr global i64 0, comdat($_ZN1S2hdE)
40- // OGCG: @llvm.global_ctors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr @__cxx_global_var_init, ptr @_ZN1S2hdE }]
37+ // OGCG: @_ZN5Outer5Inner2hdE = linkonce_odr global %struct.HasDtor zeroinitializer, comdat
38+ // OGCG: @_ZGVN5Outer5Inner2hdE = linkonce_odr global i64 0, comdat($_ZN5Outer5Inner2hdE)
39+ // OGCG: @llvm.global_ctors = appending global [2 x { i32, ptr, ptr }] [
40+ // OGCG-SAME: { i32, ptr, ptr } { i32 65535, ptr @__cxx_global_var_init, ptr @_ZN1S2hdE },
41+ // OGCG-SAME: { i32, ptr, ptr } { i32 65535, ptr @__cxx_global_var_init.1, ptr @_ZN5Outer5Inner2hdE }]
42+
4143// OGCG: define internal void @__cxx_global_var_init() {{.*}} section ".text.startup" comdat($_ZN1S2hdE) {
4244// OGCG: %[[GUARD:.*]] = load atomic i8, ptr @_ZGVN1S2hdE acquire
4345// OGCG: %[[UNINIT:.*]] = icmp eq i8 %[[GUARD]], 0
@@ -51,3 +53,42 @@ struct S {
5153// OGCG: call void @__cxa_guard_release(ptr @_ZGVN1S2hdE)
5254// OGCG: br label %[[INIT_END]]
5355// OGCG: [[INIT_END]]:
56+
57+ struct Outer {
58+ struct Inner {
59+ static inline HasDtor hd;
60+ };
61+ };
62+
63+ // CIR: cir.global linkonce_odr comdat @_ZN5Outer5Inner2hdE = #cir.zero : !rec_HasDtor
64+ // CIR: cir.func internal private @__cxx_global_var_init.1()
65+ // CIR: %[[HD:.*]] = cir.get_global @_ZN5Outer5Inner2hdE : !cir.ptr<!rec_HasDtor>
66+ // CIR: %[[DTOR:.*]] = cir.get_global @_ZN7HasDtorD1Ev : !cir.ptr<!cir.func<(!cir.ptr<!rec_HasDtor>)>>
67+ // CIR: %[[DTOR_CAST:.*]] = cir.cast bitcast %[[DTOR]] : !cir.ptr<!cir.func<(!cir.ptr<!rec_HasDtor>)>> -> !cir.ptr<!cir.func<(!cir.ptr<!void>)>>
68+ // CIR: %[[HD_CAST:.*]] = cir.cast bitcast %[[HD]] : !cir.ptr<!rec_HasDtor> -> !cir.ptr<!void>
69+ // CIR: %[[HANDLE:.*]] = cir.get_global @__dso_handle : !cir.ptr<i8>
70+ // CIR: cir.call @__cxa_atexit(%[[DTOR_CAST]], %[[HD_CAST]], %[[HANDLE]]) : (!cir.ptr<!cir.func<(!cir.ptr<!void>)>>, !cir.ptr<!void>, !cir.ptr<i8>) -> ()
71+
72+ // LLVM: define internal void @__cxx_global_var_init.1()
73+ // LLVM: call void @__cxa_atexit(ptr @_ZN7HasDtorD1Ev, ptr @_ZN5Outer5Inner2hdE, ptr @__dso_handle)
74+
75+ // OGCG: define internal void @__cxx_global_var_init.1() {{.*}} section ".text.startup" comdat($_ZN5Outer5Inner2hdE) {
76+ // OGCG: %[[GUARD:.*]] = load atomic i8, ptr @_ZGVN5Outer5Inner2hdE acquire
77+ // OGCG: %[[UNINIT:.*]] = icmp eq i8 %[[GUARD]], 0
78+ // OGCG: br i1 %[[UNINIT]], label %[[INIT_CHECK:.*]], label %[[INIT_END:.*]]
79+ // OGCG: [[INIT_CHECK:.*]]:
80+ // OGCG: %[[GUARD_ACQUIRE:.*]] = call i32 @__cxa_guard_acquire(ptr @_ZGVN5Outer5Inner2hdE)
81+ // OGCG: %[[TOBOOL:.*]] = icmp ne i32 %[[GUARD_ACQUIRE]], 0
82+ // OGCG: br i1 %[[TOBOOL]], label %[[INIT:.*]], label %[[INIT_END]]
83+ // OGCG: [[INIT:.*]]:
84+ // OGCG: %[[ATEXIT:.*]] = call i32 @__cxa_atexit(ptr @_ZN7HasDtorD1Ev, ptr @_ZN5Outer5Inner2hdE, ptr @__dso_handle)
85+ // OGCG: call void @__cxa_guard_release(ptr @_ZGVN5Outer5Inner2hdE)
86+ // OGCG: br label %[[INIT_END]]
87+ // OGCG: [[INIT_END]]:
88+
89+
90+ // CIR: cir.func private @_GLOBAL__sub_I_static_members.cpp()
91+ // CIR: cir.call @__cxx_global_var_init()
92+
93+ // LLVM: define void @_GLOBAL__sub_I_static_members.cpp()
94+ // LLVM: call void @__cxx_global_var_init()
0 commit comments