diff options
Diffstat (limited to 'src/codegen.zig')
| -rw-r--r-- | src/codegen.zig | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/src/codegen.zig b/src/codegen.zig index b72e9c4..d246853 100644 --- a/src/codegen.zig +++ b/src/codegen.zig @@ -17,6 +17,7 @@ pub const CodeGenError = error{ pub const CodeGen = struct { llvm_module: llvm.LLVMModuleRef, + llvm_target_data: llvm.LLVMTargetDataRef, llvm_context: llvm.LLVMContextRef, builder: llvm.LLVMBuilderRef, environment: *Environment, @@ -43,6 +44,7 @@ pub const CodeGen = struct { const self = try arena.create(CodeGen); self.* = .{ .llvm_module = module, + .llvm_target_data = llvm.LLVMGetModuleDataLayout(module), .llvm_context = context, .builder = builder, .environment = try Environment.init(arena), @@ -753,6 +755,27 @@ pub const CodeGen = struct { .node_type = exp.typ, }); }, + .SIZEOF_STATEMENT => |exp| { + const typ = try self.get_llvm_type(exp.typ); + const size_in_bits = llvm.LLVMSizeOfTypeInBits(self.llvm_target_data, typ); + const size_in_bytes = size_in_bits / 8; + + const size_val = llvm.LLVMConstInt(llvm.LLVMInt64Type(), size_in_bytes, 0); + + return try self.create_variable(.{ + .value = size_val, + .type = null, + .node_type = try self.create_node(.{ + .TYPE = .{ + .SIMPLE_TYPE = .{ + .name = "i64", + }, + }, + }), + .stack_level = null, + .node = expression, + }); + }, .FIELD_ACCESS => |exp| { const ptr = self.environment.get_variable(exp.expression.PRIMARY_EXPRESSION.IDENTIFIER.name).?; |