diff --git a/sapfor/experts/Sapfor_2017/_src/GraphCall/graph_calls.cpp b/sapfor/experts/Sapfor_2017/_src/GraphCall/graph_calls.cpp index c117c5c..c99723f 100644 --- a/sapfor/experts/Sapfor_2017/_src/GraphCall/graph_calls.cpp +++ b/sapfor/experts/Sapfor_2017/_src/GraphCall/graph_calls.cpp @@ -793,10 +793,7 @@ static void fillInOut(FuncInfo *currF, SgStatement *start, SgStatement *last, co continue; if (activeOps.size() && activeOps.find(st) == activeOps.end()) - { - st = st->lastNodeOfStmt(); continue; - } if (st->variant() == ASSIGN_STAT) { @@ -961,6 +958,15 @@ static void fillCommons(FuncInfo *currInfo, const map& activeOps) +{ + set lines; + for (auto& st : activeOps) + lines.insert(st->lineNumber()); + for (auto& line : lines) + printf("%d\n", line); +} + static FuncInfo* createNewFuction(const string& funcName, SgStatement *st, SgStatement* entry, vector& messagesForFile, const map>& commonBlocks, @@ -993,7 +999,6 @@ static FuncInfo* createNewFuction(const string& funcName, SgStatement *st, SgSta } currInfo->funcParams.completeParams(); - return currInfo; } @@ -1089,7 +1094,6 @@ static FuncInfo* analyzeFunction(const string& funcName, const string& containsP isSgExecutableStatement(st) && activeOps.find(st) == activeOps.end()) { - st = st->lastNodeOfStmt(); st = st->lexNext(); continue; } @@ -1197,7 +1201,7 @@ static FuncInfo* analyzeFunction(const string& funcName, const string& containsP return procInfo; } -static set fillActiveOperators(const vector& blocks) +static set fillActiveOperators(SgStatement* func, const vector& blocks) { if (blocks.size() == 0) return set(); @@ -1233,6 +1237,28 @@ static set fillActiveOperators(const vector& } } + //complete blocked statements + for (auto st = func->lexNext(); st != func->lastNodeOfStmt(); st = st->lexNext()) + { + if (st->variant() == CONTAINS_STMT) + break; + + if (st->variant() == SWITCH_NODE) + { + auto select = isSgSwitchStmt(st); + int numOfCases = select->numberOfCaseOptions(); + for (int z = 0; z < numOfCases; ++z) + { + auto caseOp = isSgCaseOptionStmt(select->caseOption(z)); + if (active.count(caseOp)) + { + active.insert(st); + break; + } + } + } + } + return active; } @@ -1319,7 +1345,7 @@ void functionAnalyzer(SgFile *file, map> &allFuncInfo, if (tmpInfoInIR.count(function) == 0) printInternalError(convertFileName(__FILE__).c_str(), __LINE__); - activeOps = fillActiveOperators(fullIR[tmpInfoInIR[function]]); + activeOps = fillActiveOperators((isEntry ? function->controlParent() : function), fullIR[tmpInfoInIR[function]]); activeOps.insert(function); if (isEntry) activeOps.insert(function->controlParent()); diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/checkpoints.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/checkpoints.cpp index 7fa8f05..5003f1a 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/checkpoints.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/checkpoints.cpp @@ -826,8 +826,11 @@ static void insertStmtToModule(const map& moduleStmts, con SgStatement* borderStmt = new SgStatement(VAR_DECL); proc_moduleF->insertStmtAfter(*borderStmt, *proc_moduleF); - for (const auto& [varName, varStmt] : moduleStmts) + for (auto& stat : moduleStmts) { + const auto& varName = stat.first; + SgStatement* varStmt = stat.second; + string varNameNoPref = varName; varNameNoPref.erase(0, prefixLen + 1); diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/function_purifying.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/function_purifying.cpp index 0e01cfa..85384c7 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/function_purifying.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/function_purifying.cpp @@ -434,25 +434,20 @@ static void insertIntents(set& identificators, SgStatement* header, cons } SgExpression* attr = new SgExpression(intentVariant); - SgExpression* args = NULL; + vector args; for (auto& par : identificators) { if (parSym.count(par) == 0) printInternalError(convertFileName(__FILE__).c_str(), __LINE__); - auto s = parSym.at(par); - SgExprListExp* tempArgs = new SgExprListExp(); - SgVarRefExp* tempPar = new SgVarRefExp(s); - tempArgs->setLhs(tempPar); - if (args) - tempArgs->setRhs(args); - args = tempArgs; + auto s = parSym.at(par); + args.push_back(new SgVarRefExp(s)); s->setAttribute(s->attributes() | intentBit); } - if (args) + if (args.size()) { - SgIntentStmt* intent = new SgIntentStmt(*args, *attr); + SgIntentStmt* intent = new SgIntentStmt(*makeExprList(args), *attr); lastDecl->insertStmtAfter(*intent, (header == lastDecl) ? *header : *lastDecl->controlParent()); } } diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp index c45db9a..826afbd 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp @@ -39,17 +39,15 @@ static void FindAllVars(SgExpression* expr, set& allVars, setsymbol(); - if ((s->attributes() & EXTERNAL_BIT)) + if (var == FUNC_CALL /*(s->attributes() & EXTERNAL_BIT)*/) { - if (var == FUNC_CALL && !IS_BY_USE(s) && s->scope() == scope) + if (!IS_BY_USE(s) /* && s->scope() == scope*/) allVars.insert(s); } else { if (!IS_BY_USE(s) && s->scope() == scope) - { allVars.insert(s); - } } } else if (var == CONST_REF) @@ -210,6 +208,15 @@ static map FunctionImplicitCheck(SgStatement* function, const map functionSymbs.insert(hedr->resultName()->identifier()); } + auto prog = isSgProgHedrStmt(function); + if (prog) + { + for (int z = 0; z < prog->numberOfInternalSubroutinesDefined(); ++z) + functionSymbs.insert(prog->internalSubroutine(z)->symbol()->identifier()); + for (int z = 0; z < prog->numberOfInternalFunctionsDefined(); ++z) + functionSymbs.insert(prog->internalFunction(z)->symbol()->identifier()); + } + for (auto st = function->lexNext(); st != endOfFunc && st->variant() != CONTAINS_STMT; st = st->lexNext()) { if (skip.count(st->variant())) @@ -247,7 +254,6 @@ static map FunctionImplicitCheck(SgStatement* function, const map } //add parameters - auto prog = isSgProgHedrStmt(function); if (prog) { for (int z = 0; z < prog->numberOfParameters(); ++z) diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/version.h b/sapfor/experts/Sapfor_2017/_src/Utils/version.h index 431ac92..3ef0133 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/version.h +++ b/sapfor/experts/Sapfor_2017/_src/Utils/version.h @@ -1,3 +1,3 @@ #pragma once -#define VERSION_SPF "2343" +#define VERSION_SPF "2346"