xref: /aosp_15_r20/external/clang/test/CodeGenCXX/runtimecc.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 %s -triple=armv7-apple-darwin10 -emit-llvm -o - -fexceptions -fcxx-exceptions | FileCheck %s
2*67e74705SXin Li 
3*67e74705SXin Li // Check that we annotate all compiler-synthesized runtime calls and
4*67e74705SXin Li // functions with the actual ABI-determined CC.  This usually doesn't
5*67e74705SXin Li // matter as long as we're internally consistent (and the LLVM-default
6*67e74705SXin Li // CC is consistent with the real one), but it's possible for user
7*67e74705SXin Li // translation units to define these runtime functions (or, equivalently,
8*67e74705SXin Li // for us to get LTO'ed with such a translation unit), and then the
9*67e74705SXin Li // mismatch will kill us.
10*67e74705SXin Li //
11*67e74705SXin Li // rdar://12818655
12*67e74705SXin Li 
13*67e74705SXin Li // CHECK: [[A:%.*]] = type { double }
14*67e74705SXin Li 
15*67e74705SXin Li namespace test0 {
16*67e74705SXin Li   struct A {
17*67e74705SXin Li     double d;
18*67e74705SXin Li     A();
19*67e74705SXin Li     ~A();
20*67e74705SXin Li   };
21*67e74705SXin Li 
22*67e74705SXin Li   A global;
23*67e74705SXin Li // CHECK-LABEL:    define internal void @__cxx_global_var_init()
24*67e74705SXin Li // CHECK:      call [[A]]* @_ZN5test01AC1Ev([[A]]* @_ZN5test06globalE)
25*67e74705SXin Li // CHECK-NEXT: call i32 @__cxa_atexit(void (i8*)* bitcast ([[A]]* ([[A]]*)* @_ZN5test01AD1Ev to void (i8*)*), i8* bitcast ([[A]]* @_ZN5test06globalE to i8*), i8* @__dso_handle) [[NOUNWIND:#[0-9]+]]
26*67e74705SXin Li // CHECK-NEXT: ret void
27*67e74705SXin Li }
28*67e74705SXin Li 
29*67e74705SXin Li // CHECK: declare i32 @__cxa_atexit(void (i8*)*, i8*, i8*) [[NOUNWIND]]
30*67e74705SXin Li 
31*67e74705SXin Li namespace test1 {
test()32*67e74705SXin Li   void test() {
33*67e74705SXin Li     throw 0;
34*67e74705SXin Li   }
35*67e74705SXin Li 
36*67e74705SXin Li // CHECK-LABEL:    define void @_ZN5test14testEv()
37*67e74705SXin Li // CHECK:      [[T0:%.*]] = call i8* @__cxa_allocate_exception(i32 4) [[NOUNWIND]]
38*67e74705SXin Li // CHECK-NEXT: [[T1:%.*]] = bitcast i8* [[T0]] to i32*
39*67e74705SXin Li // CHECK-NEXT: store i32 0, i32* [[T1]]
40*67e74705SXin Li // CHECK-NEXT: call void @__cxa_throw(i8* [[T0]], i8* bitcast (i8** @_ZTIi to i8*), i8* null) [[NORETURN:#[0-9]+]]
41*67e74705SXin Li // CHECK-NEXT: unreachable
42*67e74705SXin Li }
43*67e74705SXin Li 
44*67e74705SXin Li // CHECK: declare i8* @__cxa_allocate_exception(i32)
45*67e74705SXin Li 
46*67e74705SXin Li // CHECK: declare void @__cxa_throw(i8*, i8*, i8*)
47*67e74705SXin Li 
48*67e74705SXin Li // CHECK-LABEL: define internal void @_GLOBAL__sub_I_runtimecc.cpp()
49*67e74705SXin Li // CHECK:   call void @__cxx_global_var_init()
50*67e74705SXin Li 
51*67e74705SXin Li 
52*67e74705SXin Li // CHECK: attributes [[NOUNWIND]] = { nounwind }
53*67e74705SXin Li // CHECK: attributes [[NORETURN]] = { noreturn }
54