diff options
| author | Baitinq <[email protected]> | 2025-04-01 20:31:36 +0200 |
|---|---|---|
| committer | Baitinq <[email protected]> | 2025-04-01 20:31:36 +0200 |
| commit | 36b1571bc9307263e83fb03b3ba4cf9f116b98a7 (patch) | |
| tree | fc12949c3b4ca5ea35b5bcdeb8c0dfee8a54e3e1 /src/codegen.zig | |
| parent | Feature: Add basic support for pointer references and dereferences (diff) | |
| download | pry-lang-36b1571bc9307263e83fb03b3ba4cf9f116b98a7.tar.gz pry-lang-36b1571bc9307263e83fb03b3ba4cf9f116b98a7.tar.bz2 pry-lang-36b1571bc9307263e83fb03b3ba4cf9f116b98a7.zip | |
Codegen: Start supporting pointer arithmetic
Diffstat (limited to 'src/codegen.zig')
| -rw-r--r-- | src/codegen.zig | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/src/codegen.zig b/src/codegen.zig index a6f4b08..553de77 100644 --- a/src/codegen.zig +++ b/src/codegen.zig @@ -416,9 +416,17 @@ pub const CodeGen = struct { const lhs_value = try self.generate_expression_value(exp.lhs, null); const rhs_value = try self.generate_expression_value(exp.rhs, null); + std.debug.assert(lhs_value.node.?.* == .PRIMARY_EXPRESSION); + std.debug.assert(rhs_value.node.?.* == .PRIMARY_EXPRESSION); + var result: llvm.LLVMValueRef = undefined; if (exp.addition) { - result = llvm.LLVMBuildAdd(self.builder, lhs_value.value, rhs_value.value, "") orelse return CodeGenError.CompilationError; + if (llvm.LLVMGetTypeKind(lhs_value.type.?) == llvm.LLVMPointerTypeKind) { + const indices = [_]llvm.LLVMValueRef{rhs_value.value}; + result = llvm.LLVMBuildGEP2(self.builder, llvm.LLVMInt8Type(), lhs_value.value, @constCast(&indices), indices.len, ""); + } else { + result = llvm.LLVMBuildAdd(self.builder, lhs_value.value, rhs_value.value, "") orelse return CodeGenError.CompilationError; + } } else { result = llvm.LLVMBuildSub(self.builder, lhs_value.value, rhs_value.value, "") orelse return CodeGenError.CompilationError; } @@ -529,7 +537,7 @@ pub const CodeGen = struct { .value = literal_val, .type = literal_type, .stack_level = null, - .node = null, //TODO + .node = node, }); } |