xref: /llvm-project/clang/test/CodeGen/builtin-function-start.cpp (revision 39db5e1ed87363a9ffea81e53520b542201b3262)
1*39db5e1eSNikita Popov // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm -fsanitize=cfi-icall -o - %s | FileCheck %s
2ec2e26eaSSami Tolvanen 
3ec2e26eaSSami Tolvanen #if !__has_builtin(__builtin_function_start)
4ec2e26eaSSami Tolvanen #error "missing __builtin_function_start"
5ec2e26eaSSami Tolvanen #endif
6ec2e26eaSSami Tolvanen 
a(void)7ec2e26eaSSami Tolvanen void a(void) {}
8*39db5e1eSNikita Popov // CHECK: @e = global ptr no_cfi @_Z1av
9ec2e26eaSSami Tolvanen const void *e = __builtin_function_start(a);
10ec2e26eaSSami Tolvanen 
11ec2e26eaSSami Tolvanen constexpr void (*d)() = &a;
12*39db5e1eSNikita Popov // CHECK: @f = global ptr no_cfi @_Z1av
13ec2e26eaSSami Tolvanen const void *f = __builtin_function_start(d);
14ec2e26eaSSami Tolvanen 
b(void)15ec2e26eaSSami Tolvanen void b(void) {}
16*39db5e1eSNikita Popov // CHECK: @g = global [2 x ptr] [ptr @_Z1bv, ptr no_cfi @_Z1bv]
17ec2e26eaSSami Tolvanen void *g[] = {(void *)b, __builtin_function_start(b)};
18ec2e26eaSSami Tolvanen 
c(void * p)19ec2e26eaSSami Tolvanen void c(void *p) {}
20ec2e26eaSSami Tolvanen 
21ec2e26eaSSami Tolvanen class A {
22ec2e26eaSSami Tolvanen public:
23ec2e26eaSSami Tolvanen   void f();
24ec2e26eaSSami Tolvanen   virtual void g();
25ec2e26eaSSami Tolvanen   static void h();
26ec2e26eaSSami Tolvanen   int i() const;
27ec2e26eaSSami Tolvanen   int i(int n) const;
28ec2e26eaSSami Tolvanen };
29ec2e26eaSSami Tolvanen 
f()30ec2e26eaSSami Tolvanen void A::f() {}
g()31ec2e26eaSSami Tolvanen void A::g() {}
h()32ec2e26eaSSami Tolvanen void A::h() {}
33ec2e26eaSSami Tolvanen 
34*39db5e1eSNikita Popov // CHECK: define {{.*}}i32 @_ZNK1A1iEv(ptr {{.*}}%this)
i() const35ec2e26eaSSami Tolvanen int A::i() const { return 0; }
36ec2e26eaSSami Tolvanen 
37*39db5e1eSNikita Popov // CHECK: define {{.*}}i32 @_ZNK1A1iEi(ptr noundef {{.*}}%this, i32 noundef %n)
i(int n) const38ec2e26eaSSami Tolvanen int A::i(int n) const { return 0; }
39ec2e26eaSSami Tolvanen 
h(void)40ec2e26eaSSami Tolvanen void h(void) {
41*39db5e1eSNikita Popov   // CHECK: store ptr no_cfi @_Z1bv, ptr %g
42ec2e26eaSSami Tolvanen   void *g = __builtin_function_start(b);
43*39db5e1eSNikita Popov   // CHECK: call void @_Z1cPv(ptr noundef no_cfi @_Z1av)
44ec2e26eaSSami Tolvanen   c(__builtin_function_start(a));
45ec2e26eaSSami Tolvanen 
46*39db5e1eSNikita Popov   // CHECK: store ptr no_cfi @_ZN1A1fEv, ptr %Af
47ec2e26eaSSami Tolvanen   void *Af = __builtin_function_start(&A::f);
48*39db5e1eSNikita Popov   // CHECK: store ptr no_cfi @_ZN1A1gEv, ptr %Ag
49ec2e26eaSSami Tolvanen   void *Ag = __builtin_function_start(&A::g);
50*39db5e1eSNikita Popov   // CHECK: store ptr no_cfi @_ZN1A1hEv, ptr %Ah
51ec2e26eaSSami Tolvanen   void *Ah = __builtin_function_start(&A::h);
52*39db5e1eSNikita Popov   // CHECK: store ptr no_cfi @_ZNK1A1iEv, ptr %Ai1
53ec2e26eaSSami Tolvanen   void *Ai1 = __builtin_function_start((int(A::*)() const) & A::i);
54*39db5e1eSNikita Popov   // CHECK: store ptr no_cfi @_ZNK1A1iEi, ptr %Ai2
55ec2e26eaSSami Tolvanen   void *Ai2 = __builtin_function_start((int(A::*)(int) const) & A::i);
56ec2e26eaSSami Tolvanen }
57