about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBaitinq <[email protected]>2025-06-07 00:39:08 +0200
committerBaitinq <[email protected]>2025-06-07 00:39:08 +0200
commitcc6f57ddb6537146d37ff1cf83743ed19e7d13df (patch)
treef7ba7afb258fc584cc5406502a561ad0d5d5970a
parentFeature: Typecheck on struct field assignment (diff)
downloadinterpreter-cc6f57ddb6537146d37ff1cf83743ed19e7d13df.tar.gz
interpreter-cc6f57ddb6537146d37ff1cf83743ed19e7d13df.tar.bz2
interpreter-cc6f57ddb6537146d37ff1cf83743ed19e7d13df.zip
Bootstrap: Codegen: Generate number literals
-rw-r--r--src/bootstrap/codegen.src62
-rw-r--r--src/bootstrap/llvm.src6
-rw-r--r--std/stdlib.src2
3 files changed, 68 insertions, 2 deletions
diff --git a/src/bootstrap/codegen.src b/src/bootstrap/codegen.src
index f9ab478..4be7d28 100644
--- a/src/bootstrap/codegen.src
+++ b/src/bootstrap/codegen.src
@@ -28,8 +28,68 @@ let codegen_init = (alloc: *arena) => *codegen {
 	return c;
 };
 
+let create_node = (c: *codegen, n: Node) => *Node {
+	let res = cast(*Node, arena_alloc((*c).arena, sizeof(Node)));
+	*res = n;
+	return res;
+};
+
+let Variable = struct {
+	value: LLVMValueRef,
+	type: LLVMTypeRef,
+	node: *Node,
+	node_type: *Node,
+	stack_level: *i64,
+};
+
+let codegen_create_variable = (c: *codegen, variable: Variable) => *Variable {
+	let v = cast(*Variable, arena_alloc((*c).arena, sizeof(Variable)));
+	*v = variable;
+	return v;
+};
+
+let codegen_generate_literal = (c: *codegen, literal_val: LLVMValueRef, name: *i8, node: *Node, node_type: *Node) => *Variable {
+	/* TODO: Global */
+	let v = Variable{};
+	v.value = literal_val;
+	v.type = cast(LLVMTypeRef, null);
+	v.stack_level = cast(*i64, null);
+	v.node = node;
+	v.node_type = node_type;
+	return codegen_create_variable(c, v);
+};
+
+let codegen_generate_expression_value = (c: *codegen, expression: *Node, name: *i8) => *Variable {
+	assert((*expression).type == NODE_PRIMARY_EXPRESSION_NUMBER);
+
+	let n = (*cast(*NODE_PRIMARY_EXPRESSION_NUMBER_DATA, (*expression).data)).value;
+	
+	println("X: %d", n);
+
+	let node_type = Node{};
+	node_type.type = NODE_TYPE_SIMPLE_TYPE;
+
+	let d = cast(*NODE_TYPE_SIMPLE_TYPE_DATA, arena_alloc((*c).arena, sizeof(NODE_TYPE_SIMPLE_TYPE_DATA)));
+	(*d).name = "i64";
+	(*d).underlying_type = cast(*Node, null);
+	node_type.data = cast(*void, d);
+	
+	return codegen_generate_literal(c, LLVMConstInt(LLVMInt64Type(), n, 0), name, expression, create_node(c, node_type));
+};
+
 let codegen_generate_assignment_statement = (c: *codegen, stmt: *NODE_ASSIGNMENT_STATEMENT_DATA) => i64 {
-	println("HOLA");
+	let lhs = *((*stmt).lhs);
+	let prhs = (*stmt).rhs;
+
+	if (lhs.type == NODE_PRIMARY_EXPRESSION_IDENTIFIER) {
+		let identifier = (*cast(*NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA, lhs.data)).name;
+		println("XX %s", identifier);
+		let variable = codegen_generate_expression_value(c, prhs, identifier);
+		assert(variable != cast(*Variable, null));
+		return 0;
+	};
+
+	assert(false);
 	return 0;
 };
 
diff --git a/src/bootstrap/llvm.src b/src/bootstrap/llvm.src
index 4e78f5a..49a1119 100644
--- a/src/bootstrap/llvm.src
+++ b/src/bootstrap/llvm.src
@@ -264,6 +264,12 @@ let LLVMTargetMachineRef = newtype *void;
 let LLVMContextRef = newtype *void;
 let LLVMTargetRef = newtype *void;
 
+let LLVMValueRef = newtype *void;
+let LLVMTypeRef = newtype *void;
+
+extern LLVMConstInt = (LLVMTypeRef, i64, i64) => LLVMValueRef;
+extern LLVMInt64Type = () => LLVMTypeRef;
+
 extern LLVMModuleCreateWithName = (*i8) => LLVMModuleRef;
 extern LLVMGetGlobalContext = () => LLVMContextRef;
 extern LLVMCreateBuilder = () => LLVMBuilderRef;
diff --git a/std/stdlib.src b/std/stdlib.src
index 90e28d6..9164f67 100644
--- a/std/stdlib.src
+++ b/std/stdlib.src
@@ -82,7 +82,7 @@ let iswhitespace = (c: i8) => bool {
 
 let assert = (cond: bool) => void {
 	if !cond {
-		println("UNREACHABLE");
+		println("ASSERTION FAILED");
 		exit(1);
 	};