From 7e946bc790c245242af3716199878cf99c369d48 Mon Sep 17 00:00:00 2001 From: Veikka Tuominen Date: Thu, 20 Oct 2022 10:52:26 +0300 Subject: [PATCH] make C ABI tests compile on i386 --- test/c_abi/cfuncs.c | 39 +++++++++++++++++++++++++++++++++++++++ test/c_abi/main.zig | 23 +++++++++++++++++++++-- 2 files changed, 60 insertions(+), 2 deletions(-) diff --git a/test/c_abi/cfuncs.c b/test/c_abi/cfuncs.c index 382840e2aa17f3fe0385779bae8c9e742b9ca911..c18accd4d6670f3807509d388e20ebe68970eb66 100644 --- a/test/c_abi/cfuncs.c +++ b/test/c_abi/cfuncs.c @@ -12,6 +12,15 @@ static void assert_or_panic(bool ok) { } } +#ifdef __i386__ +# define ZIG_NO_I128 +#endif + +#ifdef __i386__ +# define ZIG_NO_COMPLEX +#endif + +#ifndef ZIG_NO_I128 struct i128 { __int128 value; }; @@ -19,17 +28,22 @@ struct i128 { struct u128 { unsigned __int128 value; }; +#endif void zig_u8(uint8_t); void zig_u16(uint16_t); void zig_u32(uint32_t); void zig_u64(uint64_t); +#ifndef ZIG_NO_I128 void zig_struct_u128(struct u128); +#endif void zig_i8(int8_t); void zig_i16(int16_t); void zig_i32(int32_t); void zig_i64(int64_t); +#ifndef ZIG_NO_I128 void zig_struct_i128(struct i128); +#endif void zig_five_integers(int32_t, int32_t, int32_t, int32_t, int32_t); void zig_f32(float); @@ -95,7 +109,9 @@ void zig_med_struct_mixed(struct MedStructMixed); struct MedStructMixed zig_ret_med_struct_mixed(); void zig_small_packed_struct(uint8_t); +#ifndef ZIG_NO_I128 void zig_big_packed_struct(__int128); +#endif struct SplitStructInts { uint64_t a; @@ -151,19 +167,26 @@ void run_c_tests(void) { zig_u16(0xfffe); zig_u32(0xfffffffd); zig_u64(0xfffffffffffffffc); + +#ifndef ZIG_NO_I128 { struct u128 s = {0xfffffffffffffffc}; zig_struct_u128(s); } +#endif zig_i8(-1); zig_i16(-2); zig_i32(-3); zig_i64(-4); + +#ifndef ZIG_NO_I128 { struct i128 s = {-6}; zig_struct_i128(s); } +#endif + zig_five_integers(12, 34, 56, 78, 90); zig_f32(12.34f); @@ -175,6 +198,7 @@ void run_c_tests(void) { zig_bool(true); +#ifndef ZIG_NO_COMPLEX // TODO: Resolve https://github.com/ziglang/zig/issues/8465 //{ // float complex a = 1.25f + I * 2.6f; @@ -211,23 +235,28 @@ void run_c_tests(void) { assert_or_panic(creal(z) == 1.5); assert_or_panic(cimag(z) == 13.5); } +#endif { struct BigStruct s = {1, 2, 3, 4, 5}; zig_big_struct(s); } +#ifndef __i386__ { struct SmallStructInts s = {1, 2, 3, 4}; zig_small_struct_ints(s); } +#endif +#ifndef ZIG_NO_I128 { __int128 s = 0; s |= 1 << 0; s |= (__int128)2 << 64; zig_big_packed_struct(s); } +#endif { uint8_t s = 0; @@ -238,20 +267,24 @@ void run_c_tests(void) { zig_small_packed_struct(s); } +#ifndef __i386__ { struct SplitStructInts s = {1234, 100, 1337}; zig_split_struct_ints(s); } +#endif { struct MedStructMixed s = {1234, 100.0f, 1337.0f}; zig_med_struct_mixed(s); } +#ifndef __i386__ { struct SplitStructMixed s = {1234, 100, 1337.0f}; zig_split_struct_mixed(s); } +#endif { struct BigStruct s = {30, 31, 32, 33, 34}; @@ -306,9 +339,11 @@ void c_u64(uint64_t x) { assert_or_panic(x == 0xfffffffffffffffcULL); } +#ifndef ZIG_NO_I128 void c_struct_u128(struct u128 x) { assert_or_panic(x.value == 0xfffffffffffffffcULL); } +#endif void c_i8(int8_t x) { assert_or_panic(x == -1); @@ -326,9 +361,11 @@ void c_i64(int64_t x) { assert_or_panic(x == -4); } +#ifndef ZIG_NO_I128 void c_struct_i128(struct i128 x) { assert_or_panic(x.value == -6); } +#endif void c_f32(float x) { assert_or_panic(x == 12.34f); @@ -495,6 +532,7 @@ void c_small_packed_struct(uint8_t x) { assert_or_panic(((x >> 6) & 0x3) == 3); } +#ifndef ZIG_NO_I128 __int128 c_ret_big_packed_struct() { __int128 s = 0; s |= 1 << 0; @@ -506,6 +544,7 @@ void c_big_packed_struct(__int128 x) { assert_or_panic(((x >> 0) & 0xFFFFFFFFFFFFFFFF) == 1); assert_or_panic(((x >> 64) & 0xFFFFFFFFFFFFFFFF) == 2); } +#endif struct SplitStructMixed c_ret_split_struct_mixed() { struct SplitStructMixed s = { diff --git a/test/c_abi/main.zig b/test/c_abi/main.zig index 6f1b336b011d145e45e3df1de6ed014cafd8c57b..fc9db79076ce7626f6af8053fe5f79ca361aa1b1 100644 --- a/test/c_abi/main.zig +++ b/test/c_abi/main.zig @@ -2,6 +2,7 @@ const std = @import("std"); const builtin = @import("builtin"); const print = std.debug.print; const expect = std.testing.expect; +const has_i128 = builtin.cpu.arch != .i386; extern fn run_c_tests() void; @@ -40,13 +41,13 @@ test "C ABI integers" { c_u16(0xfffe); c_u32(0xfffffffd); c_u64(0xfffffffffffffffc); - c_struct_u128(.{ .value = 0xfffffffffffffffc }); + if (has_i128) c_struct_u128(.{ .value = 0xfffffffffffffffc }); c_i8(-1); c_i16(-2); c_i32(-3); c_i64(-4); - c_struct_i128(.{ .value = -6 }); + if (has_i128) c_struct_i128(.{ .value = -6 }); c_five_integers(12, 34, 56, 78, 90); } @@ -178,6 +179,8 @@ test "C ABI complex float" { } test "C ABI complex float by component" { + if (builtin.cpu.arch == .i386) return error.SkipZigTest; + const a = ComplexFloat{ .real = 1.25, .imag = 2.6 }; const b = ComplexFloat{ .real = 11.3, .imag = -1.5 }; @@ -187,6 +190,8 @@ test "C ABI complex float by component" { } test "C ABI complex double" { + if (builtin.cpu.arch == .i386) return error.SkipZigTest; + const a = ComplexDouble{ .real = 1.25, .imag = 2.6 }; const b = ComplexDouble{ .real = 11.3, .imag = -1.5 }; @@ -196,6 +201,8 @@ test "C ABI complex double" { } test "C ABI complex double by component" { + if (builtin.cpu.arch == .i386) return error.SkipZigTest; + const a = ComplexDouble{ .real = 1.25, .imag = 2.6 }; const b = ComplexDouble{ .real = 11.3, .imag = -1.5 }; @@ -304,6 +311,8 @@ extern fn c_med_struct_mixed(MedStructMixed) void; extern fn c_ret_med_struct_mixed() MedStructMixed; test "C ABI medium struct of ints and floats" { + if (builtin.cpu.arch == .i386) return error.SkipZigTest; + var s = MedStructMixed{ .a = 1234, .b = 100.0, @@ -332,6 +341,8 @@ extern fn c_small_struct_ints(SmallStructInts) void; extern fn c_ret_small_struct_ints() SmallStructInts; test "C ABI small struct of ints" { + if (builtin.cpu.arch == .i386) return error.SkipZigTest; + var s = SmallStructInts{ .a = 1, .b = 2, @@ -392,6 +403,8 @@ export fn zig_big_packed_struct(x: BigPackedStruct) void { } test "C ABI big packed struct" { + if (!has_i128) return error.SkipZigTest; + var s = BigPackedStruct{ .a = 1, .b = 2 }; c_big_packed_struct(s); var s2 = c_ret_big_packed_struct(); @@ -407,6 +420,8 @@ const SplitStructInt = extern struct { extern fn c_split_struct_ints(SplitStructInt) void; test "C ABI split struct of ints" { + if (builtin.cpu.arch == .i386) return error.SkipZigTest; + var s = SplitStructInt{ .a = 1234, .b = 100, @@ -430,6 +445,8 @@ extern fn c_split_struct_mixed(SplitStructMixed) void; extern fn c_ret_split_struct_mixed() SplitStructMixed; test "C ABI split struct of ints and floats" { + if (builtin.cpu.arch == .i386) return error.SkipZigTest; + var s = SplitStructMixed{ .a = 1234, .b = 100, @@ -675,6 +692,8 @@ extern fn c_struct_with_array(StructWithArray) void; extern fn c_ret_struct_with_array() StructWithArray; test "Struct with array as padding." { + if (builtin.cpu.arch == .i386) return error.SkipZigTest; + c_struct_with_array(.{ .a = 1, .padding = undefined, .b = 2 }); var x = c_ret_struct_with_array(); -- 2.54.0