From 36b1571bc9307263e83fb03b3ba4cf9f116b98a7 Mon Sep 17 00:00:00 2001 From: Baitinq Date: Tue, 1 Apr 2025 20:31:36 +0200 Subject: Codegen: Start supporting pointer arithmetic --- src/codegen.zig | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) (limited to 'src/codegen.zig') 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, }); } -- cgit 1.4.1