xref: /aosp_15_r20/external/clang/test/CodeGenCXX/sections.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -emit-llvm -triple i686-pc-win32 -fms-extensions -o - %s | FileCheck %s
2*67e74705SXin Li 
3*67e74705SXin Li extern "C" {
4*67e74705SXin Li 
5*67e74705SXin Li #pragma const_seg(".my_const")
6*67e74705SXin Li #pragma bss_seg(".my_bss")
7*67e74705SXin Li int D = 1;
8*67e74705SXin Li #pragma data_seg(".data")
9*67e74705SXin Li int a = 1;
10*67e74705SXin Li #pragma data_seg(push, label, ".data2")
11*67e74705SXin Li extern const int b;
12*67e74705SXin Li const int b = 1;
13*67e74705SXin Li const char* s = "my string!";
14*67e74705SXin Li #pragma data_seg(push, ".my_seg")
15*67e74705SXin Li int c = 1;
16*67e74705SXin Li #pragma data_seg(pop, label)
17*67e74705SXin Li int d = 1;
18*67e74705SXin Li int e;
19*67e74705SXin Li #pragma bss_seg(".c")
20*67e74705SXin Li int f;
g(void)21*67e74705SXin Li void g(void){}
22*67e74705SXin Li #pragma code_seg(".my_code")
h(void)23*67e74705SXin Li void h(void){}
24*67e74705SXin Li #pragma bss_seg()
25*67e74705SXin Li int i;
26*67e74705SXin Li #pragma bss_seg(".bss1")
27*67e74705SXin Li #pragma bss_seg(push, test, ".bss2")
28*67e74705SXin Li #pragma bss_seg()
29*67e74705SXin Li #pragma bss_seg()
30*67e74705SXin Li int TEST1;
31*67e74705SXin Li #pragma bss_seg(pop)
32*67e74705SXin Li int TEST2;
33*67e74705SXin Li 
34*67e74705SXin Li 
35*67e74705SXin Li // Check "save-restore" of pragma stacks.
36*67e74705SXin Li struct Outer {
fOuter37*67e74705SXin Li   void f() {
38*67e74705SXin Li     #pragma bss_seg(push, ".bss3")
39*67e74705SXin Li     #pragma code_seg(push, ".my_code1")
40*67e74705SXin Li     #pragma const_seg(push, ".my_const1")
41*67e74705SXin Li     #pragma data_seg(push, ".data3")
42*67e74705SXin Li     struct Inner {
43*67e74705SXin Li       void g() {
44*67e74705SXin Li         #pragma bss_seg(push, ".bss4")
45*67e74705SXin Li         #pragma code_seg(push, ".my_code2")
46*67e74705SXin Li         #pragma const_seg(push, ".my_const2")
47*67e74705SXin Li         #pragma data_seg(push, ".data4")
48*67e74705SXin Li       }
49*67e74705SXin Li     };
50*67e74705SXin Li   }
51*67e74705SXin Li };
52*67e74705SXin Li 
h2(void)53*67e74705SXin Li void h2(void) {} // should be in ".my_code"
54*67e74705SXin Li int TEST3; // should be in ".bss1"
55*67e74705SXin Li int d2 = 1; // should be in ".data"
56*67e74705SXin Li extern const int b2; // should be in ".my_const"
57*67e74705SXin Li const int b2 = 1;
58*67e74705SXin Li 
59*67e74705SXin Li #pragma section("read_flag_section", read)
60*67e74705SXin Li // Even though they are not declared const, these become constant since they are
61*67e74705SXin Li // in a read-only section.
62*67e74705SXin Li __declspec(allocate("read_flag_section")) int unreferenced = 0;
63*67e74705SXin Li extern __declspec(allocate("read_flag_section")) int referenced = 42;
user()64*67e74705SXin Li int *user() { return &referenced; }
65*67e74705SXin Li 
66*67e74705SXin Li #pragma section("no_section_attributes")
67*67e74705SXin Li // A pragma section with no section attributes is read/write.
68*67e74705SXin Li __declspec(allocate("no_section_attributes")) int implicitly_read_write = 42;
69*67e74705SXin Li 
70*67e74705SXin Li #pragma section("long_section", long)
71*67e74705SXin Li // Pragma section ignores "long".
72*67e74705SXin Li __declspec(allocate("long_section")) long long_var = 42;
73*67e74705SXin Li 
74*67e74705SXin Li #pragma section("short_section", short)
75*67e74705SXin Li // Pragma section ignores "short".
76*67e74705SXin Li __declspec(allocate("short_section")) short short_var = 42;
77*67e74705SXin Li }
78*67e74705SXin Li 
79*67e74705SXin Li //CHECK: @D = global i32 1
80*67e74705SXin Li //CHECK: @a = global i32 1, section ".data"
81*67e74705SXin Li //CHECK: @b = constant i32 1, section ".my_const"
82*67e74705SXin Li //CHECK: @[[MYSTR:.*]] = {{.*}} unnamed_addr constant [11 x i8] c"my string!\00"
83*67e74705SXin Li //CHECK: @s = global i8* getelementptr inbounds ([11 x i8], [11 x i8]* @[[MYSTR]], i32 0, i32 0), section ".data2"
84*67e74705SXin Li //CHECK: @c = global i32 1, section ".my_seg"
85*67e74705SXin Li //CHECK: @d = global i32 1, section ".data"
86*67e74705SXin Li //CHECK: @e = global i32 0, section ".my_bss"
87*67e74705SXin Li //CHECK: @f = global i32 0, section ".c"
88*67e74705SXin Li //CHECK: @i = global i32 0
89*67e74705SXin Li //CHECK: @TEST1 = global i32 0
90*67e74705SXin Li //CHECK: @TEST2 = global i32 0, section ".bss1"
91*67e74705SXin Li //CHECK: @TEST3 = global i32 0, section ".bss1"
92*67e74705SXin Li //CHECK: @d2 = global i32 1, section ".data"
93*67e74705SXin Li //CHECK: @b2 = constant i32 1, section ".my_const"
94*67e74705SXin Li //CHECK: @unreferenced = constant i32 0, section "read_flag_section"
95*67e74705SXin Li //CHECK: @referenced = constant i32 42, section "read_flag_section"
96*67e74705SXin Li //CHECK: @implicitly_read_write = global i32 42, section "no_section_attributes"
97*67e74705SXin Li //CHECK: @long_var = global i32 42, section "long_section"
98*67e74705SXin Li //CHECK: @short_var = global i16 42, section "short_section"
99*67e74705SXin Li //CHECK: define void @g()
100*67e74705SXin Li //CHECK: define void @h() {{.*}} section ".my_code"
101*67e74705SXin Li //CHECK: define void @h2() {{.*}} section ".my_code"
102