diff options
| author | ov-4 <hausemasterstream@gmail.com> | 2026-01-30 02:06:37 +0000 |
|---|---|---|
| committer | ov-4 <hausemasterstream@gmail.com> | 2026-01-30 02:06:37 +0000 |
| commit | 766a4b8e5236bffb40984439a79186c5ee823ff8 (patch) | |
| tree | a4226690b4b95c916908afa0047899ff60e63c81 /lib/CodeGen/CodeGen.cc | |
| parent | 943ed04b775949e8bc4948bcb8d762a32ab14f76 (diff) | |
Added runtime check for array index and division
Diffstat (limited to 'lib/CodeGen/CodeGen.cc')
| -rw-r--r-- | lib/CodeGen/CodeGen.cc | 8 |
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"); |
