From 766a4b8e5236bffb40984439a79186c5ee823ff8 Mon Sep 17 00:00:00 2001 From: ov-4 Date: Fri, 30 Jan 2026 02:06:37 +0000 Subject: Added runtime check for array index and division --- lib/CodeGen/ArrayHandler.cc | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) (limited to 'lib/CodeGen/ArrayHandler.cc') diff --git a/lib/CodeGen/ArrayHandler.cc b/lib/CodeGen/ArrayHandler.cc index 470cffa..499fd2d 100644 --- a/lib/CodeGen/ArrayHandler.cc +++ b/lib/CodeGen/ArrayHandler.cc @@ -8,8 +8,8 @@ using namespace llvm; using namespace cps; -ArrayHandler::ArrayHandler(LLVMContext &C, IRBuilder<> &B, Module &M, std::map &NV) - : TheContext(&C), Builder(&B), TheModule(&M), NamedValues(&NV) { +ArrayHandler::ArrayHandler(LLVMContext &C, IRBuilder<> &B, Module &M, std::map &NV, RuntimeCheck &RC) + : TheContext(&C), Builder(&B), TheModule(&M), NamedValues(&NV), RuntimeChecker(RC) { setupExternalFunctions(); } @@ -115,8 +115,13 @@ Value* ArrayHandler::emitArrayAccess(ArrayAccessExprAST *Expr, CodeGen &CG) { } std::vector Indices; - for (const auto &IdxExpr : Expr->getIndices()) { - Indices.push_back(CG.emitExpr(IdxExpr.get())); + for (size_t i = 0; i < Expr->getIndices().size(); ++i) { + Value *Idx = CG.emitExpr(Expr->getIndices()[i].get()); + Indices.push_back(Idx); + + Value *Lower = Meta.LowerBounds[i]; + Value *Upper = Meta.UpperBounds[i]; + RuntimeChecker.emitIndexCheck(Idx, Lower, Upper, Expr->getLine()); } Value *Offset = computeFlatIndex(Name, Indices); @@ -137,8 +142,14 @@ void ArrayHandler::emitArrayAssign(ArrayAssignStmtAST *Stmt, CodeGen &CG) { } std::vector Indices; - for (const auto &IdxExpr : Stmt->getIndices()) { - Indices.push_back(CG.emitExpr(IdxExpr.get())); + for (size_t i = 0; i < Stmt->getIndices().size(); ++i) { + Value *Idx = CG.emitExpr(Stmt->getIndices()[i].get()); + Indices.push_back(Idx); + + const auto &Meta = ArrayTable[Name]; + Value *Lower = Meta.LowerBounds[i]; + Value *Upper = Meta.UpperBounds[i]; + RuntimeChecker.emitIndexCheck(Idx, Lower, Upper, Stmt->getLine()); } Value *Val = CG.emitExpr(Stmt->getExpr()); -- cgit v1.3.1-4-g156e