diff options
| -rw-r--r-- | examples/18.src | 16 | ||||
| -rw-r--r-- | src/codegen.zig | 12 |
2 files changed, 26 insertions, 2 deletions
diff --git a/examples/18.src b/examples/18.src new file mode 100644 index 0000000..90234c4 --- /dev/null +++ b/examples/18.src @@ -0,0 +1,16 @@ +extern printf = (*i64, varargs) => void; +extern malloc = (i64) => *i64; +extern free = (*i64) => void; + +let main = () => i64 { + let x = malloc(128); + /* + *(x+0) = 10; + *(x+8) = 20; + */ + printf("%p\n", x); + printf("%d\n", *x); + printf("%d\n", *(x+1)); + free(x); + return 0; +}; 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, }); } |