@@ -72,29 +72,247 @@ pub struct Three32s {
7272 c : u32 ,
7373}
7474
75- extern "C" {
76- fn receives_twou16s ( x : TwoU16s ) ;
77- fn returns_twou16s ( ) -> TwoU16s ;
75+ // CHECK-LABEL: @receives_twou16s
76+ // aarch64-SAME: ([[ABI_TYPE:i64]] {{.*}}[[ABI_VALUE:%.+]])
77+ // loongarch64-SAME: ([[ABI_TYPE:i64]] {{.*}}[[ABI_VALUE:%.+]])
78+ // powerpc64-SAME: ([[ABI_TYPE:i32]] {{.*}}[[ABI_VALUE:%.+]])
79+ // sparc64-SAME: ([[ABI_TYPE:i64]] {{.*}}[[ABI_VALUE:%.+]])
80+ // x86_64-SAME: ([[ABI_TYPE:i32]] {{.*}}[[ABI_VALUE:%.+]])
81+ #[ no_mangle]
82+ #[ inline( never) ]
83+ pub extern "C" fn receives_twou16s ( x : TwoU16s ) {
84+ // aarch64: [[ABI_ALLOCA:%.+]] = alloca [8 x i8], align [[ABI_ALIGN:8]]
85+ // loongarch64: [[ABI_ALLOCA:%.+]] = alloca [8 x i8], align [[ABI_ALIGN:8]]
86+ // powerpc64: [[ABI_ALLOCA:%.+]] = alloca [4 x i8], align [[ABI_ALIGN:4]]
87+ // sparc64: [[ABI_ALLOCA:%.+]] = alloca [8 x i8], align [[ABI_ALIGN:8]]
88+ // x86_64: [[ABI_ALLOCA:%.+]] = alloca [4 x i8], align [[ABI_ALIGN:4]]
89+
90+ // CHECK: [[RUST_ALLOCA:%.+]] = alloca [4 x i8], align [[RUST_ALIGN:2]]
91+
92+ // CHECK: store [[ABI_TYPE]] [[ABI_VALUE]], ptr [[ABI_ALLOCA]], align [[ABI_ALIGN]]
93+
94+ // CHECK: call void @llvm.memcpy.{{.+}}(ptr align [[RUST_ALIGN]] [[RUST_ALLOCA]], ptr align [[ABI_ALIGN]] [[ABI_ALLOCA]], i64 4, i1 false)
95+ }
96+
97+ // CHECK-LABEL: @returns_twou16s
98+ // powerpc64-SAME: sret([4 x i8]) align [[RUST_ALIGN:2]] {{.*}}[[RET_PTR:%.*]])
99+ #[ no_mangle]
100+ #[ inline( never) ]
101+ pub extern "C" fn returns_twou16s ( ) -> TwoU16s {
102+ // powerpc returns this struct via sret pointer, it doesn't use the cast ABI.
103+ // The other targets copy the cast ABI type to an alloca.
104+
105+ // aarch64: [[ABI_ALLOCA:%.+]] = alloca [4 x i8], align [[ABI_ALIGN:2]]
106+ // loongarch64: [[ABI_ALLOCA:%.+]] = alloca [4 x i8], align [[ABI_ALIGN:2]]
107+ // sparc64: [[ABI_ALLOCA:%.+]] = alloca [4 x i8], align [[ABI_ALIGN:2]]
108+ // x86_64: [[ABI_ALLOCA:%.+]] = alloca [4 x i8], align [[ABI_ALIGN:2]]
109+
110+ // aarch64: [[ABI_VALUE:%.+]] = load [[ABI_TYPE:i64]], ptr [[ABI_ALLOCA]], align [[ABI_ALIGN]]
111+ // loongarch64: [[ABI_VALUE:%.+]] = load [[ABI_TYPE:i64]], ptr [[ABI_ALLOCA]], align [[ABI_ALIGN]]
112+ // sparc64: [[ABI_VALUE:%.+]] = load [[ABI_TYPE:i64]], ptr [[ABI_ALLOCA]], align [[ABI_ALIGN]]
113+ // x86_64: [[ABI_VALUE:%.+]] = load [[ABI_TYPE:i32]], ptr [[ABI_ALLOCA]], align [[ABI_ALIGN]]
114+
115+ // aarch64: ret [[ABI_TYPE]] [[ABI_VALUE]]
116+ // loongarch64: ret [[ABI_TYPE]] [[ABI_VALUE]]
117+ // sparc64: ret [[ABI_TYPE]] [[ABI_VALUE]]
118+ // x86_64: ret [[ABI_TYPE]] [[ABI_VALUE]]
119+ TwoU16s { a : 0 , b : 1 }
120+ }
121+
122+ // CHECK-LABEL: @receives_fiveu16s
123+ // aarch64-SAME: ([[ABI_TYPE:\[2 x i64\]]] {{.*}}[[ABI_VALUE:%.+]])
124+ // loongarch64-SAME: ([[ABI_TYPE:\[2 x i64\]]] {{.*}}[[ABI_VALUE:%.+]])
125+ // powerpc64-SAME: ([[ABI_TYPE:\[2 x i64\]]] {{.*}}[[ABI_VALUE:%.+]])
126+ // sparc64-SAME: ([[ABI_TYPE:\[2 x i64\]]] {{.*}}[[ABI_VALUE:%.+]])
127+ // x86_64-SAME: ([[ABI_TYPE:{ i64, i16 }]] {{.*}}[[ABI_VALUE:%.+]])
128+ #[ no_mangle]
129+ #[ inline( never) ]
130+ pub extern "C" fn receives_fiveu16s ( x : FiveU16s ) {
131+ // CHECK: [[ABI_ALLOCA:%.+]] = alloca [16 x i8], align [[ABI_ALIGN:8]]
132+
133+ // CHECK: [[RUST_ALLOCA:%.+]] = alloca [10 x i8], align [[RUST_ALIGN:2]]
134+
135+ // CHECK: store [[ABI_TYPE]] [[ABI_VALUE]], ptr [[ABI_ALLOCA]], align [[ABI_ALIGN]]
136+
137+ // CHECK: call void @llvm.memcpy.{{.+}}(ptr align [[RUST_ALIGN]] [[RUST_ALLOCA]], ptr align [[ABI_ALIGN]] [[ABI_ALLOCA]], i64 10, i1 false)
138+ }
139+
140+ // CHECK-LABEL: @returns_fiveu16s
141+ // powerpc64-SAME: sret([10 x i8]) align [[RUST_ALIGN:2]] {{.*}}[[RET_PTR:%.*]])
142+ #[ no_mangle]
143+ #[ inline( never) ]
144+ pub extern "C" fn returns_fiveu16s ( ) -> FiveU16s {
145+ // powerpc returns this struct via sret pointer, it doesn't use the cast ABI.
146+ // The other targets copy the cast ABI type to an alloca.
147+
148+ // aarch64: [[ABI_ALLOCA:%.+]] = alloca [10 x i8], align [[ABI_ALIGN:2]]
149+ // loongarch64: [[ABI_ALLOCA:%.+]] = alloca [10 x i8], align [[ABI_ALIGN:2]]
150+ // sparc64: [[ABI_ALLOCA:%.+]] = alloca [10 x i8], align [[ABI_ALIGN:2]]
151+ // x86_64: [[ABI_ALLOCA:%.+]] = alloca [10 x i8], align [[ABI_ALIGN:2]]
152+
153+ // aarch64: [[ABI_VALUE:%.+]] = load [[ABI_TYPE:\[2 x i64\]]], ptr [[ABI_ALLOCA]], align [[ABI_ALIGN]]
154+ // loongarch64: [[ABI_VALUE:%.+]] = load [[ABI_TYPE:\[2 x i64\]]], ptr [[ABI_ALLOCA]], align [[ABI_ALIGN]]
155+ // sparc64: [[ABI_VALUE:%.+]] = load [[ABI_TYPE:\[2 x i64\]]], ptr [[ABI_ALLOCA]], align [[ABI_ALIGN]]
156+ // x86_64: [[ABI_VALUE:%.+]] = load [[ABI_TYPE:{ i64, i16 }]], ptr [[ABI_ALLOCA]], align [[ABI_ALIGN]]
157+
158+ // aarch64: ret [[ABI_TYPE]] [[ABI_VALUE]]
159+ // loongarch64: ret [[ABI_TYPE]] [[ABI_VALUE]]
160+ // sparc64: ret [[ABI_TYPE]] [[ABI_VALUE]]
161+ // x86_64: ret [[ABI_TYPE]] [[ABI_VALUE]]
162+ FiveU16s { a : 0 , b : 1 , c : 2 , d : 3 , e : 4 }
163+ }
164+
165+ // CHECK-LABEL: @receives_doubledouble
166+ // aarch64-SAME: ([[ABI_TYPE:\[2 x double\]]] {{.*}}[[ABI_VALUE:%.+]])
167+ // loongarch64-SAME: ([[ABI_TYPE:{ double, double }]] {{.*}}[[ABI_VALUE:%.+]])
168+ // powerpc64-SAME: ([[ABI_TYPE:\[2 x i64\]]] {{.*}}[[ABI_VALUE:%.+]])
169+ // sparc64-SAME: ([[ABI_TYPE:{ double, double }]] {{.*}}[[ABI_VALUE:%.+]])
170+ // x86_64-SAME: ([[ABI_TYPE:{ double, double }]] {{.*}}[[ABI_VALUE:%.+]])
171+ #[ no_mangle]
172+ #[ inline( never) ]
173+ pub extern "C" fn receives_doubledouble ( x : DoubleDouble ) {
174+ // CHECK: [[ABI_ALLOCA:%.+]] = alloca [16 x i8], align [[ABI_ALIGN:8]]
175+
176+ // CHECK: [[RUST_ALLOCA:%.+]] = alloca [16 x i8], align [[RUST_ALIGN:8]]
177+
178+ // CHECK: store [[ABI_TYPE]] [[ABI_VALUE]], ptr [[ABI_ALLOCA]], align [[ABI_ALIGN]]
179+
180+ // CHECK: call void @llvm.memcpy.{{.+}}(ptr align [[RUST_ALIGN]] [[RUST_ALLOCA]], ptr align [[ABI_ALIGN]] [[ABI_ALLOCA]], i64 16, i1 false)
181+ }
182+
183+ // CHECK-LABEL: @returns_doubledouble
184+ // powerpc64-SAME: sret([16 x i8]) align [[RUST_ALIGN:8]] {{.*}}[[RET_PTR:%.*]])
185+ #[ no_mangle]
186+ #[ inline( never) ]
187+ pub extern "C" fn returns_doubledouble ( ) -> DoubleDouble {
188+ // powerpc returns this struct via sret pointer, it doesn't use the cast ABI.
189+ // The other targets copy the cast ABI type to an alloca.
190+
191+ // aarch64: [[ABI_ALLOCA:%.+]] = alloca [16 x i8], align [[ABI_ALIGN:8]]
192+ // loongarch64: [[ABI_ALLOCA:%.+]] = alloca [16 x i8], align [[ABI_ALIGN:8]]
193+ // sparc64: [[ABI_ALLOCA:%.+]] = alloca [16 x i8], align [[ABI_ALIGN:8]]
194+ // x86_64: [[ABI_ALLOCA:%.+]] = alloca [16 x i8], align [[ABI_ALIGN:8]]
78195
79- fn receives_fiveu16s ( x : FiveU16s ) ;
80- fn returns_fiveu16s ( ) -> FiveU16s ;
196+ // aarch64: [[ABI_VALUE:%.+]] = load [[ABI_TYPE:\[2 x double\]]], ptr [[ABI_ALLOCA]], align [[ABI_ALIGN]]
197+ // loongarch64: [[ABI_VALUE:%.+]] = load [[ABI_TYPE:{ double, double }]], ptr [[ABI_ALLOCA]], align [[ABI_ALIGN]]
198+ // sparc64: [[ABI_VALUE:%.+]] = load [[ABI_TYPE:{ double, double }]], ptr [[ABI_ALLOCA]], align [[ABI_ALIGN]]
199+ // x86_64: [[ABI_VALUE:%.+]] = load [[ABI_TYPE:{ double, double }]], ptr [[ABI_ALLOCA]], align [[ABI_ALIGN]]
200+
201+ // aarch64: ret [[ABI_TYPE]] [[ABI_VALUE]]
202+ // loongarch64: ret [[ABI_TYPE]] [[ABI_VALUE]]
203+ // sparc64: ret [[ABI_TYPE]] [[ABI_VALUE]]
204+ // x86_64: ret [[ABI_TYPE]] [[ABI_VALUE]]
205+ DoubleDouble { f : 0. , g : 1. }
206+ }
207+
208+ // CHECK-LABEL: @receives_three32s
209+ // aarch64-SAME: ([[ABI_TYPE:\[2 x i64\]]] {{.*}}[[ABI_VALUE:%.+]])
210+ // loongarch64-SAME: ([[ABI_TYPE:\[2 x i64\]]] {{.*}}[[ABI_VALUE:%.+]])
211+ // powerpc64-SAME: ([[ABI_TYPE:\[2 x i64\]]] {{.*}}[[ABI_VALUE:%.+]])
212+ // sparc64-SAME: ([[ABI_TYPE:\[2 x i64\]]] {{.*}}[[ABI_VALUE:%.+]])
213+ // x86_64-SAME: ([[ABI_TYPE:{ i64, i32 }]] {{.*}}[[ABI_VALUE:%.+]])
214+ #[ no_mangle]
215+ #[ inline( never) ]
216+ pub extern "C" fn receives_three32s ( x : Three32s ) {
217+ // CHECK: [[ABI_ALLOCA:%.+]] = alloca [16 x i8], align [[ABI_ALIGN:8]]
218+
219+ // CHECK: [[RUST_ALLOCA:%.+]] = alloca [12 x i8], align [[RUST_ALIGN:4]]
220+
221+ // CHECK: store [[ABI_TYPE]] [[ABI_VALUE]], ptr [[ABI_ALLOCA]], align [[ABI_ALIGN]]
222+
223+ // CHECK: call void @llvm.memcpy.{{.+}}(ptr align [[RUST_ALIGN]] [[RUST_ALLOCA]], ptr align [[ABI_ALIGN]] [[ABI_ALLOCA]], i64 12, i1 false)
224+ }
225+
226+ // CHECK-LABEL: @returns_three32s
227+ // powerpc64-SAME: sret([12 x i8]) align [[RUST_ALIGN:4]] {{.*}}[[RET_PTR:%.*]])
228+ #[ no_mangle]
229+ #[ inline( never) ]
230+ pub extern "C" fn returns_three32s ( ) -> Three32s {
231+ // powerpc returns this struct via sret pointer, it doesn't use the cast ABI.
232+ // The other targets copy the cast ABI type to an alloca.
233+
234+ // aarch64: [[ABI_ALLOCA:%.+]] = alloca [12 x i8], align [[ABI_ALIGN:4]]
235+ // loongarch64: [[ABI_ALLOCA:%.+]] = alloca [12 x i8], align [[ABI_ALIGN:4]]
236+ // sparc64: [[ABI_ALLOCA:%.+]] = alloca [12 x i8], align [[ABI_ALIGN:4]]
237+ // x86_64: [[ABI_ALLOCA:%.+]] = alloca [12 x i8], align [[ABI_ALIGN:4]]
81238
82- fn receives_doubledouble ( x : DoubleDouble ) ;
83- fn returns_doubledouble ( ) -> DoubleDouble ;
239+ // aarch64: [[ABI_VALUE:%.+]] = load [[ABI_TYPE:\[2 x i64\]]], ptr [[ABI_ALLOCA]], align [[ABI_ALIGN]]
240+ // loongarch64: [[ABI_VALUE:%.+]] = load [[ABI_TYPE:\[2 x i64\]]], ptr [[ABI_ALLOCA]], align [[ABI_ALIGN]]
241+ // sparc64: [[ABI_VALUE:%.+]] = load [[ABI_TYPE:\[2 x i64\]]], ptr [[ABI_ALLOCA]], align [[ABI_ALIGN]]
242+ // x86_64: [[ABI_VALUE:%.+]] = load [[ABI_TYPE:{ i64, i32 }]], ptr [[ABI_ALLOCA]], align [[ABI_ALIGN]]
84243
85- fn receives_three32s ( x : Three32s ) ;
86- fn returns_three32s ( ) -> Three32s ;
244+ // aarch64: ret [[ABI_TYPE]] [[ABI_VALUE]]
245+ // loongarch64: ret [[ABI_TYPE]] [[ABI_VALUE]]
246+ // sparc64: ret [[ABI_TYPE]] [[ABI_VALUE]]
247+ // x86_64: ret [[ABI_TYPE]] [[ABI_VALUE]]
248+ Three32s { a : 0 , b : 0 , c : 0 }
249+ }
250+
251+ // These functions cause an ICE in sparc64 ABI code (https://github.com/rust-lang/rust/issues/122620)
252+ #[ cfg( not( target_arch = "sparc64" ) ) ]
253+ // aarch64-LABEL: @receives_doublefloat
254+ // loongarch64-LABEL: @receives_doublefloat
255+ // powerpc64-LABEL: @receives_doublefloat
256+ // x86_64-LABEL: @receives_doublefloat
257+
258+ // aarch64-SAME: ([[ABI_TYPE:\[2 x i64\]]] {{.*}}[[ABI_VALUE:%.+]])
259+ // loongarch64-SAME: ([[ABI_TYPE:{ double, float }]] {{.*}}[[ABI_VALUE:%.+]])
260+ // powerpc64-SAME: ([[ABI_TYPE:\[2 x i64\]]] {{.*}}[[ABI_VALUE:%.+]])
261+ // x86_64-SAME: ([[ABI_TYPE:{ double, double }]] {{.*}}[[ABI_VALUE:%.+]])
262+ #[ no_mangle]
263+ #[ inline( never) ]
264+ pub extern "C" fn receives_doublefloat ( x : DoubleFloat ) {
265+ // aarch64: [[ABI_ALLOCA:%.+]] = alloca [16 x i8], align [[ABI_ALIGN:8]]
266+ // loongarch64: [[ABI_ALLOCA:%.+]] = alloca [16 x i8], align [[ABI_ALIGN:8]]
267+ // powerpc64: [[ABI_ALLOCA:%.+]] = alloca [16 x i8], align [[ABI_ALIGN:8]]
268+ // x86_64: [[ABI_ALLOCA:%.+]] = alloca [16 x i8], align [[ABI_ALIGN:8]]
269+
270+ // aarch64: [[RUST_ALLOCA:%.+]] = alloca [16 x i8], align [[RUST_ALIGN:8]]
271+ // loongarch64: [[RUST_ALLOCA:%.+]] = alloca [16 x i8], align [[RUST_ALIGN:8]]
272+ // powerpc64: [[RUST_ALLOCA:%.+]] = alloca [16 x i8], align [[RUST_ALIGN:8]]
273+ // x86_64: [[RUST_ALLOCA:%.+]] = alloca [16 x i8], align [[RUST_ALIGN:8]]
274+
275+ // aarch64: store [[ABI_TYPE]] [[ABI_VALUE]], ptr [[ABI_ALLOCA]], align [[ABI_ALIGN]]
276+ // loongarch64: store [[ABI_TYPE]] [[ABI_VALUE]], ptr [[ABI_ALLOCA]], align [[ABI_ALIGN]]
277+ // powerpc64: store [[ABI_TYPE]] [[ABI_VALUE]], ptr [[ABI_ALLOCA]], align [[ABI_ALIGN]]
278+ // x86_64: store [[ABI_TYPE]] [[ABI_VALUE]], ptr [[ABI_ALLOCA]], align [[ABI_ALIGN]]
279+
280+ // aarch64: call void @llvm.memcpy.{{.+}}(ptr align [[RUST_ALIGN]] [[RUST_ALLOCA]], ptr align [[ABI_ALIGN]] [[ABI_ALLOCA]], i64 16, i1 false)
281+ // loongarch64: call void @llvm.memcpy.{{.+}}(ptr align [[RUST_ALIGN]] [[RUST_ALLOCA]], ptr align [[ABI_ALIGN]] [[ABI_ALLOCA]], i64 12, i1 false)
282+ // powerpc64: call void @llvm.memcpy.{{.+}}(ptr align [[RUST_ALIGN]] [[RUST_ALLOCA]], ptr align [[ABI_ALIGN]] [[ABI_ALLOCA]], i64 16, i1 false)
283+ // x86_64: call void @llvm.memcpy.{{.+}}(ptr align [[RUST_ALIGN]] [[RUST_ALLOCA]], ptr align [[ABI_ALIGN]] [[ABI_ALLOCA]], i64 16, i1 false)
284+ }
285+
286+ #[ cfg( not( target_arch = "sparc64" ) ) ]
287+ // aarch64-LABEL: @returns_doublefloat
288+ // loongarch64-LABEL: @returns_doublefloat
289+ // powerpc64-LABEL: @returns_doublefloat
290+ // x86_64-LABEL: @returns_doublefloat
291+
292+ // powerpc64-SAME: sret([16 x i8]) align [[RUST_ALIGN:8]] {{.*}}[[RET_PTR:%.*]])
293+ #[ no_mangle]
294+ #[ inline( never) ]
295+ pub extern "C" fn returns_doublefloat ( ) -> DoubleFloat {
296+ // powerpc returns this struct via sret pointer, it doesn't use the cast ABI.
297+ // The other targets copy the cast ABI type to an alloca.
298+
299+ // aarch64: [[ABI_ALLOCA:%.+]] = alloca [16 x i8], align [[ABI_ALIGN:8]]
300+ // loongarch64: [[ABI_ALLOCA:%.+]] = alloca [16 x i8], align [[ABI_ALIGN:8]]
301+ // x86_64: [[ABI_ALLOCA:%.+]] = alloca [16 x i8], align [[ABI_ALIGN:8]]
302+
303+ // aarch64: [[ABI_VALUE:%.+]] = load [[ABI_TYPE:\[2 x i64\]]], ptr [[ABI_ALLOCA]], align [[ABI_ALIGN]]
304+ // loongarch64: [[ABI_VALUE:%.+]] = load [[ABI_TYPE:{ double, float }]], ptr [[ABI_ALLOCA]], align [[ABI_ALIGN]]
305+ // x86_64: [[ABI_VALUE:%.+]] = load [[ABI_TYPE:{ double, double }]], ptr [[ABI_ALLOCA]], align [[ABI_ALIGN]]
87306
88- // These functions cause an ICE in sparc64 ABI code (https://github.com/rust-lang/rust/issues/122620)
89- #[ cfg( not( target_arch = "sparc64" ) ) ]
90- fn receives_doublefloat ( x : DoubleFloat ) ;
91- #[ cfg( not( target_arch = "sparc64" ) ) ]
92- fn returns_doublefloat ( ) -> DoubleFloat ;
307+ // aarch64: ret [[ABI_TYPE]] [[ABI_VALUE]]
308+ // loongarch64: ret [[ABI_TYPE]] [[ABI_VALUE]]
309+ // x86_64: ret [[ABI_TYPE]] [[ABI_VALUE]]
310+ DoubleFloat { f : 0. , g : 0. }
93311}
94312
95313// CHECK-LABEL: @call_twou16s
96314#[ no_mangle]
97- pub unsafe fn call_twou16s ( ) {
315+ pub fn call_twou16s ( ) {
98316 // aarch64: [[ABI_ALLOCA:%.+]] = alloca [8 x i8], align [[ABI_ALIGN:8]]
99317 // loongarch64: [[ABI_ALLOCA:%.+]] = alloca [8 x i8], align [[ABI_ALIGN:8]]
100318 // powerpc64: [[ABI_ALLOCA:%.+]] = alloca [4 x i8], align [[ABI_ALIGN:4]]
@@ -118,7 +336,7 @@ pub unsafe fn call_twou16s() {
118336
119337// CHECK-LABEL: @return_twou16s
120338#[ no_mangle]
121- pub unsafe fn return_twou16s ( ) -> TwoU16s {
339+ pub fn return_twou16s ( ) -> TwoU16s {
122340 // powerpc returns this struct via sret pointer, it doesn't use the cast ABI.
123341
124342 // powerpc64: [[RETVAL:%.+]] = alloca [4 x i8], align 2
@@ -155,7 +373,7 @@ pub unsafe fn return_twou16s() -> TwoU16s {
155373
156374// CHECK-LABEL: @call_fiveu16s
157375#[ no_mangle]
158- pub unsafe fn call_fiveu16s ( ) {
376+ pub fn call_fiveu16s ( ) {
159377 // CHECK: [[ABI_ALLOCA:%.+]] = alloca [16 x i8], align [[ABI_ALIGN:8]]
160378
161379 // CHECK: [[RUST_ALLOCA:%.+]] = alloca [10 x i8], align 2
@@ -176,7 +394,7 @@ pub unsafe fn call_fiveu16s() {
176394// CHECK-LABEL: @return_fiveu16s
177395// CHECK-SAME: (ptr {{.+}} sret([10 x i8]) align [[RUST_ALIGN:2]] dereferenceable(10) [[RET_PTR:%.+]])
178396#[ no_mangle]
179- pub unsafe fn return_fiveu16s ( ) -> FiveU16s {
397+ pub fn return_fiveu16s ( ) -> FiveU16s {
180398 // powerpc returns this struct via sret pointer, it doesn't use the cast ABI.
181399
182400 // powerpc64: call void @returns_fiveu16s(ptr {{.+}} [[RET_PTR]])
@@ -207,7 +425,7 @@ pub unsafe fn return_fiveu16s() -> FiveU16s {
207425
208426// CHECK-LABEL: @call_doubledouble
209427#[ no_mangle]
210- pub unsafe fn call_doubledouble ( ) {
428+ pub fn call_doubledouble ( ) {
211429 // CHECK: [[ABI_ALLOCA:%.+]] = alloca [16 x i8], align [[ABI_ALIGN:8]]
212430
213431 // CHECK: [[RUST_ALLOCA:%.+]] = alloca [16 x i8], align [[RUST_ALIGN:8]]
@@ -227,7 +445,7 @@ pub unsafe fn call_doubledouble() {
227445
228446// CHECK-LABEL: @return_doubledouble
229447#[ no_mangle]
230- pub unsafe fn return_doubledouble ( ) -> DoubleDouble {
448+ pub fn return_doubledouble ( ) -> DoubleDouble {
231449 // powerpc returns this struct via sret pointer, it doesn't use the cast ABI.
232450
233451 // powerpc64: [[RETVAL:%.+]] = alloca [16 x i8], align 8
@@ -269,7 +487,7 @@ pub unsafe fn return_doubledouble() -> DoubleDouble {
269487// powerpc64-LABEL: @call_doublefloat
270488// x86_64-LABEL: @call_doublefloat
271489#[ no_mangle]
272- pub unsafe fn call_doublefloat ( ) {
490+ pub fn call_doublefloat ( ) {
273491 // aarch64: [[ABI_ALLOCA:%.+]] = alloca [16 x i8], align [[ABI_ALIGN:8]]
274492 // loongarch64: [[ABI_ALLOCA:%.+]] = alloca [16 x i8], align [[ABI_ALIGN:8]]
275493 // powerpc64: [[ABI_ALLOCA:%.+]] = alloca [16 x i8], align [[ABI_ALIGN:8]]
@@ -305,7 +523,7 @@ pub unsafe fn call_doublefloat() {
305523// powerpc64-LABEL: @return_doublefloat
306524// x86_64-LABEL: @return_doublefloat
307525#[ no_mangle]
308- pub unsafe fn return_doublefloat ( ) -> DoubleFloat {
526+ pub fn return_doublefloat ( ) -> DoubleFloat {
309527 // powerpc returns this struct via sret pointer, it doesn't use the cast ABI.
310528
311529 // powerpc64: [[RETVAL:%.+]] = alloca [16 x i8], align 8
@@ -337,7 +555,7 @@ pub unsafe fn return_doublefloat() -> DoubleFloat {
337555
338556// CHECK-LABEL: @call_three32s
339557#[ no_mangle]
340- pub unsafe fn call_three32s ( ) {
558+ pub fn call_three32s ( ) {
341559 // CHECK: [[ABI_ALLOCA:%.+]] = alloca [16 x i8], align [[ABI_ALIGN:8]]
342560 // CHECK: [[RUST_ALLOCA:%.+]] = alloca [12 x i8], align [[RUST_ALIGN:4]]
343561 // CHECK: call void @llvm.memcpy.{{.+}}(ptr align [[ABI_ALIGN]] [[ABI_ALLOCA]], ptr align [[RUST_ALIGN]] [[RUST_ALLOCA]], i64 12, i1 false)
@@ -357,7 +575,7 @@ pub unsafe fn call_three32s() {
357575// CHECK-LABEL: @return_three32s(
358576// CHECK-SAME: sret([12 x i8]) align [[RUST_ALIGN:4]] {{.*}}[[RUST_RETVAL:%.*]])
359577#[ no_mangle]
360- pub unsafe fn return_three32s ( ) -> Three32s {
578+ pub fn return_three32s ( ) -> Three32s {
361579 // powerpc returns this struct via sret pointer, it doesn't use the cast ABI.
362580
363581 // powerpc64: call void @returns_three32s(ptr {{.+}} [[RUST_RETVAL]])
0 commit comments