blob: e42ddf449c53f9bdf047067735b9ca9ad3e97ee6 [file] [log] [blame]
Dan Gohman7d7409e2017-02-28 23:37:04 +00001; RUN: llc < %s -asm-verbose=false -disable-wasm-fallthrough-return-opt -disable-wasm-explicit-locals | FileCheck %s
JF Bastien45479f62015-08-26 22:09:54 +00002
3; Test that globals assemble as expected.
4
Dan Gohman0c6f5ac2016-01-07 03:19:23 +00005target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
Dan Gohman7d7409e2017-02-28 23:37:04 +00006target triple = "wasm32-unknown-unknown-wasm"
JF Bastien45479f62015-08-26 22:09:54 +00007
8; CHECK-NOT: llvm.used
9; CHECK-NOT: llvm.metadata
10@llvm.used = appending global [1 x i32*] [i32* @g], section "llvm.metadata"
11
Derek Schuff71e81692015-11-17 00:20:44 +000012; CHECK: foo:
Dan Gohman4b9d7912015-12-15 22:01:29 +000013; CHECK: i32.const $push0=, 0{{$}}
14; CHECK-NEXT: i32.load $push1=, answer($pop0){{$}}
Dan Gohman81719f82015-11-25 16:55:01 +000015; CHECK-NEXT: return $pop1{{$}}
Derek Schuff71e81692015-11-17 00:20:44 +000016define i32 @foo() {
17 %a = load i32, i32* @answer
18 ret i32 %a
19}
20
Dan Gohman2c8fe6a2015-11-25 16:44:29 +000021; CHECK-LABEL: call_memcpy:
22; CHECK-NEXT: .param i32, i32, i32{{$}}
23; CHECK-NEXT: .result i32{{$}}
Dan Gohmanbdf08d52016-01-26 04:01:11 +000024; CHECK-NEXT: i32.call $push0=, memcpy@FUNCTION, $0, $1, $2{{$}}
25; CHECK-NEXT: return $pop0{{$}}
Daniel Neilson1e687242018-01-19 17:13:12 +000026declare void @llvm.memcpy.p0i8.p0i8.i32(i8* nocapture, i8* nocapture readonly, i32, i1)
Dan Gohman2c8fe6a2015-11-25 16:44:29 +000027define i8* @call_memcpy(i8* %p, i8* nocapture readonly %q, i32 %n) {
Daniel Neilson1e687242018-01-19 17:13:12 +000028 tail call void @llvm.memcpy.p0i8.p0i8.i32(i8* %p, i8* %q, i32 %n, i1 false)
Dan Gohman2c8fe6a2015-11-25 16:44:29 +000029 ret i8* %p
30}
31
Dan Gohman0c6f5ac2016-01-07 03:19:23 +000032; CHECK: .type .Lg,@object
Dan Gohman61d15ae2016-01-26 00:03:25 +000033; CHECK: .p2align 2{{$}}
Dan Gohman0c6f5ac2016-01-07 03:19:23 +000034; CHECK-NEXT: .Lg:
Dan Gohmane51c0582015-10-06 00:27:55 +000035; CHECK-NEXT: .int32 1337{{$}}
Dan Gohman0c6f5ac2016-01-07 03:19:23 +000036; CHECK-NEXT: .size .Lg, 4{{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +000037@g = private global i32 1337
JF Bastien45479f62015-08-26 22:09:54 +000038
Dan Gohmane51c0582015-10-06 00:27:55 +000039; CHECK-LABEL: ud:
JF Bastienb9ec4c62016-01-07 23:18:29 +000040; CHECK-NEXT: .skip 4{{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +000041; CHECK-NEXT: .size ud, 4{{$}}
42@ud = internal global i32 undef
JF Bastien45479f62015-08-26 22:09:54 +000043
Dan Gohmane51c0582015-10-06 00:27:55 +000044; CHECK: .type nil,@object
Dan Gohman7d7409e2017-02-28 23:37:04 +000045; CHECK: .p2align 2
46; CHECK: nil:
47; CHECK: .int32 0
48; CHECK: .size nil, 4
Dan Gohmane51c0582015-10-06 00:27:55 +000049@nil = internal global i32 zeroinitializer
JF Bastien45479f62015-08-26 22:09:54 +000050
Dan Gohmane51c0582015-10-06 00:27:55 +000051; CHECK: .type z,@object
Dan Gohman7d7409e2017-02-28 23:37:04 +000052; CHECK: .p2align 2
53; CHECK: z:
54; CHECK: .int32 0
55; CHECK: .size z, 4
Dan Gohmane51c0582015-10-06 00:27:55 +000056@z = internal global i32 0
JF Bastien45479f62015-08-26 22:09:54 +000057
Dan Gohman7d7409e2017-02-28 23:37:04 +000058; CHECK: .type one,@object
59; CHECK: .p2align 2{{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +000060; CHECK-NEXT: one:
61; CHECK-NEXT: .int32 1{{$}}
62; CHECK-NEXT: .size one, 4{{$}}
63@one = internal global i32 1
64
65; CHECK: .type answer,@object
Dan Gohman61d15ae2016-01-26 00:03:25 +000066; CHECK: .p2align 2{{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +000067; CHECK-NEXT: answer:
68; CHECK-NEXT: .int32 42{{$}}
69; CHECK-NEXT: .size answer, 4{{$}}
70@answer = internal global i32 42
71
72; CHECK: .type u32max,@object
Dan Gohman61d15ae2016-01-26 00:03:25 +000073; CHECK: .p2align 2{{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +000074; CHECK-NEXT: u32max:
75; CHECK-NEXT: .int32 4294967295{{$}}
76; CHECK-NEXT: .size u32max, 4{{$}}
77@u32max = internal global i32 -1
78
79; CHECK: .type ud64,@object
Dan Gohman61d15ae2016-01-26 00:03:25 +000080; CHECK: .p2align 3{{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +000081; CHECK-NEXT: ud64:
JF Bastienb9ec4c62016-01-07 23:18:29 +000082; CHECK-NEXT: .skip 8{{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +000083; CHECK-NEXT: .size ud64, 8{{$}}
84@ud64 = internal global i64 undef
85
86; CHECK: .type nil64,@object
Dan Gohman7d7409e2017-02-28 23:37:04 +000087; CHECK: .p2align 3{{$}}
88; CHECK-NEXT: nil64:
89; CHECK-NEXT: .int64 0{{$}}
90; CHECK-NEXT: .size nil64, 8{{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +000091@nil64 = internal global i64 zeroinitializer
92
93; CHECK: .type z64,@object
Dan Gohman7d7409e2017-02-28 23:37:04 +000094; CHECK: .p2align 3{{$}}
95; CHECK-NEXT: z64:
96; CHECK-NEXT: .int64 0{{$}}
97; CHECK-NEXT: .size z64, 8{{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +000098@z64 = internal global i64 0
99
100; CHECK: .type twoP32,@object
Dan Gohman61d15ae2016-01-26 00:03:25 +0000101; CHECK: .p2align 3{{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +0000102; CHECK-NEXT: twoP32:
103; CHECK-NEXT: .int64 4294967296{{$}}
104; CHECK-NEXT: .size twoP32, 8{{$}}
105@twoP32 = internal global i64 4294967296
106
107; CHECK: .type u64max,@object
Dan Gohman61d15ae2016-01-26 00:03:25 +0000108; CHECK: .p2align 3{{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +0000109; CHECK-NEXT: u64max:
110; CHECK-NEXT: .int64 -1{{$}}
111; CHECK-NEXT: .size u64max, 8{{$}}
112@u64max = internal global i64 -1
113
114; CHECK: .type f32ud,@object
Dan Gohman61d15ae2016-01-26 00:03:25 +0000115; CHECK: .p2align 2{{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +0000116; CHECK-NEXT: f32ud:
JF Bastienb9ec4c62016-01-07 23:18:29 +0000117; CHECK-NEXT: .skip 4{{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +0000118; CHECK-NEXT: .size f32ud, 4{{$}}
119@f32ud = internal global float undef
120
121; CHECK: .type f32nil,@object
Dan Gohman7d7409e2017-02-28 23:37:04 +0000122; CHECK: .p2align 2{{$}}
123; CHECK-NEXT: f32nil:
124; CHECK-NEXT: .int32 0{{$}}
125; CHECK-NEXT: .size f32nil, 4{{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +0000126@f32nil = internal global float zeroinitializer
127
128; CHECK: .type f32z,@object
Dan Gohman7d7409e2017-02-28 23:37:04 +0000129; CHECK: .p2align 2{{$}}
130; CHECK-NEXT: f32z:
131; CHECK-NEXT: .int32 0{{$}}
132; CHECK-NEXT: .size f32z, 4{{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +0000133@f32z = internal global float 0.0
134
135; CHECK: .type f32nz,@object
Dan Gohman61d15ae2016-01-26 00:03:25 +0000136; CHECK: .p2align 2{{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +0000137; CHECK: f32nz:
138; CHECK: .int32 2147483648{{$}}
139; CHECK: .size f32nz, 4{{$}}
140@f32nz = internal global float -0.0
141
142; CHECK: .type f32two,@object
Dan Gohman61d15ae2016-01-26 00:03:25 +0000143; CHECK: .p2align 2{{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +0000144; CHECK-NEXT: f32two:
145; CHECK-NEXT: .int32 1073741824{{$}}
146; CHECK-NEXT: .size f32two, 4{{$}}
147@f32two = internal global float 2.0
148
149; CHECK: .type f64ud,@object
Dan Gohman61d15ae2016-01-26 00:03:25 +0000150; CHECK: .p2align 3{{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +0000151; CHECK-NEXT: f64ud:
JF Bastienb9ec4c62016-01-07 23:18:29 +0000152; CHECK-NEXT: .skip 8{{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +0000153; CHECK-NEXT: .size f64ud, 8{{$}}
154@f64ud = internal global double undef
155
156; CHECK: .type f64nil,@object
Dan Gohman7d7409e2017-02-28 23:37:04 +0000157; CHECK: .p2align 3{{$}}
158; CHECK-NEXT: f64nil:
159; CHECK-NEXT: .int64 0{{$}}
160; CHECK-NEXT: .size f64nil, 8{{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +0000161@f64nil = internal global double zeroinitializer
162
163; CHECK: .type f64z,@object
Dan Gohman7d7409e2017-02-28 23:37:04 +0000164; CHECK: .p2align 3{{$}}
165; CHECK-NEXT: f64z:
166; CHECK-NEXT: .int64 0{{$}}
167; CHECK-NEXT: .size f64z, 8{{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +0000168@f64z = internal global double 0.0
169
170; CHECK: .type f64nz,@object
Dan Gohman61d15ae2016-01-26 00:03:25 +0000171; CHECK: .p2align 3{{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +0000172; CHECK-NEXT: f64nz:
173; CHECK-NEXT: .int64 -9223372036854775808{{$}}
174; CHECK-NEXT: .size f64nz, 8{{$}}
175@f64nz = internal global double -0.0
176
177; CHECK: .type f64two,@object
Dan Gohman61d15ae2016-01-26 00:03:25 +0000178; CHECK: .p2align 3{{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +0000179; CHECK-NEXT: f64two:
180; CHECK-NEXT: .int64 4611686018427387904{{$}}
181; CHECK-NEXT: .size f64two, 8{{$}}
182@f64two = internal global double 2.0
JF Bastien65f0a712015-12-15 02:02:51 +0000183
184; Indexing into a global array produces a relocation.
185; CHECK: .type arr,@object
186; CHECK: .type ptr,@object
187; CHECK: ptr:
188; CHECK-NEXT: .int32 arr+80
189; CHECK-NEXT: .size ptr, 4
190@arr = global [128 x i32] zeroinitializer, align 16
191@ptr = global i32* getelementptr inbounds ([128 x i32], [128 x i32]* @arr, i32 0, i32 20), align 4
Dan Gohman670a60e2015-12-17 20:50:45 +0000192
193; Constant global.
194; CHECK: .type rom,@object{{$}}
Dan Gohman7d7409e2017-02-28 23:37:04 +0000195; CHECK: .section .rodata.rom,
Dan Gohman670a60e2015-12-17 20:50:45 +0000196; CHECK: .globl rom{{$}}
Dan Gohman61d15ae2016-01-26 00:03:25 +0000197; CHECK: .p2align 4{{$}}
Dan Gohman670a60e2015-12-17 20:50:45 +0000198; CHECK: rom:
JF Bastienb9ec4c62016-01-07 23:18:29 +0000199; CHECK: .skip 512{{$}}
Dan Gohman670a60e2015-12-17 20:50:45 +0000200; CHECK: .size rom, 512{{$}}
201@rom = constant [128 x i32] zeroinitializer, align 16
Dan Gohman938ff9f2016-01-13 19:29:37 +0000202
203; CHECK: .type array,@object
Dan Gohman7d7409e2017-02-28 23:37:04 +0000204; CHECK: array:
Dan Gohman938ff9f2016-01-13 19:29:37 +0000205; CHECK-NEXT: .skip 8
206; CHECK-NEXT: .size array, 8
207; CHECK: .type pointer_to_array,@object
Dan Gohman7d7409e2017-02-28 23:37:04 +0000208; CHECK-NEXT: .section .data.rel.ro.pointer_to_array,
Dan Gohman938ff9f2016-01-13 19:29:37 +0000209; CHECK-NEXT: .globl pointer_to_array
Dan Gohman61d15ae2016-01-26 00:03:25 +0000210; CHECK-NEXT: .p2align 2
Dan Gohman938ff9f2016-01-13 19:29:37 +0000211; CHECK-NEXT: pointer_to_array:
212; CHECK-NEXT: .int32 array+4
213; CHECK-NEXT: .size pointer_to_array, 4
214@array = internal constant [8 x i8] zeroinitializer, align 1
215@pointer_to_array = constant i8* getelementptr inbounds ([8 x i8], [8 x i8]* @array, i32 0, i32 4), align 4
Dan Gohman5cf64732017-12-07 00:14:30 +0000216
217; Handle external objects with opaque type.
218%struct.ASTRUCT = type opaque
219@g_struct = external global %struct.ASTRUCT, align 1
220define i32 @address_of_opaque() {
221 ret i32 ptrtoint (%struct.ASTRUCT* @g_struct to i32)
222}