From c9b1c22957f9f12b30ebad3d40cd4649007e7b86 Mon Sep 17 00:00:00 2001 From: David Gonzalez Martin Date: Sun, 13 Apr 2025 21:13:44 -0600 Subject: [PATCH] wip --- src/bootstrap.zig | 15 +++++++++------ tests/c_abi.bbb | 2 +- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/bootstrap.zig b/src/bootstrap.zig index 1994af5..2ae9086 100644 --- a/src/bootstrap.zig +++ b/src/bootstrap.zig @@ -449,7 +449,7 @@ pub const Type = struct { pub fn is_signed(ty: *const Type) bool { return switch (ty.bb) { .integer => |integer| integer.signed, - // .bits => |bits| bits.backing_type.is_signed(), + .bits => |bits| bits.backing_type.is_signed(), else => @trap(), }; } @@ -477,7 +477,7 @@ pub const Type = struct { pub fn is_promotable_integer_type_for_abi(ty: *Type) bool { return switch (ty.bb) { .integer => |integer| integer.bit_count < 32, - // .bits => |bits| bits.backing_type.is_promotable_integer_type_for_abi(), + .bits => |bits| bits.backing_type.is_promotable_integer_type_for_abi(), else => @trap(), }; } @@ -504,6 +504,7 @@ pub const Type = struct { .pointer => 64, .bits => |bits| bits.backing_type.get_bit_alignment(), .array => |array| array.element_type.get_bit_alignment(), + .structure => |structure| structure.bit_alignment, else => @trap(), }; } @@ -514,6 +515,7 @@ pub const Type = struct { .structure => |structure| structure.byte_size, .pointer => 8, .array => |array| array.element_type.get_byte_size() * array.element_count, + .bits => |bits| bits.backing_type.get_byte_size(), else => @trap(), }; return byte_size; @@ -525,6 +527,7 @@ pub const Type = struct { .pointer => 64, .bits => |bits| bits.backing_type.get_bit_size(), .array => |array| array.element_type.get_bit_size() * array.element_count, + .structure => |structure| structure.bit_size, else => @trap(), }; return bit_size; @@ -7353,7 +7356,7 @@ pub const Abi = struct { switch (ty.bb) { .void, .noreturn => result[current_index] = .none, - // .bits => result[current_index] = .integer, + .bits => result[current_index] = .integer, .pointer => result[current_index] = .integer, .integer => |integer| { if (integer.bit_count <= 64) { @@ -7488,9 +7491,9 @@ pub const Abi = struct { fn get_int_type_at_offset(module: *Module, ty: *Type, offset: u32, source_type: *Type, source_offset: u32) *Type { switch (ty.bb) { - // .bits => |bits| { - // return get_int_type_at_offset(module, bits.backing_type, offset, if (source_type == ty) bits.backing_type else source_type, source_offset); - // }, + .bits => |bits| { + return get_int_type_at_offset(module, bits.backing_type, offset, if (source_type == ty) bits.backing_type else source_type, source_offset); + }, .integer => |integer_type| { switch (integer_type.bit_count) { 64 => return ty, diff --git a/tests/c_abi.bbb b/tests/c_abi.bbb index 8cd1dfd..261128c 100644 --- a/tests/c_abi.bbb +++ b/tests/c_abi.bbb @@ -330,7 +330,7 @@ require = fn (ok: u1) void [export] bb_ptr = fn [cc(c)] (x: &u8) void { - require(#cast_to(u64, x) == 0xdeadbeef); + require(#int_from_pointer(x) == 0xdeadbeef); } [export] bb_five_integers = fn [cc(c)] (a: s32, b: s32, c: s32, d: s32, e: s32) void