aboutsummaryrefslogtreecommitdiff
path: root/test/stage1
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2022-02-07 14:32:24 -0700
committerAndrew Kelley <andrew@ziglang.org>2022-02-08 20:10:55 -0700
commit61ed4fe07ad660f3cb4372937ccd5188ce404a44 (patch)
treeb8baa621a18dfb06d86b9cd48774cc4c525a4d74 /test/stage1
parent7c1061784b8b126633cfe84f46280f7bf72beffc (diff)
downloadzig-61ed4fe07ad660f3cb4372937ccd5188ce404a44.tar.gz
zig-61ed4fe07ad660f3cb4372937ccd5188ce404a44.zip
stage1: fix x86 i128 C ABI for extern structs
closes #10445
Diffstat (limited to 'test/stage1')
-rw-r--r--test/stage1/c_abi/cfuncs.c38
-rw-r--r--test/stage1/c_abi/main.zig27
2 files changed, 65 insertions, 0 deletions
diff --git a/test/stage1/c_abi/cfuncs.c b/test/stage1/c_abi/cfuncs.c
index a2a5895ab4..28009e6fc7 100644
--- a/test/stage1/c_abi/cfuncs.c
+++ b/test/stage1/c_abi/cfuncs.c
@@ -11,14 +11,26 @@ static void assert_or_panic(bool ok) {
}
}
+struct i128 {
+ __int128 value;
+};
+
+struct u128 {
+ unsigned __int128 value;
+};
+
void zig_u8(uint8_t);
void zig_u16(uint16_t);
void zig_u32(uint32_t);
void zig_u64(uint64_t);
+void zig_u128(unsigned __int128);
+void zig_struct_u128(struct u128);
void zig_i8(int8_t);
void zig_i16(int16_t);
void zig_i32(int32_t);
void zig_i64(int64_t);
+void zig_i128(__int128);
+void zig_struct_i128(struct i128);
void zig_five_integers(int32_t, int32_t, int32_t, int32_t, int32_t);
void zig_f32(float);
@@ -130,11 +142,21 @@ void run_c_tests(void) {
zig_u16(0xfffe);
zig_u32(0xfffffffd);
zig_u64(0xfffffffffffffffc);
+ zig_u128(0xfffffffffffffffc);
+ {
+ struct u128 s = {0xfffffffffffffffc};
+ zig_struct_u128(s);
+ }
zig_i8(-1);
zig_i16(-2);
zig_i32(-3);
zig_i64(-4);
+ zig_i128(-5);
+ {
+ struct i128 s = {-6};
+ zig_struct_i128(s);
+ }
zig_five_integers(12, 34, 56, 78, 90);
zig_f32(12.34f);
@@ -221,6 +243,14 @@ void c_u64(uint64_t x) {
assert_or_panic(x == 0xfffffffffffffffcULL);
}
+void c_u128(unsigned __int128 x) {
+ assert_or_panic(x == 0xfffffffffffffffcULL);
+}
+
+void c_struct_u128(struct u128 x) {
+ assert_or_panic(x.value == 0xfffffffffffffffcULL);
+}
+
void c_i8(int8_t x) {
assert_or_panic(x == -1);
}
@@ -237,6 +267,14 @@ void c_i64(int64_t x) {
assert_or_panic(x == -4);
}
+void c_i128(__int128 x) {
+ assert_or_panic(x == -5);
+}
+
+void c_struct_i128(struct i128 x) {
+ assert_or_panic(x.value == -6);
+}
+
void c_f32(float x) {
assert_or_panic(x == 12.34f);
}
diff --git a/test/stage1/c_abi/main.zig b/test/stage1/c_abi/main.zig
index abd9be4922..132f440dfc 100644
--- a/test/stage1/c_abi/main.zig
+++ b/test/stage1/c_abi/main.zig
@@ -16,10 +16,14 @@ extern fn c_u8(u8) void;
extern fn c_u16(u16) void;
extern fn c_u32(u32) void;
extern fn c_u64(u64) void;
+extern fn c_u128(u128) void;
+extern fn c_struct_u128(U128) void;
extern fn c_i8(i8) void;
extern fn c_i16(i16) void;
extern fn c_i32(i32) void;
extern fn c_i64(i64) void;
+extern fn c_i128(i128) void;
+extern fn c_struct_i128(I128) void;
// On windows x64, the first 4 are passed via registers, others on the stack.
extern fn c_five_integers(i32, i32, i32, i32, i32) void;
@@ -37,11 +41,15 @@ test "C ABI integers" {
c_u16(0xfffe);
c_u32(0xfffffffd);
c_u64(0xfffffffffffffffc);
+ c_u128(0xfffffffffffffffc);
+ c_struct_u128(.{ .value = 0xfffffffffffffffc });
c_i8(-1);
c_i16(-2);
c_i32(-3);
c_i64(-4);
+ c_i128(-5);
+ c_struct_i128(.{ .value = -6 });
c_five_integers(12, 34, 56, 78, 90);
}
@@ -57,6 +65,9 @@ export fn zig_u32(x: u32) void {
export fn zig_u64(x: u64) void {
expect(x == 0xfffffffffffffffc) catch @panic("test failure");
}
+export fn zig_u128(x: u128) void {
+ expect(x == 0xfffffffffffffffc) catch @panic("test failure");
+}
export fn zig_i8(x: i8) void {
expect(x == -1) catch @panic("test failure");
}
@@ -69,6 +80,22 @@ export fn zig_i32(x: i32) void {
export fn zig_i64(x: i64) void {
expect(x == -4) catch @panic("test failure");
}
+export fn zig_i128(x: i128) void {
+ expect(x == -5) catch @panic("test failure");
+}
+
+const I128 = extern struct {
+ value: i128,
+};
+const U128 = extern struct {
+ value: u128,
+};
+export fn zig_struct_i128(a: I128) void {
+ expect(a.value == -6) catch @panic("test failure");
+}
+export fn zig_struct_u128(a: U128) void {
+ expect(a.value == 0xfffffffffffffffc) catch @panic("test failure");
+}
extern fn c_f32(f32) void;
extern fn c_f64(f64) void;