aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/CodeGen.cc
diff options
context:
space:
mode:
authorov-4 <hausemasterstream@gmail.com>2026-01-30 02:06:37 +0000
committerov-4 <hausemasterstream@gmail.com>2026-01-30 02:06:37 +0000
commit766a4b8e5236bffb40984439a79186c5ee823ff8 (patch)
treea4226690b4b95c916908afa0047899ff60e63c81 /lib/CodeGen/CodeGen.cc
parent943ed04b775949e8bc4948bcb8d762a32ab14f76 (diff)
Added runtime check for array index and division
Diffstat (limited to 'lib/CodeGen/CodeGen.cc')
-rw-r--r--lib/CodeGen/CodeGen.cc8
1 files changed, 6 insertions, 2 deletions
diff --git a/lib/CodeGen/CodeGen.cc b/lib/CodeGen/CodeGen.cc
index 57d76eb..e2c959e 100644
--- a/lib/CodeGen/CodeGen.cc
+++ b/lib/CodeGen/CodeGen.cc
@@ -13,7 +13,9 @@ CodeGen::CodeGen() {
TheModule = std::make_unique<Module>("cps_module", *TheContext);
Builder = std::make_unique<IRBuilder<>>(*TheContext);
- Arrays = std::make_unique<ArrayHandler>(*TheContext, *Builder, *TheModule, NamedValues);
+ RuntimeChecker = std::make_unique<RuntimeCheck>(*TheModule, *TheContext, *Builder);
+
+ Arrays = std::make_unique<ArrayHandler>(*TheContext, *Builder, *TheModule, NamedValues, *RuntimeChecker);
SetupExternalFunctions();
}
@@ -89,7 +91,9 @@ Value *CodeGen::emitExpr(ExprAST *Expr) {
case '+': return Builder->CreateAdd(L, R, "addtmp");
case '-': return Builder->CreateSub(L, R, "subtmp");
case '*': return Builder->CreateMul(L, R, "multmp");
- case '/': return Builder->CreateSDiv(L, R, "divtmp");
+ case '/':
+ RuntimeChecker->emitDivZeroCheck(R, Bin->getLine());
+ return Builder->CreateSDiv(L, R, "divtmp");
case tok_eq: return Builder->CreateICmpEQ(L, R, "eqtmp");
case tok_ne: return Builder->CreateICmpNE(L, R, "netmp");
case '<': return Builder->CreateICmpSLT(L, R, "slttmp");