xref: /aosp_15_r20/external/clang/test/CodeGen/named_reg_global.c (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-linux-gnu -S -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-X86-64
2*67e74705SXin Li // RUN: %clang_cc1 -triple arm64-linux-gnu -S -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-ARM
3*67e74705SXin Li // RUN: %clang_cc1 -triple armv7-linux-gnu -S -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-ARM
4*67e74705SXin Li 
5*67e74705SXin Li // CHECK-NOT: @sp = common global
6*67e74705SXin Li 
7*67e74705SXin Li #if defined(__x86_64__)
8*67e74705SXin Li register unsigned long current_stack_pointer asm("rsp");
9*67e74705SXin Li #else
10*67e74705SXin Li register unsigned long current_stack_pointer asm("sp");
11*67e74705SXin Li #endif
12*67e74705SXin Li 
13*67e74705SXin Li struct p4_Thread {
14*67e74705SXin Li   struct {
15*67e74705SXin Li     int len;
16*67e74705SXin Li   } word;
17*67e74705SXin Li };
18*67e74705SXin Li // Testing pointer types as well
19*67e74705SXin Li #if defined(__x86_64__)
20*67e74705SXin Li register struct p4_Thread *p4TH asm("rsp");
21*67e74705SXin Li #else
22*67e74705SXin Li register struct p4_Thread *p4TH asm("sp");
23*67e74705SXin Li #endif
24*67e74705SXin Li 
25*67e74705SXin Li // CHECK: define{{.*}} i[[bits:[0-9]+]] @get_stack_pointer_addr()
26*67e74705SXin Li // CHECK: [[ret:%[0-9]+]] = call i[[bits]] @llvm.read_register.i[[bits]](metadata !0)
27*67e74705SXin Li // CHECK: ret i[[bits]] [[ret]]
get_stack_pointer_addr()28*67e74705SXin Li unsigned long get_stack_pointer_addr() {
29*67e74705SXin Li   return current_stack_pointer;
30*67e74705SXin Li }
31*67e74705SXin Li // CHECK: declare{{.*}} i[[bits]] @llvm.read_register.i[[bits]](metadata)
32*67e74705SXin Li 
33*67e74705SXin Li // CHECK: define{{.*}} void @set_stack_pointer_addr(i[[bits]] %addr) #0 {
34*67e74705SXin Li // CHECK: [[sto:%[0-9]+]] = load i[[bits]], i[[bits]]* %
35*67e74705SXin Li // CHECK: call void @llvm.write_register.i[[bits]](metadata !0, i[[bits]] [[sto]])
36*67e74705SXin Li // CHECK: ret void
set_stack_pointer_addr(unsigned long addr)37*67e74705SXin Li void set_stack_pointer_addr(unsigned long addr) {
38*67e74705SXin Li   current_stack_pointer = addr;
39*67e74705SXin Li }
40*67e74705SXin Li // CHECK: declare{{.*}} void @llvm.write_register.i[[bits]](metadata, i[[bits]])
41*67e74705SXin Li 
42*67e74705SXin Li // CHECK: define {{.*}}@fn1
fn1()43*67e74705SXin Li int fn1() {
44*67e74705SXin Li   return (*p4TH).word.len;
45*67e74705SXin Li }
46*67e74705SXin Li // CHECK: %[[regr:[0-9]+]] = call i[[bits]] @llvm.read_register.i[[bits]](metadata !0)
47*67e74705SXin Li // CHECK: inttoptr i[[bits]] %[[regr]] to %struct.p4_Thread*
48*67e74705SXin Li 
49*67e74705SXin Li // CHECK: define {{.*}}@fn2
fn2(struct p4_Thread * val)50*67e74705SXin Li void fn2(struct p4_Thread *val) {
51*67e74705SXin Li   p4TH = val;
52*67e74705SXin Li }
53*67e74705SXin Li // CHECK: %[[regw:[0-9]+]] = ptrtoint %struct.p4_Thread* %{{.*}} to i[[bits]]
54*67e74705SXin Li // CHECK: call void @llvm.write_register.i[[bits]](metadata !0, i[[bits]] %[[regw]])
55*67e74705SXin Li 
56*67e74705SXin Li // CHECK-X86-64: !llvm.named.register.rsp = !{!0}
57*67e74705SXin Li // CHECK-X86-64: !0 = !{!"rsp"}
58*67e74705SXin Li // CHECK-ARM: !llvm.named.register.sp = !{!0}
59*67e74705SXin Li // CHECK-ARM: !0 = !{!"sp"}
60