aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2019-10-10 21:13:06 +0100
committergingerBill <bill@gingerbill.org>2019-10-10 21:13:06 +0100
commit672a8f5dbd101441b732abd2b3ec1c656fc4e30f (patch)
treecaec231de11a2202b62dbe117555072564b35aab /src
parent8672ff1c55147a1b6f276b8e3f64d3d48eb0edf9 (diff)
Add Odin types for System V ABI
Diffstat (limited to 'src')
-rw-r--r--src/check_type.cpp48
1 files changed, 48 insertions, 0 deletions
diff --git a/src/check_type.cpp b/src/check_type.cpp
index 672dee338..e4f3cbf0e 100644
--- a/src/check_type.cpp
+++ b/src/check_type.cpp
@@ -1848,6 +1848,50 @@ Array<Type *> systemv_distribute_struct_fields(Type *t, i32 level=0) {
Entity *f = ts->fields[field_index];
Type *bt = core_type(f->type);
switch (bt->kind) {
+ case Type_Basic:
+ switch (bt->Basic.kind){
+ case Basic_complex64:
+ array_add(&distributed, t_f32);
+ array_add(&distributed, t_f32);
+ break;
+ case Basic_complex128:
+ array_add(&distributed, t_f64);
+ array_add(&distributed, t_f64);
+ break;
+ case Basic_quaternion128:
+ array_add(&distributed, t_f32);
+ array_add(&distributed, t_f32);
+ array_add(&distributed, t_f32);
+ array_add(&distributed, t_f32);
+ break;
+ case Basic_quaternion256:
+ array_add(&distributed, t_f64);
+ array_add(&distributed, t_f64);
+ array_add(&distributed, t_f64);
+ array_add(&distributed, t_f64);
+ break;
+ case Basic_string:
+ array_add(&distributed, t_u8_ptr);
+ array_add(&distributed, t_int);
+ break;
+ case Basic_any:
+ GB_ASSERT(type_size_of(t_uintptr) == type_size_of(t_typeid));
+ array_add(&distributed, t_rawptr);
+ array_add(&distributed, t_uintptr);
+ break;
+
+ case Basic_u128:
+ case Basic_i128:
+ if (build_context.ODIN_OS == "windows") {
+ array_add(&distributed, alloc_type_simd_vector(2, t_u64));
+ } else {
+ array_add(&distributed, bt);
+ }
+ default:
+ goto DEFAULT;
+ }
+ break;
+
case Type_Struct:
if (bt->Struct.is_raw_union) {
goto DEFAULT;
@@ -1877,6 +1921,10 @@ Array<Type *> systemv_distribute_struct_fields(Type *t, i32 level=0) {
break;
case Type_Slice:
+ array_add(&distributed, t_rawptr);
+ array_add(&distributed, t_int);
+ break;
+
case Type_DynamicArray:
case Type_Map:
case Type_Union: