| author | |
| committer | |
| log | a1827d597723aff6236001bd0bb74a6b0bab9ce7 |
| tree | 8ac972914895e88893673c9a2b58af529163dc9c |
| parent | 51bb2b3d2d2361eb73ee659a12c32e101b98dd96 |
Closes #260353 files changed, 78 insertions(+), 54 deletions(-)
src/codegen/x86_64/CodeGen.zig+6| ... | ... | @@ -181159,6 +181159,9 @@ fn resolveCallingConventionValues( |
| 181159 | 181159 | else => unreachable, |
| 181160 | 181160 | } |
| 181161 | 181161 | |
| 181162 | const save_param_gpr_index = param_gpr_index; | |
| 181163 | const save_param_sse_index = param_gpr_index; | |
| 181164 | ||
| 181162 | 181165 | var arg_mcv: [4]MCValue = undefined; |
| 181163 | 181166 | var arg_mcv_len: u32 = 0; |
| 181164 | 181167 | |
| ... | ... | @@ -181258,6 +181261,9 @@ fn resolveCallingConventionValues( |
| 181258 | 181261 | continue; |
| 181259 | 181262 | } |
| 181260 | 181263 | |
| 181264 | param_gpr_index = save_param_gpr_index; | |
| 181265 | param_sse_index = save_param_sse_index; | |
| 181266 | ||
| 181261 | 181267 | const param_align = ty.abiAlignment(zcu).max(.@"8"); |
| 181262 | 181268 | result.stack_byte_count = @intCast(param_align.forward(result.stack_byte_count)); |
| 181263 | 181269 | result.stack_align = result.stack_align.max(param_align); |
test/c_abi/cfuncs.c+36-27| ... | ... | @@ -212,55 +212,64 @@ struct Struct_u64_u64 { |
| 212 | 212 | |
| 213 | 213 | struct Struct_u64_u64 zig_ret_struct_u64_u64(void); |
| 214 | 214 | |
| 215 | void zig_struct_u64_u64_0(struct Struct_u64_u64); | |
| 216 | void zig_struct_u64_u64_1(size_t, struct Struct_u64_u64); | |
| 217 | void zig_struct_u64_u64_2(size_t, size_t, struct Struct_u64_u64); | |
| 218 | void zig_struct_u64_u64_3(size_t, size_t, size_t, struct Struct_u64_u64); | |
| 219 | void zig_struct_u64_u64_4(size_t, size_t, size_t, size_t, struct Struct_u64_u64); | |
| 220 | void zig_struct_u64_u64_5(size_t, size_t, size_t, size_t, size_t, struct Struct_u64_u64); | |
| 221 | void zig_struct_u64_u64_6(size_t, size_t, size_t, size_t, size_t, size_t, struct Struct_u64_u64); | |
| 222 | void zig_struct_u64_u64_7(size_t, size_t, size_t, size_t, size_t, size_t, size_t, struct Struct_u64_u64); | |
| 223 | void zig_struct_u64_u64_8(size_t, size_t, size_t, size_t, size_t, size_t, size_t, size_t, struct Struct_u64_u64); | |
| 215 | void zig_struct_u64_u64_0(struct Struct_u64_u64, size_t); | |
| 216 | void zig_struct_u64_u64_1(size_t, struct Struct_u64_u64, size_t); | |
| 217 | void zig_struct_u64_u64_2(size_t, size_t, struct Struct_u64_u64, size_t); | |
| 218 | void zig_struct_u64_u64_3(size_t, size_t, size_t, struct Struct_u64_u64, size_t); | |
| 219 | void zig_struct_u64_u64_4(size_t, size_t, size_t, size_t, struct Struct_u64_u64, size_t); | |
| 220 | void zig_struct_u64_u64_5(size_t, size_t, size_t, size_t, size_t, struct Struct_u64_u64, size_t); | |
| 221 | void zig_struct_u64_u64_6(size_t, size_t, size_t, size_t, size_t, size_t, struct Struct_u64_u64, size_t); | |
| 222 | void zig_struct_u64_u64_7(size_t, size_t, size_t, size_t, size_t, size_t, size_t, struct Struct_u64_u64, size_t); | |
| 223 | void zig_struct_u64_u64_8(size_t, size_t, size_t, size_t, size_t, size_t, size_t, size_t, struct Struct_u64_u64, size_t); | |
| 224 | 224 | |
| 225 | 225 | struct Struct_u64_u64 c_ret_struct_u64_u64(void) { |
| 226 | 226 | return (struct Struct_u64_u64){ 21, 22 }; |
| 227 | 227 | } |
| 228 | 228 | |
| 229 | void c_struct_u64_u64_0(struct Struct_u64_u64 s) { | |
| 229 | void c_struct_u64_u64_0(struct Struct_u64_u64 s, size_t i) { | |
| 230 | 230 | assert_or_panic(s.a == 23); |
| 231 | 231 | assert_or_panic(s.b == 24); |
| 232 | assert_or_panic(i == 1); | |
| 232 | 233 | } |
| 233 | void c_struct_u64_u64_1(size_t, struct Struct_u64_u64 s) { | |
| 234 | void c_struct_u64_u64_1(size_t a0, struct Struct_u64_u64 s, size_t i) { | |
| 234 | 235 | assert_or_panic(s.a == 25); |
| 235 | 236 | assert_or_panic(s.b == 26); |
| 237 | assert_or_panic(i == 2); | |
| 236 | 238 | } |
| 237 | void c_struct_u64_u64_2(size_t, size_t, struct Struct_u64_u64 s) { | |
| 239 | void c_struct_u64_u64_2(size_t, size_t, struct Struct_u64_u64 s, size_t i) { | |
| 238 | 240 | assert_or_panic(s.a == 27); |
| 239 | 241 | assert_or_panic(s.b == 28); |
| 242 | assert_or_panic(i == 3); | |
| 240 | 243 | } |
| 241 | void c_struct_u64_u64_3(size_t, size_t, size_t, struct Struct_u64_u64 s) { | |
| 244 | void c_struct_u64_u64_3(size_t, size_t, size_t, struct Struct_u64_u64 s, size_t i) { | |
| 242 | 245 | assert_or_panic(s.a == 29); |
| 243 | 246 | assert_or_panic(s.b == 30); |
| 247 | assert_or_panic(i == 4); | |
| 244 | 248 | } |
| 245 | void c_struct_u64_u64_4(size_t, size_t, size_t, size_t, struct Struct_u64_u64 s) { | |
| 249 | void c_struct_u64_u64_4(size_t, size_t, size_t, size_t, struct Struct_u64_u64 s, size_t i) { | |
| 246 | 250 | assert_or_panic(s.a == 31); |
| 247 | 251 | assert_or_panic(s.b == 32); |
| 252 | assert_or_panic(i == 5); | |
| 248 | 253 | } |
| 249 | void c_struct_u64_u64_5(size_t, size_t, size_t, size_t, size_t, struct Struct_u64_u64 s) { | |
| 254 | void c_struct_u64_u64_5(size_t, size_t, size_t, size_t, size_t, struct Struct_u64_u64 s, size_t i) { | |
| 250 | 255 | assert_or_panic(s.a == 33); |
| 251 | 256 | assert_or_panic(s.b == 34); |
| 257 | assert_or_panic(i == 6); | |
| 252 | 258 | } |
| 253 | void c_struct_u64_u64_6(size_t, size_t, size_t, size_t, size_t, size_t, struct Struct_u64_u64 s) { | |
| 259 | void c_struct_u64_u64_6(size_t, size_t, size_t, size_t, size_t, size_t, struct Struct_u64_u64 s, size_t i) { | |
| 254 | 260 | assert_or_panic(s.a == 35); |
| 255 | 261 | assert_or_panic(s.b == 36); |
| 262 | assert_or_panic(i == 7); | |
| 256 | 263 | } |
| 257 | void c_struct_u64_u64_7(size_t, size_t, size_t, size_t, size_t, size_t, size_t, struct Struct_u64_u64 s) { | |
| 264 | void c_struct_u64_u64_7(size_t, size_t, size_t, size_t, size_t, size_t, size_t, struct Struct_u64_u64 s, size_t i) { | |
| 258 | 265 | assert_or_panic(s.a == 37); |
| 259 | 266 | assert_or_panic(s.b == 38); |
| 267 | assert_or_panic(i == 8); | |
| 260 | 268 | } |
| 261 | void c_struct_u64_u64_8(size_t, size_t, size_t, size_t, size_t, size_t, size_t, size_t, struct Struct_u64_u64 s) { | |
| 269 | void c_struct_u64_u64_8(size_t, size_t, size_t, size_t, size_t, size_t, size_t, size_t, struct Struct_u64_u64 s, size_t i) { | |
| 262 | 270 | assert_or_panic(s.a == 39); |
| 263 | 271 | assert_or_panic(s.b == 40); |
| 272 | assert_or_panic(i == 9); | |
| 264 | 273 | } |
| 265 | 274 | |
| 266 | 275 | struct Struct_f32 { |
| ... | ... | @@ -2737,15 +2746,15 @@ void run_c_tests(void) { |
| 2737 | 2746 | struct Struct_u64_u64 s = zig_ret_struct_u64_u64(); |
| 2738 | 2747 | assert_or_panic(s.a == 1); |
| 2739 | 2748 | assert_or_panic(s.b == 2); |
| 2740 | zig_struct_u64_u64_0((struct Struct_u64_u64){ .a = 3, .b = 4 }); | |
| 2741 | zig_struct_u64_u64_1(0, (struct Struct_u64_u64){ .a = 5, .b = 6 }); | |
| 2742 | zig_struct_u64_u64_2(0, 1, (struct Struct_u64_u64){ .a = 7, .b = 8 }); | |
| 2743 | zig_struct_u64_u64_3(0, 1, 2, (struct Struct_u64_u64){ .a = 9, .b = 10 }); | |
| 2744 | zig_struct_u64_u64_4(0, 1, 2, 3, (struct Struct_u64_u64){ .a = 11, .b = 12 }); | |
| 2745 | zig_struct_u64_u64_5(0, 1, 2, 3, 4, (struct Struct_u64_u64){ .a = 13, .b = 14 }); | |
| 2746 | zig_struct_u64_u64_6(0, 1, 2, 3, 4, 5, (struct Struct_u64_u64){ .a = 15, .b = 16 }); | |
| 2747 | zig_struct_u64_u64_7(0, 1, 2, 3, 4, 5, 6, (struct Struct_u64_u64){ .a = 17, .b = 18 }); | |
| 2748 | zig_struct_u64_u64_8(0, 1, 2, 3, 4, 5, 6, 7, (struct Struct_u64_u64){ .a = 19, .b = 20 }); | |
| 2749 | zig_struct_u64_u64_0((struct Struct_u64_u64){ .a = 3, .b = 4 }, 1); | |
| 2750 | zig_struct_u64_u64_1(0, (struct Struct_u64_u64){ .a = 5, .b = 6 }, 2); | |
| 2751 | zig_struct_u64_u64_2(0, 1, (struct Struct_u64_u64){ .a = 7, .b = 8 }, 3); | |
| 2752 | zig_struct_u64_u64_3(0, 1, 2, (struct Struct_u64_u64){ .a = 9, .b = 10 }, 4); | |
| 2753 | zig_struct_u64_u64_4(0, 1, 2, 3, (struct Struct_u64_u64){ .a = 11, .b = 12 }, 5); | |
| 2754 | zig_struct_u64_u64_5(0, 1, 2, 3, 4, (struct Struct_u64_u64){ .a = 13, .b = 14 }, 6); | |
| 2755 | zig_struct_u64_u64_6(0, 1, 2, 3, 4, 5, (struct Struct_u64_u64){ .a = 15, .b = 16 }, 7); | |
| 2756 | zig_struct_u64_u64_7(0, 1, 2, 3, 4, 5, 6, (struct Struct_u64_u64){ .a = 17, .b = 18 }, 8); | |
| 2757 | zig_struct_u64_u64_8(0, 1, 2, 3, 4, 5, 6, 7, (struct Struct_u64_u64){ .a = 19, .b = 20 }, 9); | |
| 2749 | 2758 | } |
| 2750 | 2759 | |
| 2751 | 2760 | #if !defined(ZIG_RISCV64) |
test/c_abi/main.zig+36-27| ... | ... | @@ -278,54 +278,63 @@ export fn zig_ret_struct_u64_u64() Struct_u64_u64 { |
| 278 | 278 | return .{ .a = 1, .b = 2 }; |
| 279 | 279 | } |
| 280 | 280 | |
| 281 | export fn zig_struct_u64_u64_0(s: Struct_u64_u64) void { | |
| 281 | export fn zig_struct_u64_u64_0(s: Struct_u64_u64, i: usize) void { | |
| 282 | 282 | expect(s.a == 3) catch @panic("test failure"); |
| 283 | 283 | expect(s.b == 4) catch @panic("test failure"); |
| 284 | expect(i == 1) catch @panic("test failure"); | |
| 284 | 285 | } |
| 285 | export fn zig_struct_u64_u64_1(_: usize, s: Struct_u64_u64) void { | |
| 286 | export fn zig_struct_u64_u64_1(_: usize, s: Struct_u64_u64, i: usize) void { | |
| 286 | 287 | expect(s.a == 5) catch @panic("test failure"); |
| 287 | 288 | expect(s.b == 6) catch @panic("test failure"); |
| 289 | expect(i == 2) catch @panic("test failure"); | |
| 288 | 290 | } |
| 289 | export fn zig_struct_u64_u64_2(_: usize, _: usize, s: Struct_u64_u64) void { | |
| 291 | export fn zig_struct_u64_u64_2(_: usize, _: usize, s: Struct_u64_u64, i: usize) void { | |
| 290 | 292 | expect(s.a == 7) catch @panic("test failure"); |
| 291 | 293 | expect(s.b == 8) catch @panic("test failure"); |
| 294 | expect(i == 3) catch @panic("test failure"); | |
| 292 | 295 | } |
| 293 | export fn zig_struct_u64_u64_3(_: usize, _: usize, _: usize, s: Struct_u64_u64) void { | |
| 296 | export fn zig_struct_u64_u64_3(_: usize, _: usize, _: usize, s: Struct_u64_u64, i: usize) void { | |
| 294 | 297 | expect(s.a == 9) catch @panic("test failure"); |
| 295 | 298 | expect(s.b == 10) catch @panic("test failure"); |
| 299 | expect(i == 4) catch @panic("test failure"); | |
| 296 | 300 | } |
| 297 | export fn zig_struct_u64_u64_4(_: usize, _: usize, _: usize, _: usize, s: Struct_u64_u64) void { | |
| 301 | export fn zig_struct_u64_u64_4(_: usize, _: usize, _: usize, _: usize, s: Struct_u64_u64, i: usize) void { | |
| 298 | 302 | expect(s.a == 11) catch @panic("test failure"); |
| 299 | 303 | expect(s.b == 12) catch @panic("test failure"); |
| 304 | expect(i == 5) catch @panic("test failure"); | |
| 300 | 305 | } |
| 301 | export fn zig_struct_u64_u64_5(_: usize, _: usize, _: usize, _: usize, _: usize, s: Struct_u64_u64) void { | |
| 306 | export fn zig_struct_u64_u64_5(_: usize, _: usize, _: usize, _: usize, _: usize, s: Struct_u64_u64, i: usize) void { | |
| 302 | 307 | expect(s.a == 13) catch @panic("test failure"); |
| 303 | 308 | expect(s.b == 14) catch @panic("test failure"); |
| 309 | expect(i == 6) catch @panic("test failure"); | |
| 304 | 310 | } |
| 305 | export fn zig_struct_u64_u64_6(_: usize, _: usize, _: usize, _: usize, _: usize, _: usize, s: Struct_u64_u64) void { | |
| 311 | export fn zig_struct_u64_u64_6(_: usize, _: usize, _: usize, _: usize, _: usize, _: usize, s: Struct_u64_u64, i: usize) void { | |
| 306 | 312 | expect(s.a == 15) catch @panic("test failure"); |
| 307 | 313 | expect(s.b == 16) catch @panic("test failure"); |
| 314 | expect(i == 7) catch @panic("test failure"); | |
| 308 | 315 | } |
| 309 | export fn zig_struct_u64_u64_7(_: usize, _: usize, _: usize, _: usize, _: usize, _: usize, _: usize, s: Struct_u64_u64) void { | |
| 316 | export fn zig_struct_u64_u64_7(_: usize, _: usize, _: usize, _: usize, _: usize, _: usize, _: usize, s: Struct_u64_u64, i: usize) void { | |
| 310 | 317 | expect(s.a == 17) catch @panic("test failure"); |
| 311 | 318 | expect(s.b == 18) catch @panic("test failure"); |
| 319 | expect(i == 8) catch @panic("test failure"); | |
| 312 | 320 | } |
| 313 | export fn zig_struct_u64_u64_8(_: usize, _: usize, _: usize, _: usize, _: usize, _: usize, _: usize, _: usize, s: Struct_u64_u64) void { | |
| 321 | export fn zig_struct_u64_u64_8(_: usize, _: usize, _: usize, _: usize, _: usize, _: usize, _: usize, _: usize, s: Struct_u64_u64, i: usize) void { | |
| 314 | 322 | expect(s.a == 19) catch @panic("test failure"); |
| 315 | 323 | expect(s.b == 20) catch @panic("test failure"); |
| 324 | expect(i == 9) catch @panic("test failure"); | |
| 316 | 325 | } |
| 317 | 326 | |
| 318 | 327 | extern fn c_ret_struct_u64_u64() Struct_u64_u64; |
| 319 | 328 | |
| 320 | extern fn c_struct_u64_u64_0(Struct_u64_u64) void; | |
| 321 | extern fn c_struct_u64_u64_1(usize, Struct_u64_u64) void; | |
| 322 | extern fn c_struct_u64_u64_2(usize, usize, Struct_u64_u64) void; | |
| 323 | extern fn c_struct_u64_u64_3(usize, usize, usize, Struct_u64_u64) void; | |
| 324 | extern fn c_struct_u64_u64_4(usize, usize, usize, usize, Struct_u64_u64) void; | |
| 325 | extern fn c_struct_u64_u64_5(usize, usize, usize, usize, usize, Struct_u64_u64) void; | |
| 326 | extern fn c_struct_u64_u64_6(usize, usize, usize, usize, usize, usize, Struct_u64_u64) void; | |
| 327 | extern fn c_struct_u64_u64_7(usize, usize, usize, usize, usize, usize, usize, Struct_u64_u64) void; | |
| 328 | extern fn c_struct_u64_u64_8(usize, usize, usize, usize, usize, usize, usize, usize, Struct_u64_u64) void; | |
| 329 | extern fn c_struct_u64_u64_0(Struct_u64_u64, usize) void; | |
| 330 | extern fn c_struct_u64_u64_1(usize, Struct_u64_u64, usize) void; | |
| 331 | extern fn c_struct_u64_u64_2(usize, usize, Struct_u64_u64, usize) void; | |
| 332 | extern fn c_struct_u64_u64_3(usize, usize, usize, Struct_u64_u64, usize) void; | |
| 333 | extern fn c_struct_u64_u64_4(usize, usize, usize, usize, Struct_u64_u64, usize) void; | |
| 334 | extern fn c_struct_u64_u64_5(usize, usize, usize, usize, usize, Struct_u64_u64, usize) void; | |
| 335 | extern fn c_struct_u64_u64_6(usize, usize, usize, usize, usize, usize, Struct_u64_u64, usize) void; | |
| 336 | extern fn c_struct_u64_u64_7(usize, usize, usize, usize, usize, usize, usize, Struct_u64_u64, usize) void; | |
| 337 | extern fn c_struct_u64_u64_8(usize, usize, usize, usize, usize, usize, usize, usize, Struct_u64_u64, usize) void; | |
| 329 | 338 | |
| 330 | 339 | test "C ABI struct u64 u64" { |
| 331 | 340 | if (builtin.cpu.arch.isMIPS64()) return error.SkipZigTest; |
| ... | ... | @@ -336,15 +345,15 @@ test "C ABI struct u64 u64" { |
| 336 | 345 | const s = c_ret_struct_u64_u64(); |
| 337 | 346 | try expect(s.a == 21); |
| 338 | 347 | try expect(s.b == 22); |
| 339 | c_struct_u64_u64_0(.{ .a = 23, .b = 24 }); | |
| 340 | c_struct_u64_u64_1(0, .{ .a = 25, .b = 26 }); | |
| 341 | c_struct_u64_u64_2(0, 1, .{ .a = 27, .b = 28 }); | |
| 342 | c_struct_u64_u64_3(0, 1, 2, .{ .a = 29, .b = 30 }); | |
| 343 | c_struct_u64_u64_4(0, 1, 2, 3, .{ .a = 31, .b = 32 }); | |
| 344 | c_struct_u64_u64_5(0, 1, 2, 3, 4, .{ .a = 33, .b = 34 }); | |
| 345 | c_struct_u64_u64_6(0, 1, 2, 3, 4, 5, .{ .a = 35, .b = 36 }); | |
| 346 | c_struct_u64_u64_7(0, 1, 2, 3, 4, 5, 6, .{ .a = 37, .b = 38 }); | |
| 347 | c_struct_u64_u64_8(0, 1, 2, 3, 4, 5, 6, 7, .{ .a = 39, .b = 40 }); | |
| 348 | c_struct_u64_u64_0(.{ .a = 23, .b = 24 }, 1); | |
| 349 | c_struct_u64_u64_1(0, .{ .a = 25, .b = 26 }, 2); | |
| 350 | c_struct_u64_u64_2(0, 1, .{ .a = 27, .b = 28 }, 3); | |
| 351 | c_struct_u64_u64_3(0, 1, 2, .{ .a = 29, .b = 30 }, 4); | |
| 352 | c_struct_u64_u64_4(0, 1, 2, 3, .{ .a = 31, .b = 32 }, 5); | |
| 353 | c_struct_u64_u64_5(0, 1, 2, 3, 4, .{ .a = 33, .b = 34 }, 6); | |
| 354 | c_struct_u64_u64_6(0, 1, 2, 3, 4, 5, .{ .a = 35, .b = 36 }, 7); | |
| 355 | c_struct_u64_u64_7(0, 1, 2, 3, 4, 5, 6, .{ .a = 37, .b = 38 }, 8); | |
| 356 | c_struct_u64_u64_8(0, 1, 2, 3, 4, 5, 6, 7, .{ .a = 39, .b = 40 }, 9); | |
| 348 | 357 | } |
| 349 | 358 | |
| 350 | 359 | const Struct_f32 = extern struct { |