diff options
| author | Baitinq <[email protected]> | 2025-05-28 00:11:06 +0200 |
|---|---|---|
| committer | Baitinq <[email protected]> | 2025-05-28 00:11:06 +0200 |
| commit | 48958afe4e187ce496d3445ee622ec3bc7bc8453 (patch) | |
| tree | bf6c0ead8240a27e150e9e81dd9207cee4dbe211 /src/codegen.zig | |
| parent | Feature: Finish adding struct support :^) (diff) | |
| download | pry-lang-48958afe4e187ce496d3445ee622ec3bc7bc8453.tar.gz pry-lang-48958afe4e187ce496d3445ee622ec3bc7bc8453.tar.bz2 pry-lang-48958afe4e187ce496d3445ee622ec3bc7bc8453.zip | |
Feature: Add sizeof builtin function
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).?; |