diff --git a/src/compiler.bbb b/src/compiler.bbb index 5ff19c1..6fe2fb7 100644 --- a/src/compiler.bbb +++ b/src/compiler.bbb @@ -1,3 +1,14 @@ +Arena = struct +{ + reserved_size: u64, + position: u64, + os_position: u64, + granularity: u64, + reserved: [32]u8, +} + +minimum_position: u64 = #byte_size(Arena); + [export] main = fn [cc(c)] () s32 { return 0; diff --git a/src/converter.zig b/src/converter.zig index c58ad80..bf3fe58 100644 --- a/src/converter.zig +++ b/src/converter.zig @@ -2561,6 +2561,7 @@ const Converter = struct { }; const Intrinsic = enum { + byte_size, cast, cast_to, extend, @@ -2584,6 +2585,30 @@ const Converter = struct { converter.skip_space(); switch (intrinsic_keyword) { + .byte_size => { + const ty = converter.parse_type(module); + converter.skip_space(); + converter.expect_character(')'); + const byte_size = ty.get_byte_size(); + const destination_type = expected_type orelse converter.report_error(); + if (destination_type.bb != .integer) { + converter.report_error(); + } + const value = module.values.add(); + value.* = .{ + .llvm = destination_type.llvm.handle.to_integer().get_constant(byte_size, @intFromBool(false)).to_value(), + .bb = .{ + .constant_integer = .{ + .value = byte_size, + .signed = false, + }, + }, + .type = destination_type, + .lvalue = false, + .dereference_to_assign = false, + }; + return value; + }, .cast => { @trap(); }, diff --git a/src/converter_test.zig b/src/converter_test.zig index ff2a689..081683c 100644 --- a/src/converter_test.zig +++ b/src/converter_test.zig @@ -368,3 +368,7 @@ test "indirect_varargs" { test "varargs" { try invsrc(@src()); } + +test "byte_size" { + try invsrc(@src()); +} diff --git a/tests/byte_size.bbb b/tests/byte_size.bbb new file mode 100644 index 0000000..a07d92f --- /dev/null +++ b/tests/byte_size.bbb @@ -0,0 +1,6 @@ +[export] main = fn [cc(c)] () s32 +{ + >a: s32 = #byte_size(s32); + >b: s32 = #byte_size(s32); + return a - b; +}