Clang Project

clang_source_code/test/CodeGenCXX/clang-sections.cpp
1// RUN: %clang_cc1 -emit-llvm -triple arm-none-eabi -o - %s | FileCheck %s
2// Test that global variables, statics and functions are attached section-attributes
3// as per '#pragma clang section' directives.
4
5extern "C" {
6// test with names for each section
7#pragma clang section bss="my_bss.1" data="my_data.1" rodata="my_rodata.1"
8#pragma clang section text="my_text.1"
9int a;      // my_bss.1
10int b = 1;  // my_data.1
11int c[4];   // my_bss.1
12short d[5] = {0}; // my_bss.1
13short e[6] = {0, 0, 1}; // my_data.1
14extern const int f;
15const int f = 2;  // my_rodata.1
16int foo(void) {   // my_text.1
17  return b;
18}
19static int g[2]; // my_bss.1
20#pragma clang section bss=""
21int h; // default - .bss
22#pragma clang section data=""  bss="my_bss.2" text="my_text.2"
23int i = 0; // my_bss.2
24extern const int j;
25const int j = 4; // default - .rodata
26int k; // my_bss.2
27extern int zoo(int *x, int *y);
28int goo(void) {  // my_text.2
29  static int lstat_h;  // my_bss.2
30  return zoo(g, &lstat_h);
31}
32#pragma clang section rodata="my_rodata.2" data="my_data.2"
33int l = 5; // my_data.2
34extern const int m;
35const int m = 6; // my_rodata.2
36#pragma clang section rodata="" data="" bss="" text=""
37int n; // default
38int o = 6; // default
39extern const int p;
40const int p = 7; // default
41int hoo(void) {
42  return b;
43}
44}
45//CHECK: @a = global i32 0, align 4 #0
46//CHECK: @b = global i32 1, align 4 #0
47//CHECK: @c = global [4 x i32] zeroinitializer, align 4 #0
48//CHECK: @d = global [5 x i16] zeroinitializer, align 2 #0
49//CHECK: @e = global [6 x i16] [i16 0, i16 0, i16 1, i16 0, i16 0, i16 0], align 2 #0
50//CHECK: @f = constant i32 2, align 4 #0
51
52//CHECK: @h = global i32 0, align 4 #1
53//CHECK: @i = global i32 0, align 4 #2
54//CHECK: @j = constant i32 4, align 4 #2
55//CHECK: @k = global i32 0, align 4 #2
56//CHECK: @_ZZ3gooE7lstat_h = internal global i32 0, align 4 #2
57//CHECK: @_ZL1g = internal global [2 x i32] zeroinitializer, align 4 #0
58
59//CHECK: @l = global i32 5, align 4 #3
60//CHECK: @m = constant i32 6, align 4 #3
61
62//CHECK: @n = global i32 0, align 4
63//CHECK: @o = global i32 6, align 4
64//CHECK: @p = constant i32 7, align 4
65
66//CHECK: define i32 @foo() #4 {
67//CHECK: define i32 @goo() #5 {
68//CHECK: declare i32 @zoo(i32*, i32*) #6
69//CHECK: define i32 @hoo() #7 {
70
71//CHECK: attributes #0 = { "bss-section"="my_bss.1" "data-section"="my_data.1" "rodata-section"="my_rodata.1" }
72//CHECK: attributes #1 = { "data-section"="my_data.1" "rodata-section"="my_rodata.1" }
73//CHECK: attributes #2 = { "bss-section"="my_bss.2" "rodata-section"="my_rodata.1" }
74//CHECK: attributes #3 = { "bss-section"="my_bss.2" "data-section"="my_data.2" "rodata-section"="my_rodata.2" }
75//CHECK: attributes #4 = { {{.*"implicit-section-name"="my_text.1".*}} }
76//CHECK: attributes #5 = { {{.*"implicit-section-name"="my_text.2".*}} }
77//CHECK-NOT: attributes #6 = { {{.*"implicit-section-name".*}} }
78//CHECK-NOT: attributes #7 = { {{.*"implicit-section-name".*}} }
79