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