xref: /llvm-project/clang/test/CodeGenCXX/armv7k.cpp (revision 6bb63002fca8a7cfa9ff8ffd86da4c2ca3d98a3b)
1 // RUN: %clang_cc1 %s -triple=thumbv7k-apple-watchos -emit-llvm -o - -target-abi aapcs16 | FileCheck %s
2 // RUN: %clang_cc1 %s -triple=thumbv7k-apple-watchos -emit-llvm -o - -target-abi aapcs16 | FileCheck -check-prefix=CHECK-GLOBALS %s
3 
4 // RUN: %clang_cc1 %s -triple=arm64_32-apple-ios -emit-llvm -o - -target-abi darwinpcs | FileCheck %s
5 // RUN: %clang_cc1 %s -triple=arm64_32-apple-ios -emit-llvm -o - -target-abi darwinpcs | FileCheck -check-prefix=CHECK-GLOBALS %s
6 
7 // __cxa_guard_acquire argument is 64-bit
8 struct A {
9   A();
10 };
11 
12 void f() {
13   // CHECK: call i32 @__cxa_guard_acquire(ptr
14   static A a;
15 }
16 
17 // ARM64 uses the C++11 definition of POD.
18 namespace test1 {
19   // This class is POD in C++11 and cannot have objects allocated in
20   // its tail-padding.
21   struct ABase {};
22   struct A : ABase {
23     int x;
24     char c;
25   };
26 
27   struct B : A {
28     char d;
29   };
30 
31   int test() {
32     return sizeof(B);
33   }
34   // CHECK: define{{.*}} i32 @_ZN5test14testEv()
35   // CHECK: ret i32 12
36 }
37 
38 namespace std {
39   class type_info;
40 }
41 
42 // ARM64 uses string comparisons for what would otherwise be
43 // default-visibility weak RTTI.
44 namespace test2 {
45   struct A {
46     virtual void foo();
47   };
48   void A::foo() {}
49   // Tested below because these globals get kindof oddly rearranged.
50 
51   struct __attribute__((visibility("hidden"))) B {};
52   const std::type_info &b0 = typeid(B);
53   // CHECK-GLOBALS: @_ZTIN5test21BE = linkonce_odr hidden constant { {{.*}}, ptr @_ZTSN5test21BE }
54   // CHECK-GLOBALS: @_ZTSN5test21BE = linkonce_odr hidden constant
55 
56   const std::type_info &b1 = typeid(B*);
57   // CHECK-GLOBALS: @_ZTIPN5test21BE = linkonce_odr hidden constant { {{.*}}, ptr @_ZTSPN5test21BE, i32 0, ptr @_ZTIN5test21BE
58   // CHECK-GLOBALS: @_ZTSPN5test21BE = linkonce_odr hidden constant
59 
60   struct C {};
61   const std::type_info &c0 = typeid(C);
62   // CHECK-GLOBALS: @_ZTIN5test21CE = linkonce_odr constant { {{.*}}, ptr @_ZTSN5test21CE }
63   // CHECK-GLOBALS: @_ZTSN5test21CE = linkonce_odr constant [11 x i8] c"N5test21CE\00"
64 }
65 
66 // va_list should be based on "char *" rather than "ptr".
67 
68 // CHECK: define{{.*}} void @_Z11whatsVaListPc
69 void whatsVaList(__builtin_va_list l) {}
70