about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBaitinq <[email protected]>2025-04-01 20:31:36 +0200
committerBaitinq <[email protected]>2025-04-01 20:31:36 +0200
commit36b1571bc9307263e83fb03b3ba4cf9f116b98a7 (patch)
treefc12949c3b4ca5ea35b5bcdeb8c0dfee8a54e3e1
parentFeature: Add basic support for pointer references and dereferences (diff)
downloadpry-lang-36b1571bc9307263e83fb03b3ba4cf9f116b98a7.tar.gz
pry-lang-36b1571bc9307263e83fb03b3ba4cf9f116b98a7.tar.bz2
pry-lang-36b1571bc9307263e83fb03b3ba4cf9f116b98a7.zip
Codegen: Start supporting pointer arithmetic
-rw-r--r--examples/18.src16
-rw-r--r--src/codegen.zig12
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,
         });
     }