From 27d5e1f36cf7f7bd9345aba57d092206dc9e249b Mon Sep 17 00:00:00 2001 From: Sahnvour Date: Tue, 19 Mar 2019 22:09:12 +0100 Subject: c_abi: add some tests for int and float parameter passing potentially using both registers and stack --- test/stage1/c_abi/cfuncs.c | 20 ++++++++++++++++++++ test/stage1/c_abi/main.zig | 24 ++++++++++++++++++++++++ 2 files changed, 44 insertions(+) (limited to 'test') diff --git a/test/stage1/c_abi/cfuncs.c b/test/stage1/c_abi/cfuncs.c index 102cd466b1..a26f8c98a1 100644 --- a/test/stage1/c_abi/cfuncs.c +++ b/test/stage1/c_abi/cfuncs.c @@ -18,9 +18,11 @@ void zig_i8(int8_t); void zig_i16(int16_t); void zig_i32(int32_t); void zig_i64(int64_t); +void zig_five_integers(int32_t, int32_t, int32_t, int32_t, int32_t); void zig_f32(float); void zig_f64(double); +void zig_five_floats(float, float, float, float, float); void zig_ptr(void *); @@ -71,9 +73,11 @@ void run_c_tests(void) { zig_i16(-2); zig_i32(-3); zig_i64(-4); + zig_five_integers(12, 34, 56, 78, 90); zig_f32(12.34f); zig_f64(56.78); + zig_five_floats(1.0f, 2.0f, 3.0f, 4.0f, 5.0f); zig_ptr((void*)0xdeadbeefL); @@ -156,6 +160,22 @@ void c_bool(bool x) { assert_or_panic(x); } +void c_five_integers(int32_t a, int32_t b, int32_t c, int32_t d, int32_t e) { + assert_or_panic(a == 12); + assert_or_panic(b == 34); + assert_or_panic(c == 56); + assert_or_panic(d == 78); + assert_or_panic(e == 90); +} + +void c_five_floats(float a, float b, float c, float d, float e) { + assert_or_panic(a == 1.0); + assert_or_panic(b == 2.0); + assert_or_panic(c == 3.0); + assert_or_panic(d == 4.0); + assert_or_panic(e == 5.0); +} + void c_array(uint8_t x[10]) { assert_or_panic(x[0] == '1'); assert_or_panic(x[1] == '2'); diff --git a/test/stage1/c_abi/main.zig b/test/stage1/c_abi/main.zig index 4805fc9896..70688aa09c 100644 --- a/test/stage1/c_abi/main.zig +++ b/test/stage1/c_abi/main.zig @@ -20,6 +20,17 @@ extern fn c_i16(i16) void; extern fn c_i32(i32) void; extern fn c_i64(i64) 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; + +export fn zig_five_integers(a: i32, b: i32, c: i32, d: i32, e: i32) void { + expect(a == 12); + expect(b == 34); + expect(c == 56); + expect(d == 78); + expect(e == 90); +} + test "C ABI integers" { c_u8(0xff); c_u16(0xfffe); @@ -30,6 +41,7 @@ test "C ABI integers" { c_i16(-2); c_i32(-3); c_i64(-4); + c_five_integers(12, 34, 56, 78, 90); } export fn zig_u8(x: u8) void { @@ -60,9 +72,21 @@ export fn zig_i64(x: i64) void { extern fn c_f32(f32) void; extern fn c_f64(f64) void; +// On windows x64, the first 4 are passed via registers, others on the stack. +extern fn c_five_floats(f32, f32, f32, f32, f32) void; + +export fn zig_five_floats(a: f32, b: f32, c: f32, d: f32, e: f32) void { + expect(a == 1.0); + expect(b == 2.0); + expect(c == 3.0); + expect(d == 4.0); + expect(e == 5.0); +} + test "C ABI floats" { c_f32(12.34); c_f64(56.78); + c_five_floats(1.0, 2.0, 3.0, 4.0, 5.0); } export fn zig_f32(x: f32) void { -- cgit v1.2.3 From d669db76732a5137f9e37a22d08f5cba319a122d Mon Sep 17 00:00:00 2001 From: Sahnvour Date: Tue, 19 Mar 2019 22:41:27 +0100 Subject: c_abi: activate tests on windows --- test/build_examples.zig | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'test') diff --git a/test/build_examples.zig b/test/build_examples.zig index 33a288a108..c75c38b138 100644 --- a/test/build_examples.zig +++ b/test/build_examples.zig @@ -25,9 +25,7 @@ pub fn addCases(cases: *tests.BuildExamplesContext) void { cases.addBuildFile("test/standalone/load_dynamic_library/build.zig"); } - if (!is_windows // TODO support compiling C files on windows with zig build system - and builtin.arch == builtin.Arch.x86_64 // TODO add C ABI support for other architectures - ) { + if (builtin.arch == builtin.Arch.x86_64) { // TODO add C ABI support for other architectures cases.addBuildFile("test/stage1/c_abi/build.zig"); } } -- cgit v1.2.3