diff options
| author | Baitinq <[email protected]> | 2025-06-07 00:39:08 +0200 |
|---|---|---|
| committer | Baitinq <[email protected]> | 2025-06-07 00:39:08 +0200 |
| commit | cc6f57ddb6537146d37ff1cf83743ed19e7d13df (patch) | |
| tree | f7ba7afb258fc584cc5406502a561ad0d5d5970a | |
| parent | Feature: Typecheck on struct field assignment (diff) | |
| download | interpreter-cc6f57ddb6537146d37ff1cf83743ed19e7d13df.tar.gz interpreter-cc6f57ddb6537146d37ff1cf83743ed19e7d13df.tar.bz2 interpreter-cc6f57ddb6537146d37ff1cf83743ed19e7d13df.zip | |
Bootstrap: Codegen: Generate number literals
| -rw-r--r-- | src/bootstrap/codegen.src | 62 | ||||
| -rw-r--r-- | src/bootstrap/llvm.src | 6 | ||||
| -rw-r--r-- | std/stdlib.src | 2 |
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); }; |