Author | Jakob Wakeling <[email protected]> |
Date | 2022-04-15 12:09:31 |
Commit | e2c1b427a4aaf333e66fa7af4529c4f299158368 |
Parent | 258d5a1b9c0503563743dfcf6eb64043a9201a53 |
Implement LLVM generation for +, -, *, /, and %
Diffstat
M | src/llvm.c | | | 32 | ++++++++++++++++++++++++++------ |
M | src/main.c | | | 2 | +- |
2 files changed, 27 insertions, 7 deletions
diff --git a/src/llvm.c b/src/llvm.c index 61ded72..9517968 100644 --- a/src/llvm.c +++ b/src/llvm.c @@ -117,12 +117,12 @@ static LLVMValueRef llvm_stmt_decl(ast *a, syt *st) { } else { if (a->p->k == AK_PROG) { - LLVMValueRef v = LLVMAddGlobal(llvm_module, llvm_type(C[0]->t), a->s); - LLVMSetInitializer(v, llvm_int(C[0])); a->llvm_v = v; + LLVMValueRef v = LLVMAddGlobal(llvm_module, llvm_type(A.t), a->s); + LLVMSetInitializer(v, llvm_expr(C[0], st)); a->llvm_v = v; } else { - LLVMValueRef v = LLVMBuildAlloca(llvm_builder, llvm_type(C[0]->t), a->s); - LLVMBuildStore(llvm_builder, llvm_int(C[0]), v); a->llvm_v = v; + LLVMValueRef v = LLVMBuildAlloca(llvm_builder, llvm_type(A.t), a->s); + LLVMBuildStore(llvm_builder, llvm_expr(C[0], st), v); a->llvm_v = v; } } @@ -151,15 +151,32 @@ static LLVMValueRef llvm_stmt_for(ast *a, syt *st) { /* Generate IR for an expression. */ static LLVMValueRef llvm_expr(ast *a, syt *st) { - if (a->k == AK_PROC) { return llvm_expr_proc(a, st); } - if (a->k == AK_INT) { return llvm_int(a); } - if (a->k == AK_VAR) { + switch (A.k) { + case AK_PROC: { return llvm_expr_proc(a, st); } break; + case AK_INT: { return llvm_int(a); } break; + case AK_VAR: { ast *v = syt_search(st, a->s); if (v == NULL) { error(2, "llvm_expr: Undefined variable %s", a->s); } return LLVMBuildLoad2(llvm_builder, llvm_type(v->t), v->llvm_v, v->s); + } break; + case AK_OP_ADD: { + return LLVMBuildAdd(llvm_builder, llvm_expr(A.c.a[0], st), llvm_expr(A.c.a[1], st), "add"); + } break; + case AK_OP_SUB: { + return LLVMBuildSub(llvm_builder, llvm_expr(A.c.a[0], st), llvm_expr(A.c.a[1], st), "sub"); + } break; + case AK_OP_MUL: { + return LLVMBuildMul(llvm_builder, llvm_expr(A.c.a[0], st), llvm_expr(A.c.a[1], st), "mul"); + } break; + case AK_OP_DIV: { + return LLVMBuildSDiv(llvm_builder, llvm_expr(A.c.a[0], st), llvm_expr(A.c.a[1], st), "div"); + } break; + case AK_OP_MOD: { + return LLVMBuildSRem(llvm_builder, llvm_expr(A.c.a[0], st), llvm_expr(A.c.a[1], st), "mod"); + } break; + default: { error(2, "llvm_expr unknown kind %s", ast_ks[a->k]); } break; } - else { error(2, "_expr unknown kind %s", ast_ks[a->k]); } } /* Generate IR for a procedure. */ diff --git a/src/main.c b/src/main.c index ab65b93..b0286cd 100644 --- a/src/main.c +++ b/src/main.c @@ -23,7 +23,7 @@ static struct lop lops[] = { }; static char *aw[] = { - "g", "--debug-analyse", "/home/deus/Workspace/G/examples/dual.g", NULL + "g", "/home/deus/Workspace/G/examples/main.g", NULL }; static void hlp(void);