diff options
| author | gingerBill <bill@gingerbill.org> | 2019-05-29 16:49:26 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2019-05-29 16:49:26 +0100 |
| commit | 654740d5b110328e2c6b86f8f0cbd7853e730cfa (patch) | |
| tree | 81fa5d8efd7e59edb97ef52593d04c94448ec3d2 /src | |
| parent | b894e2b3788307546e330bd43304e5ff785dac51 (diff) | |
Fixes to ABI
Diffstat (limited to 'src')
| -rw-r--r-- | src/check_decl.cpp | 2 | ||||
| -rw-r--r-- | src/check_type.cpp | 29 | ||||
| -rw-r--r-- | src/query_data.cpp | 2 |
3 files changed, 16 insertions, 17 deletions
diff --git a/src/check_decl.cpp b/src/check_decl.cpp index 07c0d1828..da2214d89 100644 --- a/src/check_decl.cpp +++ b/src/check_decl.cpp @@ -440,7 +440,7 @@ bool sig_compare(TypeCheckSig *a, TypeCheckSig *b, Type *x, Type *y) { if (a == b) { return sig_compare(a, x, y); } - return (a(x) && b(y) || b(x) && a(y)); + return ((a(x) && b(y)) || (b(x) && a(y))); } bool signature_parameter_similar_enough(Type *x, Type *y) { diff --git a/src/check_type.cpp b/src/check_type.cpp index ca0fab260..f7d577a54 100644 --- a/src/check_type.cpp +++ b/src/check_type.cpp @@ -1842,6 +1842,10 @@ Type *type_to_abi_compat_param_type(gbAllocator a, Type *original_type, ProcCall return new_type; } + if (cc == ProcCC_None) { + return new_type; + } + if (build_context.ODIN_ARCH == "386") { return new_type; } @@ -1849,21 +1853,17 @@ Type *type_to_abi_compat_param_type(gbAllocator a, Type *original_type, ProcCall if (is_type_simd_vector(original_type)) { return new_type; } + if (build_context.word_size == 8) { + if (is_type_integer_128bit(original_type)) { + return alloc_type_simd_vector(2, t_u64); + } + } if (build_context.ODIN_OS == "windows") { // NOTE(bill): Changing the passing parameter value type is to match C's ABI // IMPORTANT TODO(bill): This only matches the ABI on MSVC at the moment // SEE: https://msdn.microsoft.com/en-us/library/zthk2dkh.aspx - if (build_context.word_size == 8) { - if (is_type_integer_128bit(original_type)) { - if (cc == ProcCC_None) { - return original_type; - } else { - return alloc_type_simd_vector(2, t_u64); - } - } - } Type *bt = core_type(original_type); switch (bt->kind) { @@ -2044,14 +2044,13 @@ bool abi_compat_return_by_pointer(gbAllocator a, ProcCallingConvention cc, Type return false; } - - if (build_context.ODIN_OS == "windows") { - if (build_context.word_size == 8) { - if (is_type_integer_128bit(single_type)) { - return false; - } + if (build_context.word_size == 8) { + if (is_type_integer_128bit(single_type)) { + return false; } + } + if (build_context.ODIN_OS == "windows") { i64 size = 8*type_size_of(abi_return_type); switch (size) { case 0: diff --git a/src/query_data.cpp b/src/query_data.cpp index 5a928cb31..8e9cf5f33 100644 --- a/src/query_data.cpp +++ b/src/query_data.cpp @@ -301,7 +301,7 @@ void print_query_data_as_json(QueryValue *value, bool format = true, isize inden } case Query_Integer: { auto v = cast(QueryValueInteger *)value; - gb_printf("%lld", v->value); + gb_printf("%lld", cast(long long)v->value); return; } case Query_Float: { |