G

G Programming Language
git clone http://git.omkov.net/G
Log | Tree | Refs | README | Download

AuthorJakob Wakeling <[email protected]>
Date2022-04-15 12:09:31
Commite2c1b427a4aaf333e66fa7af4529c4f299158368
Parent258d5a1b9c0503563743dfcf6eb64043a9201a53

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);