Add r228939 back with a fix.
[oota-llvm.git] / test / CodeGen / X86 / global-sections.ll
1 ; RUN: llc < %s -mtriple=i386-unknown-linux-gnu | FileCheck %s -check-prefix=LINUX
2 ; RUN: llc < %s -mtriple=i386-apple-darwin9.7 | FileCheck %s -check-prefix=DARWIN
3 ; RUN: llc < %s -mtriple=i386-apple-darwin10 -relocation-model=static | FileCheck %s -check-prefix=DARWIN-STATIC
4 ; RUN: llc < %s -mtriple=x86_64-apple-darwin10 | FileCheck %s -check-prefix=DARWIN64
5 ; RUN: llc < %s -mtriple=i386-unknown-linux-gnu -data-sections -function-sections | FileCheck %s -check-prefix=LINUX-SECTIONS
6 ; RUN: llc < %s -mtriple=x86_64-pc-linux -data-sections -function-sections -relocation-model=pic | FileCheck %s -check-prefix=LINUX-SECTIONS-PIC
7 ; RUN: llc < %s -mtriple=i686-pc-win32 -data-sections -function-sections | FileCheck %s -check-prefix=WIN32-SECTIONS
8
9 define void @F1() {
10   ret void
11 }
12
13 ; WIN32-SECTIONS: .section        .text,"xr",one_only,_F1
14 ; WIN32-SECTIONS: .globl _F1
15
16 define void @F2(i32 %y) {
17 bb0:
18 switch i32 %y, label %bb5 [
19     i32 1, label %bb1
20     i32 2, label %bb2
21     i32 3, label %bb3
22     i32 4, label %bb4
23   ]
24 bb1:
25   ret void
26 bb2:
27   ret void
28 bb3:
29   ret void
30 bb4:
31   ret void
32 bb5:
33   ret void
34 }
35
36 ; LINUX:     .size   F2,
37 ; LINUX-NEX: .cfi_endproc
38 ; LINUX-NEX: .section        .rodata,"a",@progbits
39
40 ; LINUX-SECTIONS: .section        .text.F2,"ax",@progbits
41 ; LINUX-SECTIONS: .size   F2,
42 ; LINUX-SECTIONS-NEXT: .cfi_endproc
43 ; LINUX-SECTIONS-NEXT: .section        .rodata.F2,"a",@progbits
44
45 ; LINUX-SECTIONS-PIC: .section        .text.F2,"ax",@progbits
46 ; LINUX-SECTIONS-PIC: .size   F2,
47 ; LINUX-SECTIONS-PIC-NEXT: .cfi_endproc
48 ; LINUX-SECTIONS-PIC-NEXT: .section        .rodata.F2,"a",@progbits
49
50 declare void @G()
51
52 define void @F3(i32 %y) {
53 bb0:
54   invoke void @G()
55           to label %bb2 unwind label %bb1
56 bb1:
57   landingpad { i8*, i32 } personality i8* bitcast (void ()* @G to i8*)
58           catch i8* null
59   br label %bb2
60 bb2:
61
62 switch i32 %y, label %bb7 [
63     i32 1, label %bb3
64     i32 2, label %bb4
65     i32 3, label %bb5
66     i32 4, label %bb6
67   ]
68 bb3:
69   ret void
70 bb4:
71   ret void
72 bb5:
73   ret void
74 bb6:
75   ret void
76 bb7:
77   ret void
78 }
79
80 ; DARWIN64: _F3:
81 ; DARWIN64: .cfi_endproc
82 ; DARWIN64-NEXT: Leh_func_end
83 ; DARWIN64-NEXT: .section        __TEXT,__gcc_except_tab
84 ; DARWIN64-NOT: .section
85 ; DARWIN64: .section        __TEXT,__text,regular,pure_instructions
86 ; DARWIN64-NOT: .section
87 ; DARWIN64: LJTI{{.*}}:
88
89 ; int G1;
90 @G1 = common global i32 0
91
92 ; LINUX: .type   G1,@object
93 ; LINUX: .comm  G1,4,4
94
95 ; DARWIN: .comm _G1,4,2
96
97
98
99
100 ; const int G2 __attribute__((weak)) = 42;
101 @G2 = weak_odr unnamed_addr constant i32 42     
102
103
104 ; TODO: linux drops this into .rodata, we drop it into ".gnu.linkonce.r.G2"
105
106 ; DARWIN: .section __TEXT,__const_coal,coalesced
107 ; DARWIN: _G2:
108 ; DARWIN:    .long 42
109
110
111 ; int * const G3 = &G1;
112 @G3 = unnamed_addr constant i32* @G1
113
114 ; DARWIN: .section        __DATA,__const
115 ; DARWIN: .globl _G3
116 ; DARWIN: _G3:
117 ; DARWIN:     .long _G1
118
119 ; LINUX:   .section        .rodata,"a",@progbits
120 ; LINUX:   .globl  G3
121
122 ; LINUX-SECTIONS: .section        .rodata.G3,"a",@progbits
123 ; LINUX-SECTIONS: .globl  G3
124
125 ; WIN32-SECTIONS: .section        .rdata,"dr",one_only,_G3
126 ; WIN32-SECTIONS: .globl  _G3
127
128
129 ; _Complex long long const G4 = 34;
130 @G4 = private unnamed_addr constant {i64,i64} { i64 34, i64 0 }
131
132 ; DARWIN: .section        __TEXT,__literal16,16byte_literals
133 ; DARWIN: L_G4:
134 ; DARWIN:     .long 34
135
136 ; DARWIN-STATIC: .section        __TEXT,__literal16,16byte_literals
137 ; DARWIN-STATIC: L_G4:
138 ; DARWIN-STATIC:     .long 34
139
140 ; DARWIN64: .section        __TEXT,__literal16,16byte_literals
141 ; DARWIN64: L_G4:
142 ; DARWIN64:     .quad 34
143
144 ; int G5 = 47;
145 @G5 = global i32 47
146
147 ; LINUX: .data
148 ; LINUX: .globl G5
149 ; LINUX: G5:
150 ; LINUX:    .long 47
151
152 ; DARWIN: .section        __DATA,__data
153 ; DARWIN: .globl _G5
154 ; DARWIN: _G5:
155 ; DARWIN:    .long 47
156
157
158 ; PR4584
159 @"foo bar" = linkonce global i32 42
160
161 ; LINUX: .type  "foo bar",@object
162 ; LINUX: .weak  "foo bar"
163 ; LINUX: "foo bar":
164
165 ; DARWIN: .section              __DATA,__datacoal_nt,coalesced
166 ; DARWIN: .globl        "_foo bar"
167 ; DARWIN:       .weak_definition "_foo bar"
168 ; DARWIN: "_foo bar":
169
170 ; PR4650
171 @G6 = weak_odr unnamed_addr constant [1 x i8] c"\01"
172
173 ; LINUX:   .type        G6,@object
174 ; LINUX:   .weak        G6
175 ; LINUX: G6:
176 ; LINUX:   .byte        1
177 ; LINUX:   .size        G6, 1
178
179 ; DARWIN:  .section __TEXT,__const_coal,coalesced
180 ; DARWIN:  .globl _G6
181 ; DARWIN:  .weak_definition _G6
182 ; DARWIN:_G6:
183 ; DARWIN:  .byte 1
184
185
186 @G7 = unnamed_addr constant [10 x i8] c"abcdefghi\00"
187
188 ; DARWIN:       __TEXT,__cstring,cstring_literals
189 ; DARWIN:       .globl _G7
190 ; DARWIN: _G7:
191 ; DARWIN:       .asciz  "abcdefghi"
192
193 ; LINUX:        .section        .rodata.str1.1,"aMS",@progbits,1
194 ; LINUX:        .globl G7
195 ; LINUX: G7:
196 ; LINUX:        .asciz  "abcdefghi"
197
198 ; LINUX-SECTIONS: .section        .rodata.str1.1,"aMS",@progbits,1
199 ; LINUX-SECTIONS:       .globl G7
200
201 ; WIN32-SECTIONS: .section        .rdata,"dr",one_only,_G7
202 ; WIN32-SECTIONS:       .globl _G7
203
204
205 @G8 = unnamed_addr constant [4 x i16] [ i16 1, i16 2, i16 3, i16 0 ]
206
207 ; DARWIN:       .section        __TEXT,__const
208 ; DARWIN:       .globl _G8
209 ; DARWIN: _G8:
210
211 ; LINUX:        .section        .rodata.str2.2,"aMS",@progbits,2
212 ; LINUX:        .globl G8
213 ; LINUX:G8:
214
215 @G9 = unnamed_addr constant [4 x i32] [ i32 1, i32 2, i32 3, i32 0 ]
216
217 ; DARWIN:       .globl _G9
218 ; DARWIN: _G9:
219
220 ; LINUX:        .section        .rodata.str4.4,"aMS",@progbits,4
221 ; LINUX:        .globl G9
222 ; LINUX:G9
223
224
225 @G10 = weak global [100 x i32] zeroinitializer, align 32 ; <[100 x i32]*> [#uses=0]
226
227
228 ; DARWIN:       .section        __DATA,__datacoal_nt,coalesced
229 ; DARWIN: .globl _G10
230 ; DARWIN:       .weak_definition _G10
231 ; DARWIN:       .align  5
232 ; DARWIN: _G10:
233 ; DARWIN:       .space  400
234
235 ; LINUX:        .bss
236 ; LINUX:        .weak   G10
237 ; LINUX:        .align  32
238 ; LINUX: G10:
239 ; LINUX:        .zero   400
240
241
242
243 ;; Zero sized objects should round up to 1 byte in zerofill directives.
244 ; rdar://7886017
245 @G11 = global [0 x i32] zeroinitializer
246 @G12 = global {} zeroinitializer
247 @G13 = global { [0 x {}] } zeroinitializer
248
249 ; DARWIN: .globl _G11
250 ; DARWIN: .zerofill __DATA,__common,_G11,1,2
251 ; DARWIN: .globl _G12
252 ; DARWIN: .zerofill __DATA,__common,_G12,1,3
253 ; DARWIN: .globl _G13
254 ; DARWIN: .zerofill __DATA,__common,_G13,1,3
255
256 @G14 = private unnamed_addr constant [4 x i8] c"foo\00", align 1
257
258 ; LINUX-SECTIONS:        .type   .LG14,@object           # @G14
259 ; LINUX-SECTIONS:        .section        .rodata.str1.1,"aMS",@progbits,1
260 ; LINUX-SECTIONS: .LG14:
261 ; LINUX-SECTIONS:        .asciz  "foo"
262 ; LINUX-SECTIONS:        .size   .LG14, 4
263
264 ; WIN32-SECTIONS:        .section        .rdata,"dr"
265 ; WIN32-SECTIONS: L_G14:
266 ; WIN32-SECTIONS:        .asciz  "foo"
267
268 ; cannot be merged on MachO, but can on other formats.
269 @G15 = unnamed_addr constant i64 0
270
271 ; LINUX: .section        .rodata.cst8,"aM",@progbits,8
272 ; LINUX: G15:
273
274 ; DARWIN: .section      __TEXT,__const
275 ; DARWIN: _G15:
276
277 ; DARWIN-STATIC: .section       __TEXT,__const
278 ; DARWIN-STATIC: _G15:
279
280 ; DARWIN64: .section       __TEXT,__const
281 ; DARWIN64: _G15:
282
283 ; LINUX-SECTIONS: .section      .rodata.cst8,"aM",@progbits,8
284 ; LINUX-SECTIONS: G15:
285
286 ; WIN32-SECTIONS: .section      .rdata,"dr",one_only,_G15
287 ; WIN32-SECTIONS: _G15: