1
+ // ignore-tidy-linelength
1
2
// revisions:m68k wasm x86_64-linux x86_64-windows i686-linux i686-windows
2
3
3
4
//[m68k] compile-flags: --target m68k-unknown-linux-gnu
29
30
impl Copy for i32 { }
30
31
impl Copy for i64 { }
31
32
33
+ // This struct can be represented as a pair, so it exercises the OperandValue::Pair
34
+ // codepath in `codegen_argument`.
35
+ #[ repr( C ) ]
36
+ pub struct NaturalAlign1 {
37
+ a : i8 ,
38
+ b : i8 ,
39
+ }
40
+
41
+ // This struct cannot be represented as an immediate, so it exercises the OperandValue::Ref
42
+ // codepath in `codegen_argument`.
32
43
#[ repr( C ) ]
33
44
pub struct NaturalAlign2 {
34
45
a : [ i16 ; 16 ] ,
@@ -67,7 +78,93 @@ pub struct ForceAlign16 {
67
78
b : i8
68
79
}
69
80
81
+ // CHECK-LABEL: @call_na1
82
+ #[ no_mangle]
83
+ pub unsafe fn call_na1 ( x : NaturalAlign1 ) {
84
+ // CHECK: start:
85
+
86
+ // m68k: [[ALLOCA:%[a-z0-9+]]] = alloca { i8, i8 }, align 1
87
+ // m68k: call void @natural_align_1({{.*}}byval({ i8, i8 }) align 1{{.*}} [[ALLOCA]])
88
+
89
+ // wasm: [[ALLOCA:%[a-z0-9+]]] = alloca { i8, i8 }, align 1
90
+ // wasm: call void @natural_align_1({{.*}}byval({ i8, i8 }) align 1{{.*}} [[ALLOCA]])
91
+
92
+ // x86_64-linux: call void @natural_align_1(i16
93
+
94
+ // x86_64-windows: call void @natural_align_1(i16
95
+
96
+ // i686-linux: [[ALLOCA:%[a-z0-9+]]] = alloca { i8, i8 }, align 4
97
+ // i686-linux: call void @natural_align_1({{.*}}byval({ i8, i8 }) align 4{{.*}} [[ALLOCA]])
98
+
99
+ // i686-windows: [[ALLOCA:%[a-z0-9+]]] = alloca { i8, i8 }, align 4
100
+ // i686-windows: call void @natural_align_1({{.*}}byval({ i8, i8 }) align 4{{.*}} [[ALLOCA]])
101
+ natural_align_1 ( x) ;
102
+ }
103
+
104
+ // CHECK-LABEL: @call_na2
105
+ #[ no_mangle]
106
+ pub unsafe fn call_na2 ( x : NaturalAlign2 ) {
107
+ // CHECK: start:
108
+
109
+ // m68k-NEXT: call void @natural_align_2
110
+ // wasm-NEXT: call void @natural_align_2
111
+ // x86_64-linux-NEXT: call void @natural_align_2
112
+ // x86_64-windows-NEXT: call void @natural_align_2
113
+
114
+ // i686-linux: [[ALLOCA:%[0-9]+]] = alloca %NaturalAlign2, align 4
115
+ // i686-linux: call void @natural_align_2({{.*}}byval(%NaturalAlign2) align 4{{.*}} [[ALLOCA]])
116
+
117
+ // i686-windows: [[ALLOCA:%[0-9]+]] = alloca %NaturalAlign2, align 4
118
+ // i686-windows: call void @natural_align_2({{.*}}byval(%NaturalAlign2) align 4{{.*}} [[ALLOCA]])
119
+ natural_align_2 ( x) ;
120
+ }
121
+
122
+ // CHECK-LABEL: @call_fa4
123
+ #[ no_mangle]
124
+ pub unsafe fn call_fa4 ( x : ForceAlign4 ) {
125
+ // CHECK: start:
126
+ // CHECK-NEXT: call void @force_align_4
127
+ force_align_4 ( x) ;
128
+ }
129
+
130
+ // CHECK-LABEL: @call_na8
131
+ #[ no_mangle]
132
+ pub unsafe fn call_na8 ( x : NaturalAlign8 ) {
133
+ // CHECK: start:
134
+ // CHECK-NEXT: call void @natural_align_8
135
+ natural_align_8 ( x) ;
136
+ }
137
+
138
+ // CHECK-LABEL: @call_fa8
139
+ #[ no_mangle]
140
+ pub unsafe fn call_fa8 ( x : ForceAlign8 ) {
141
+ // CHECK: start:
142
+ // CHECK-NEXT: call void @force_align_8
143
+ force_align_8 ( x) ;
144
+ }
145
+
146
+ // CHECK-LABEL: @call_fa16
147
+ #[ no_mangle]
148
+ pub unsafe fn call_fa16 ( x : ForceAlign16 ) {
149
+ // CHECK: start:
150
+ // CHECK-NEXT: call void @force_align_16
151
+ force_align_16 ( x) ;
152
+ }
153
+
70
154
extern "C" {
155
+ // m68k: declare void @natural_align_1({{.*}}byval({ i8, i8 }) align 1{{.*}})
156
+
157
+ // wasm: declare void @natural_align_1({{.*}}byval({ i8, i8 }) align 1{{.*}})
158
+
159
+ // x86_64-linux: declare void @natural_align_1(i16)
160
+
161
+ // x86_64-windows: declare void @natural_align_1(i16)
162
+
163
+ // i686-linux: declare void @natural_align_1({{.*}}byval({ i8, i8 }) align 4{{.*}})
164
+
165
+ // i686-windows: declare void @natural_align_1({{.*}}byval({ i8, i8 }) align 4{{.*}})
166
+ fn natural_align_1 ( x : NaturalAlign1 ) ;
167
+
71
168
// m68k: declare void @natural_align_2({{.*}}byval(%NaturalAlign2) align 2{{.*}})
72
169
73
170
// wasm: declare void @natural_align_2({{.*}}byval(%NaturalAlign2) align 2{{.*}})
@@ -81,7 +178,7 @@ extern "C" {
81
178
// i686-linux: declare void @natural_align_2({{.*}}byval(%NaturalAlign2) align 4{{.*}})
82
179
83
180
// i686-windows: declare void @natural_align_2({{.*}}byval(%NaturalAlign2) align 4{{.*}})
84
- fn natural_align_2 ( a : NaturalAlign2 ) ;
181
+ fn natural_align_2 ( x : NaturalAlign2 ) ;
85
182
86
183
// m68k: declare void @force_align_4({{.*}}byval(%ForceAlign4) align 4{{.*}})
87
184
@@ -96,7 +193,7 @@ extern "C" {
96
193
// i686-linux: declare void @force_align_4({{.*}}byval(%ForceAlign4) align 4{{.*}})
97
194
98
195
// i686-windows: declare void @force_align_4({{.*}}byval(%ForceAlign4) align 4{{.*}})
99
- fn force_align_4 ( b : ForceAlign4 ) ;
196
+ fn force_align_4 ( x : ForceAlign4 ) ;
100
197
101
198
// m68k: declare void @natural_align_8({{.*}}byval(%NaturalAlign8) align 4{{.*}})
102
199
@@ -128,7 +225,7 @@ extern "C" {
128
225
// i686-windows: declare void @force_align_8(
129
226
// i686-windows-NOT: byval
130
227
// i686-windows-SAME: align 8{{.*}})
131
- fn force_align_8 ( y : ForceAlign8 ) ;
228
+ fn force_align_8 ( x : ForceAlign8 ) ;
132
229
133
230
// m68k: declare void @force_align_16({{.*}}byval(%ForceAlign16) align 16{{.*}})
134
231
@@ -145,16 +242,5 @@ extern "C" {
145
242
// i686-windows: declare void @force_align_16(
146
243
// i686-windows-NOT: byval
147
244
// i686-windows-SAME: align 16{{.*}})
148
- fn force_align_16 ( z : ForceAlign16 ) ;
149
- }
150
-
151
- pub unsafe fn main (
152
- a : NaturalAlign2 , b : ForceAlign4 ,
153
- x : NaturalAlign8 , y : ForceAlign8 , z : ForceAlign16
154
- ) {
155
- natural_align_2 ( a) ;
156
- force_align_4 ( b) ;
157
- natural_align_8 ( x) ;
158
- force_align_8 ( y) ;
159
- force_align_16 ( z) ;
245
+ fn force_align_16 ( x : ForceAlign16 ) ;
160
246
}
0 commit comments