From 41fdfcf3f8a9e95b5b5642ffb43e72c971a19d43 Mon Sep 17 00:00:00 2001 From: ALEXks Date: Mon, 18 Dec 2023 21:12:27 +0300 Subject: [PATCH] checkpoints refactored --- .../_src/Transformations/checkpoints.cpp | 1200 +++++++++-------- 1 file changed, 602 insertions(+), 598 deletions(-) diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/checkpoints.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/checkpoints.cpp index 468d224..9da8cbc 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/checkpoints.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/checkpoints.cpp @@ -497,631 +497,231 @@ static void replaceExprByExprInSt(SgStatement* st, SgExpression* from, SgExpress } } - -void createCheckpoints(SgFile *file, const map& commonBlocks, const map& filesInfo, - const vector& allFuncInfo) +static SgStatement* createOpenJ_old(SgExpression* iostat, SgArrayRefExp* journal, SgExpression& unit) { - map inFileCp; - bool inFile = findSpfCpDir(file, inFileCp); + vector listSpec; + listSpec.push_back(&SgAssignOp(*new SgKeywordValExp("iostat"), *iostat)); + listSpec.push_back(&SgAssignOp(*new SgKeywordValExp("status"), *new SgValueExp("old"))); + listSpec.push_back(&SgAssignOp(*new SgKeywordValExp("file"), *journal)); + listSpec.push_back(&unit); - if (inFile) + SgIOControlStmt* openJ_old = new SgIOControlStmt(OPEN_STAT, *makeExprList(listSpec, false)); + return openJ_old; +} + +static SgStatement* createOpen(SgExpression* iostat, SgSymbol* files, SgExpression* fileIdx, SgExpression& unit) +{ + vector listSpec; + listSpec.push_back(&SgAssignOp(*new SgKeywordValExp("form"), *new SgValueExp("unformatted"))); + listSpec.push_back(&SgAssignOp(*new SgKeywordValExp("iostat"), *iostat)); + listSpec.push_back(&SgAssignOp(*new SgKeywordValExp("status"), *new SgValueExp("old"))); + listSpec.push_back(&SgAssignOp(*new SgKeywordValExp("file"), *new SgArrayRefExp(*files, *fileIdx))); + listSpec.push_back(&unit); + + SgIOControlStmt* open = new SgIOControlStmt(OPEN_STAT, *makeExprList(listSpec, false)); + return open; +} + +static void processFunctionCallChain(SgStatement* func, const vector& allFuncInfo, SgStatement* moduleF, + const vector& loadS, SgExpression* iostat, SgArrayRefExp* journal, + SgExpression& frmt, SgExpression& unit, + SgSymbol* files, SgExpression* fileIdx, + const int every, const vector& everyS) +{ + //find function structure + FuncInfo* funcI = NULL; + for (auto& funcs : allFuncInfo) + if (funcs->funcName == func->symbol()->identifier()) + funcI = funcs; + checkNull(funcI, convertFileName(__FILE__).c_str(), __LINE__); + + set> toProcess; + fillToProcess(funcI, toProcess); + + map processedFrom; + for (auto& pairs : toProcess) { - set commonVars; - for (auto& common : commonBlocks) + FuncInfo* funcTo = pairs.first; + FuncInfo* funcFrom = pairs.second; + + int callNum = 1; + SgStatement* hedrTo = funcTo->funcPointer->GetOriginal(); + SgStatement* hedrFrom = funcFrom->funcPointer->GetOriginal(); + SgStatement* lastDecl = hedrFrom->lexNext(); + while (lastDecl && !isSgExecutableStatement(lastDecl->lexNext())) + lastDecl = lastDecl->lexNext(); + + SgStatement* firstExec = lastDecl->lexNext(); + vector local; + map localParams; + set addedToList; + findLocalData(hedrFrom->lexNext(), firstExec, local, localParams, addedToList); + + if (!processedFrom.count(funcFrom)) { - for (auto& elem : common.second->getVariables()) + SgSymbol* modS = moduleF->symbol(); + SgStatement* useSt = new SgStatement(USE_STMT); + useSt->setSymbol(*modS); + hedrFrom->insertStmtAfter(*useSt, *hedrFrom); + + SgStatement* gotoBlock = new SgStatement(IF_NODE); + vector insertToGotoBlock; + + gotoBlock->addComment("!GOTO LOAD BLOCK \n"); + gotoBlock->setExpression(0, *new SgVarRefExp(loadS[0]) == *new SgValueExp(0)); + + if (funcFrom->isMain) { - if (elem->getType() != CONST) - commonVars.insert(elem->getName()); - } - } - - const vector moduleNames = findAllModules(); - - SgStatement* moduleF = NULL; - const string cpModule = "spf_module_checkpoint"; - SgSymbol* mainModuleCpS = new SgSymbol(MODULE_NAME, cpModule.c_str()); - moduleF = new SgStatement(MODULE_STMT, NULL, mainModuleCpS); - SgStatement* global = current_file->firstStatement(); - global->insertStmtAfter(*moduleF, *global); - - for (auto& checkps : inFileCp) - { - const int line = checkps.first; - const int every = checkps.second.every; - const int numOfFiles = checkps.second.numOfFiles; - const int unitNum = checkps.second.unitNum; - const string additional = string("_") + to_string(current_file_id) + "_" + to_string(line); - const typeEvery type = checkps.second.type; - SgStatement* lastDecl = NULL; - - int numF = file->numberOfFunctions(); - SgStatement* func = NULL; - SgStatement* point = NULL; - for (int z = 0; z < numF; ++z) - { - func = file->functions(z); - point = func->lexNext(); - while (point && point->lineNumber() < line && point != func->lastNodeOfStmt() && point->variant() != CONTAINS_STMT) - point = point->lexNext(); - - if (point != func->lastNodeOfStmt()) - break; - point = NULL; - func = NULL; - } - checkNull(func, convertFileName(__FILE__).c_str(), __LINE__); - checkNull(point, convertFileName(__FILE__).c_str(), __LINE__); - - if (func) - { - const int labNum = getNextFreeLabel(); - - bool createdModuleForIO = createForIOs(filesInfo, func); - - lastDecl = func->lexNext(); - while (lastDecl && !isSgExecutableStatement(lastDecl->lexNext())) - lastDecl = lastDecl->lexNext(); - - checkNull(lastDecl, convertFileName(__FILE__).c_str(), __LINE__); - SgStatement* firstExec = lastDecl->lexNext(); - - vector local; - map localParams; - set addedToList; - findLocalData(func->lexNext(), lastDecl, local, localParams, addedToList); - const vector useOfMods = findUseOfModules(func->lexNext(), lastDecl); - - SgStatement* loadBlock = new SgStatement(IF_NODE); - SgStatement* storeBlock = new SgStatement(IF_NODE); - - point->insertStmtBefore(*loadBlock, *point->controlParent()); - point->insertStmtBefore(*storeBlock, *point->controlParent()); - - loadBlock->addComment("! LOAD CHECKPOINT\n"); - auto loadblockLab = new SgLabel(labNum); - loadBlock->setLabel(*loadblockLab); - - string filesS = "spf_cp_files" + additional; - SgSymbol* files = new SgSymbol(VARIABLE_NAME, filesS.c_str(), createArrayCharType(32, numOfFiles + 1), func); - SgArrayRefExp* journal = new SgArrayRefExp(*files, *new SgValueExp(numOfFiles + 1)); - - //give max len, dont insert - int maxFileLen = insertInitNamesOfFiles(numOfFiles, additional, files, journal, NULL); - - vector everyS; - vector profS; - vector initS; - - string profSs = "spf_cp_prof_s" + additional; - string profEs = "spf_cp_prof_e" + additional; - profS.push_back(new SgSymbol(VARIABLE_NAME, profSs.c_str(), SgTypeFloat(), func)); - profS.push_back(new SgSymbol(VARIABLE_NAME, profEs.c_str(), SgTypeFloat(), func)); - - SgSymbol* timeF = new SgSymbol(FUNCTION_NAME, "omp_get_wtime", SgTypeDouble(),func); // OR dvtime - - SgStatement* profCallS = new SgAssignStmt(*new SgVarRefExp(profS[0]), *new SgFunctionCallExp(*timeF)); - SgStatement* profCallE = new SgAssignStmt(*new SgVarRefExp(profS[1]), *new SgFunctionCallExp(*timeF)); - - if (type == typeEvery::TIME) - { - string everySs = "spf_cp_start" + additional; - string everyEs = "spf_cp_end" + additional; - everyS.push_back(new SgSymbol(VARIABLE_NAME, everySs.c_str(), SgTypeFloat(), func)); - everyS.push_back(new SgSymbol(VARIABLE_NAME, everyEs.c_str(), SgTypeFloat(), func)); - - initS.push_back(NULL); - initS.push_back(NULL); - - SgStatement* call = new SgAssignStmt(*new SgVarRefExp(everyS[0]), *new SgFunctionCallExp(*timeF)); - lastDecl->insertStmtAfter(*call, *func); - lastDecl->insertStmtAfter(*new SgStatement(DVM_BARRIER_DIR), *func); - - storeBlock->insertStmtAfter(call->copy(), *storeBlock); - storeBlock->insertStmtAfter(*new SgStatement(DVM_BARRIER_DIR), *storeBlock); - - call = new SgAssignStmt(*new SgVarRefExp(everyS[1]), *new SgFunctionCallExp(*timeF)); - storeBlock->insertStmtBefore(*new SgStatement(DVM_BARRIER_DIR), *storeBlock->controlParent()); - storeBlock->insertStmtBefore(*call, *storeBlock->controlParent()); - call->lexPrev()->addComment("! STORE CHECKPOINT\n"); - - storeBlock->setExpression(0, *new SgVarRefExp(everyS[1]) - *new SgVarRefExp(everyS[0]) >= *new SgValueExp(every)); - } - else if (type == typeEvery::ITER) - { - string everyIs = "spf_cp_interval" + additional; - everyS.push_back(new SgSymbol(VARIABLE_NAME, everyIs.c_str(), SgTypeInt(), func)); - initS.push_back(new SgValueExp(0)); - SgAssignStmt* init = new SgAssignStmt(*new SgVarRefExp(everyS[0]), *new SgValueExp(0)); - storeBlock->insertStmtAfter(*init, *storeBlock); - - SgAssignStmt* inc = new SgAssignStmt(*new SgVarRefExp(everyS[0]), *new SgVarRefExp(everyS[0]) + *new SgValueExp(1)); - storeBlock->insertStmtBefore(*inc, *storeBlock->controlParent()); - inc->addComment("! STORE CHECKPOINT\n"); - - storeBlock->setExpression(0, *new SgVarRefExp(everyS[0]) >= *new SgValueExp(every)); - } - - vector loadS; - vector initLoadS; - vector insertToLoadS; - - string cpLoadS = "spf_cp_load" + additional; - loadS.push_back(new SgSymbol(VARIABLE_NAME, cpLoadS.c_str(), SgTypeInt(), func)); - initLoadS.push_back(new SgValueExp(0)); - - string fileNS = "spf_cp_file_n" + additional; - loadS.push_back(new SgSymbol(VARIABLE_NAME, fileNS.c_str(), SgTypeInt(), func)); - initLoadS.push_back(new SgValueExp(1)); - - string iostatS = "spf_cp_iostat" + additional; - loadS.push_back(new SgSymbol(VARIABLE_NAME, iostatS.c_str(), SgTypeInt(), func)); - initLoadS.push_back(NULL); - - /*string loadSaveS = "spf_cp_load_save" + additional; - loadS.push_back(new SgSymbol(VARIABLE_NAME, loadSaveS.c_str(), SgTypeInt(), func)); - initLoadS.push_back(new SgValueExp(0));*/ - - string loadLabelS = "spf_cp_load_label" + additional; - loadS.push_back(new SgSymbol(VARIABLE_NAME, loadLabelS.c_str(), SgTypeInt(), func)); - initLoadS.push_back(new SgValueExp(0)); - - string saveFS = "spf_cp_save_flag" + additional; - loadS.push_back(new SgSymbol(VARIABLE_NAME, saveFS.c_str(), SgTypeInt(), func)); - initLoadS.push_back(new SgValueExp(0)); - - loadBlock->setExpression(0, *new SgVarRefExp(loadS[0]) == *new SgValueExp(0)); - SgAssignStmt* init = new SgAssignStmt(*new SgVarRefExp(loadS[0]), *new SgValueExp(1)); - insertToLoadS.push_back(init); - - vector listSpec; - - SgExpression& unitNull = SgAssignOp(*new SgKeywordValExp("unit"), *new SgKeywordValExp("*")); - SgExpression& unit = SgAssignOp(*new SgKeywordValExp("unit"), *new SgValueExp(unitNum)); - SgExpression& frmt = SgAssignOp(*new SgKeywordValExp("fmt"), *new SgKeywordValExp("*")); - SgExpression& frmtProf = SgAssignOp(*new SgKeywordValExp("fmt"), *new SgValueExp(("(A,A" + to_string(maxFileLen) + ",F4.2,A)").c_str())); - - SgExpression* iostat = new SgVarRefExp(loadS[2]); - SgExpression* fileIdx = new SgVarRefExp(loadS[1]); - - listSpec.push_back(&SgAssignOp(*new SgKeywordValExp("iostat"), *iostat)); - listSpec.push_back(&SgAssignOp(*new SgKeywordValExp("status"), *new SgValueExp("old"))); - listSpec.push_back(&SgAssignOp(*new SgKeywordValExp("file"), *journal)); - listSpec.push_back(&unit); - - SgIOControlStmt* openJ_old = new SgIOControlStmt(OPEN_STAT, *makeExprList(listSpec, false)); - insertToLoadS.push_back(openJ_old); + SgAssignStmt* loadOne = new SgAssignStmt(*new SgVarRefExp(loadS[0]), *new SgValueExp(1)); + insertToGotoBlock.push_back(loadOne); + insertToGotoBlock.push_back(createOpenJ_old(iostat, journal, unit)); vector insertToifLoadOk; SgIfStmt* ifLoadOk = new SgIfStmt(*iostat == *new SgValueExp(0)); - insertToLoadS.push_back(ifLoadOk); + insertToGotoBlock.push_back(ifLoadOk); SgInputOutputStmt* read = new SgInputOutputStmt(READ_STAT, *makeExprList({ &frmt, &unit }, false), *fileIdx); insertToifLoadOk.push_back(read); insertToifLoadOk.push_back(new SgIOControlStmt(CLOSE_STAT, unit)); + insertToifLoadOk.push_back(createOpen(iostat, files, fileIdx, unit)); - listSpec.clear(); - listSpec.push_back(&SgAssignOp(*new SgKeywordValExp("form"), *new SgValueExp("unformatted"))); - listSpec.push_back(&SgAssignOp(*new SgKeywordValExp("iostat"), *iostat)); - listSpec.push_back(&SgAssignOp(*new SgKeywordValExp("status"), *new SgValueExp("old"))); - listSpec.push_back(&SgAssignOp(*new SgKeywordValExp("file"), *new SgArrayRefExp(*files, *fileIdx))); - listSpec.push_back(&unit); - - SgIOControlStmt* open = new SgIOControlStmt(OPEN_STAT, *makeExprList(listSpec, false)); - insertToifLoadOk.push_back(open); - - SgIfStmt* ifLoadOk1 = new SgIfStmt(*iostat == *new SgValueExp(0), *new SgIOControlStmt(CLOSE_STAT, unit)); - + read = new SgInputOutputStmt(READ_STAT, *makeExprList({ &frmt, &unit }, false), *new SgVarRefExp(loadS[3])); + SgIfStmt* ifLoadOk1 = new SgIfStmt(*iostat == *new SgValueExp(0), *read); + SgAssignStmt* loadZero = new SgAssignStmt(*new SgVarRefExp(loadS[0]), *new SgValueExp(0)); + ifLoadOk1->insertStmtAfter(*loadZero, *ifLoadOk1); insertToifLoadOk.push_back(ifLoadOk1); - ifLoadOk1->insertStmtAfter(*new SgIfStmt(*fileIdx == *new SgValueExp(numOfFiles + 1), *new SgAssignStmt(*fileIdx, *new SgValueExp(1))), *ifLoadOk1); - ifLoadOk1->insertStmtAfter(*new SgAssignStmt(*fileIdx, *fileIdx + *new SgValueExp(1)), *ifLoadOk1); - ifLoadOk1->addComment("! LOAD DATA FROM CHECKPOINT\n"); - vector commentArgs; - commentArgs.push_back(new SgValueExp(" SECONDS")); - commentArgs.push_back(&(*new SgVarRefExp(profS[1]) - *new SgVarRefExp(profS[0]))); - commentArgs.push_back(new SgArrayRefExp(*files, *fileIdx)); - commentArgs.push_back(new SgValueExp("SPF CHECKPOINT LOADED FROM ")); + firstExec->insertStmtBefore(*gotoBlock, *hedrFrom); - ifLoadOk1->insertStmtAfter(*new SgInputOutputStmt(WRITE_STAT, *makeExprList({ &frmtProf, &unitNull }, false), *makeExprList(commentArgs, false)), *ifLoadOk1); - ifLoadOk1->insertStmtAfter(profCallE->copy(), *ifLoadOk1); + for (int z = insertToGotoBlock.size() - 1; z >= 0; --z) + gotoBlock->insertStmtAfter(*insertToGotoBlock[z], *gotoBlock); - //open all files - if (createdModuleForIO) + for (int z = insertToifLoadOk.size() - 1; z >= 0; --z) + ifLoadOk->insertStmtAfter(*insertToifLoadOk[z], *ifLoadOk); + + processedFrom[funcFrom] = ifLoadOk1->lexNext(); + } + else + { + SgStatement* read = new SgInputOutputStmt(READ_STAT, *makeExprList({ &frmt, &unit }, false), *new SgVarRefExp(loadS[3])); + gotoBlock->insertStmtAfter(*read, *gotoBlock); + processedFrom[funcFrom] = gotoBlock->lexNext(); + firstExec->insertStmtBefore(*gotoBlock, *hedrFrom); + } + } + + for (auto& callInfo : funcFrom->callsFromDetailed) + { + auto& call = callInfo.pointerDetailCallsFrom; + SgStatement* st = NULL; + + if (isSgFuncHedrStmt(hedrTo) && call.second == FUNC_CALL) + { + SgFunctionCallExp* callExp = (SgFunctionCallExp*)call.first; + if (!strcmp(callExp->funName()->identifier(), funcTo->funcName.c_str())) { - SgCallStmt* call = new SgCallStmt(*new SgSymbol(FUNCTION_NAME, iosNames[1].c_str())); - ifLoadOk1->insertStmtAfter(*call, *ifLoadOk1); - } + st = SgStatement::getStatmentByExpression(callExp); + SgSymbol* buf = new SgSymbol(VARIABLE_NAME, ("SPF_CALL_" + funcTo->funcName + "_" + to_string(callNum)).c_str(), callExp->type(), funcFrom->funcPointer->GetOriginal()); + SgExpression* bufRef = new SgVarRefExp(buf); + SgStatement* bufAssign = new SgAssignStmt(*bufRef, *callExp); + st->insertStmtBefore(*bufAssign, *(st->controlParent())); + replaceExprByExprInSt(st, callExp, bufRef); + makeDeclaration(hedrFrom, { buf }); - //READ from modules - for (auto& mod : moduleNames) - { - SgCallStmt* call = new SgCallStmt(*new SgSymbol(FUNCTION_NAME, ("SPF_CP_" + mod).c_str())); - call->addArg(*new SgValueExp(unitNum)); - call->addArg(*new SgValueExp(0)); - ifLoadOk1->insertStmtAfter(*call, *ifLoadOk1); + for (int i = 0; i < callExp->numberOfArgs(); i++) + { + if (funcTo->funcParams.isArgInOut(i) || funcTo->funcParams.isArgOut(i)) + { + SgSymbol* s, * sl; + SgStatement* lst = hedrTo->lastNodeOfStmt(); + sl = lst->lexNext() ? lst->lexNext()->symbol() : NULL; + for (s = hedrTo->symbol(); s != sl && s; s = s->next()) + { + if (s->scope() == hedrTo && !strcmp(s->identifier(), funcTo->funcParams.identificators[i].c_str())) + { + break; + } + } + + SgSymbol* argBuf = new SgSymbol(VARIABLE_NAME, ("SPF_ARG_" + funcTo->funcName + "_" + to_string(callNum) + "_" + to_string(i)).c_str(), s->type(), funcFrom->funcPointer->GetOriginal()); + SgExpression* argBufRef = new SgVarRefExp(argBuf); + SgStatement* argBufAssign = new SgAssignStmt(*argBufRef, *(callExp->arg(i))); + bufAssign->insertStmtBefore(*argBufAssign, *(st->controlParent())); + SgStatement* decl = makeDeclaration(hedrFrom, { argBuf }); + + for (int i = 0; i < 3; i++) + { + SgExpression* e; + if (e = decl->expr(i)) + decl->setExpression(i, CalculateInteger(ReplaceConstant(e))); + } + + } + } + st = bufAssign; + callNum++; } + } + else if (isSgProcHedrStmt(hedrTo) && call.second == PROC_STAT) + { + //TODO: need to revise!! + /*SgCallStmt* callSt = (SgCallStmt*)call.first; + if (!strcmp(callSt->name()->identifier(), funcTo->funcName.c_str())) { + st = callSt; + for (int i = 0; i < callSt->numberOfArgs(); i++) + { + if (funcTo->funcParams.isArgInOut(i) || funcTo->funcParams.isArgOut(i)) + { + SgSymbol* buf1 = new SgSymbol(VARIABLE_NAME, "TEMP1", callSt->arg(i)->type(), hedrFrom); + SgExpression* buf1Ref = new SgVarRefExp(buf1); + SgStatement* buf1Assign = new SgAssignStmt(*buf1Ref, *(callSt->arg(i))); + st->insertStmtBefore(*buf1Assign, *(st->controlParent())); + } + } + }*/ + } + + if (st) + { + SgStatement* loadBlock = new SgStatement(IF_NODE); + SgStatement* loadBlockLast = NULL; + SgStatement* storeBlock = new SgStatement(IF_NODE); + + st->insertStmtBefore(*loadBlock, *st->controlParent()); + st->insertStmtAfter(*storeBlock, *st->controlParent()); + + loadBlock->addComment("! LOAD CHECKPOINT\n"); + const int labNum = getNextFreeLabel(); + auto loadblockLab = new SgLabel(labNum); + loadBlock->setLabel(*loadblockLab); + + SgIfStmt* gotoIf = new SgIfStmt(*new SgVarRefExp(loadS[3]) == *new SgValueExp(labNum), *new SgGotoStmt(*loadblockLab)); + processedFrom[funcFrom]->insertStmtAfter(*gotoIf, *(processedFrom[funcFrom]->controlParent())); + + storeBlock->addComment("! STORE CHECKPOINT\n"); + + //TODO: this block incorrect!! + storeBlock->setExpression(0, *new SgVarRefExp(everyS[0]) >= *new SgValueExp(every)); + + vector insertToLoadS; + + loadBlock->setExpression(0, *new SgVarRefExp(loadS[0]) == *new SgValueExp(0)); + loadBlock->addComment("! LOAD DATA FROM CHECKPOINT\n"); //READ DATA if (local.size()) { - auto dataRead = new SgInputOutputStmt(READ_STAT, unit, *makeExprList(local, false)); - ifLoadOk1->insertStmtAfter(*dataRead, *ifLoadOk1); - } - - ifLoadOk1->insertStmtAfter(profCallS->copy(), *ifLoadOk1); - - listSpec.clear(); - listSpec.push_back(&SgAssignOp(*new SgKeywordValExp("form"), *new SgValueExp("unformatted"))); - listSpec.push_back(&SgAssignOp(*new SgKeywordValExp("iostat"), *iostat)); - listSpec.push_back(&SgAssignOp(*new SgKeywordValExp("file"), *new SgArrayRefExp(*files, *fileIdx))); - listSpec.push_back(&unit); - - open = new SgIOControlStmt(OPEN_STAT, *makeExprList(listSpec, false)); - storeBlock->insertStmtAfter(*open, *storeBlock); - - SgIfStmt* ifStoreOk = new SgIfStmt(*iostat == *new SgValueExp(0)); - open->insertStmtAfter(*ifStoreOk, *storeBlock); - ifStoreOk->insertStmtAfter(*new SgIfStmt(*fileIdx == *new SgValueExp(numOfFiles + 1), *new SgAssignStmt(*fileIdx, *new SgValueExp(1))), *ifStoreOk); - ifStoreOk->insertStmtAfter(*new SgAssignStmt(*fileIdx, *fileIdx + *new SgValueExp(1)), *ifStoreOk); - ifStoreOk->addComment(("! STORE DATA TO CHECKPOINT " + to_string(local.size()) + " items\n").c_str()); - - commentArgs.clear(); - commentArgs.push_back(new SgValueExp(" SECONDS")); - commentArgs.push_back(&(*new SgVarRefExp(profS[1]) - *new SgVarRefExp(profS[0]))); - commentArgs.push_back(new SgArrayRefExp(*files, *fileIdx)); - commentArgs.push_back(new SgValueExp("SPF CHECKPOINT STORED TO ")); - - ifStoreOk->insertStmtAfter(*new SgInputOutputStmt(WRITE_STAT, *makeExprList({ &frmtProf, &unitNull }, false), *makeExprList(commentArgs, false)), *ifStoreOk); - ifStoreOk->insertStmtAfter(profCallE->copy(), *ifStoreOk); - - SgStatement* assign = ifStoreOk->lexNext(); - - //open all files - if (createdModuleForIO) - { - SgCallStmt* call = new SgCallStmt(*new SgSymbol(FUNCTION_NAME, iosNames[1].c_str())); - ifStoreOk->insertStmtAfter(*call, *ifStoreOk); - } - //WRITE from modules - for (auto& mod : moduleNames) - { - SgCallStmt* call = new SgCallStmt(*new SgSymbol(FUNCTION_NAME, ("SPF_CP_" + mod).c_str())); - call->addArg(*new SgValueExp(unitNum)); - call->addArg(*new SgValueExp(1)); - ifStoreOk->insertStmtAfter(*call, *ifStoreOk); - } - - //close and inc - if (createdModuleForIO) - { - SgCallStmt* call = new SgCallStmt(*new SgSymbol(FUNCTION_NAME, iosNames[2].c_str())); - ifStoreOk->insertStmtAfter(*call, *ifStoreOk); - call = new SgCallStmt(*new SgSymbol(FUNCTION_NAME, iosNames[0].c_str())); - ifStoreOk->insertStmtAfter(*call, *ifStoreOk); - } - - //WRITE DATA - if (local.size()) - { - SgStatement* dataWrite = new SgInputOutputStmt(WRITE_STAT, unit, *makeExprList(local, false)); - ifStoreOk->insertStmtAfter(*dataWrite, *ifStoreOk); - } - - listSpec.clear(); - listSpec.push_back(&SgAssignOp(*new SgKeywordValExp("iostat"), *iostat)); - listSpec.push_back(&SgAssignOp(*new SgKeywordValExp("file"), *journal)); - listSpec.push_back(&unit); - - SgIOControlStmt* openJ_new = new SgIOControlStmt(OPEN_STAT, *makeExprList(listSpec, false)); - - assign->insertStmtBefore(*new SgIOControlStmt(CLOSE_STAT, unit), *ifStoreOk); - assign->insertStmtBefore(*openJ_new, *ifStoreOk); - assign->insertStmtBefore(*new SgInputOutputStmt(WRITE_STAT, *makeExprList({ &frmt, &unit }, false), *fileIdx), *ifStoreOk); - assign->insertStmtBefore(*new SgIOControlStmt(CLOSE_STAT, unit), *ifStoreOk); - - ifStoreOk->insertStmtAfter(profCallS->copy(), *ifStoreOk); - - SgStatement* copyForGoto = loadBlock->copyPtr(); - copyForGoto->deleteLabel(); - firstExec->insertStmtBefore(*copyForGoto, *func); - insertInitNamesOfFiles(numOfFiles, additional, files, journal, copyForGoto, true); - - copyForGoto->insertStmtAfter(insertToLoadS[insertToLoadS.size() - 1]->copy(), *copyForGoto); - copyForGoto->insertStmtAfter(insertToLoadS[insertToLoadS.size() - 2]->copy(), *copyForGoto); - - copyForGoto = copyForGoto->lexNext()->lexNext(); - - copyForGoto->insertStmtAfter(*new SgGotoStmt(*loadblockLab), *copyForGoto); - copyForGoto->insertStmtAfter(*new SgIOControlStmt(CLOSE_STAT, unit), *copyForGoto); - - for (int z = insertToLoadS.size() - 1; z >= 0; --z) - loadBlock->insertStmtAfter(*insertToLoadS[z], *loadBlock); - - for (int z = insertToifLoadOk.size() - 1; z >= 0; --z) - ifLoadOk->insertStmtAfter(*insertToifLoadOk[z], *ifLoadOk); - - - //TODO: - /*set elemNotDeclHere; - for (auto& elem : commonVars) - { - if (addedToList.find(elem) == addedToList.end()) - elemNotDeclHere.insert(elem); - } - for (auto& elem : elemNotDeclHere) - printf("%s\n", elem.c_str());*/ - - // make all new declarations - makeDeclaration(moduleF, everyS, &initS); - makeDeclaration(moduleF, loadS, &initLoadS); - makeDeclaration(moduleF, profS); - makeDeclaration(moduleF, { files }); - makeDeclaration(func, { timeF }); - - func->insertStmtAfter(*new SgStatement(USE_STMT, NULL, mainModuleCpS), *func); - - //check use - map modulesDone; - for (auto& elem : moduleNames) - modulesDone[elem] = false; - - //check with ONLY - for (auto& use : useOfMods) - { - const string modName = use->symbol()->identifier(); - if (!modulesDone[modName]) - { - if (use->expr(0)) // has ONLY - { - SgExpression* ex = use->expr(0); - if (ex && ex->variant() == ONLY_NODE) - { - modulesDone[modName] = true; - auto callName = new SgSymbol(VARIABLE_NAME, ("SPF_CP_" + modName).c_str()); - ex->setLhs(new SgExpression(EXPR_LIST, new SgVarRefExp(callName), ex->lhs())); - } - } - } - } - - //check other - for (auto& use : useOfMods) - { - const string modName = use->symbol()->identifier(); - if (!modulesDone[modName]) - modulesDone[modName] = true; - } - - for (auto& elem : modulesDone) - { - if (!elem.second) - { - auto callName = new SgSymbol(VARIABLE_NAME, ("SPF_CP_" + elem.first).c_str()); - SgSymbol* modS = new SgSymbol(VARIABLE_NAME, elem.first.c_str()); - - vector onlyList; - onlyList.push_back(new SgVarRefExp(callName)); - if (elem.first == "spf_module_ios") - for (int z = 0; z < 3; ++z) - onlyList.push_back(new SgVarRefExp(new SgSymbol(VARIABLE_NAME, iosNames[z].c_str()))); - - SgExpression* only = new SgExpression(ONLY_NODE, makeExprList(onlyList), NULL); - SgStatement* use = new SgStatement(USE_STMT, NULL, modS, only, NULL, NULL); - func->insertStmtAfter(*use, *func); - } - } - - FuncInfo* funcI = NULL; - for (auto& funcs : allFuncInfo) - if (funcs->funcName == func->symbol()->identifier()) - funcI = funcs; - - if (funcI == NULL) - checkNull(funcI, convertFileName(__FILE__).c_str(), __LINE__); - - set> toProcess; - fillToProcess(funcI, toProcess); - - map processedFrom; - for (auto j = toProcess.begin(); j != toProcess.end(); j++) - { - int callNum = 1; - SgStatement* hedrTo = (j->first)->funcPointer->GetOriginal(); - SgStatement* hedrFrom = (j->second)->funcPointer->GetOriginal(); - SgStatement* lastDecl = hedrFrom->lexNext(); - while (lastDecl && !isSgExecutableStatement(lastDecl->lexNext())) - lastDecl = lastDecl->lexNext(); - - SgStatement* firstExec = lastDecl->lexNext(); - vector local; - map localParams; - set addedToList; - findLocalData(hedrFrom->lexNext(), lastDecl, local, localParams, addedToList); - if (!processedFrom.count(j->second)) - { - SgSymbol* modS = moduleF->symbol(); - SgStatement* useSt = new SgStatement(USE_STMT); - useSt->setSymbol(*modS); - hedrFrom->insertStmtAfter(*useSt, *hedrFrom); - - SgStatement* gotoBlock = new SgStatement(IF_NODE); - vector insertToGotoBlock; - - gotoBlock->addComment("!GOTO LOAD BLOCK \n"); - gotoBlock->setExpression(0, *new SgVarRefExp(loadS[0]) == *new SgValueExp(0)); - - if (j->second->isMain) - { - SgAssignStmt* loadOne = new SgAssignStmt(*new SgVarRefExp(loadS[0]), *new SgValueExp(1)); - insertToGotoBlock.push_back(loadOne); - - listSpec.clear(); - listSpec.push_back(&SgAssignOp(*new SgKeywordValExp("iostat"), *iostat)); - listSpec.push_back(&SgAssignOp(*new SgKeywordValExp("status"), *new SgValueExp("old"))); - listSpec.push_back(&SgAssignOp(*new SgKeywordValExp("file"), *journal)); - listSpec.push_back(&unit); - - SgIOControlStmt* openJ_old = new SgIOControlStmt(OPEN_STAT, *makeExprList(listSpec, false)); - insertToGotoBlock.push_back(openJ_old); - - vector insertToifLoadOk; - SgIfStmt* ifLoadOk = new SgIfStmt(*iostat == *new SgValueExp(0)); - insertToGotoBlock.push_back(ifLoadOk); - - SgInputOutputStmt* read = new SgInputOutputStmt(READ_STAT, *makeExprList({ &frmt, &unit }, false), *fileIdx); - insertToifLoadOk.push_back(read); - insertToifLoadOk.push_back(new SgIOControlStmt(CLOSE_STAT, unit)); - - listSpec.clear(); - listSpec.push_back(&SgAssignOp(*new SgKeywordValExp("form"), *new SgValueExp("unformatted"))); - listSpec.push_back(&SgAssignOp(*new SgKeywordValExp("iostat"), *iostat)); - listSpec.push_back(&SgAssignOp(*new SgKeywordValExp("status"), *new SgValueExp("old"))); - listSpec.push_back(&SgAssignOp(*new SgKeywordValExp("file"), *new SgArrayRefExp(*files, *fileIdx))); - listSpec.push_back(&unit); - - SgIOControlStmt* open = new SgIOControlStmt(OPEN_STAT, *makeExprList(listSpec, false)); - insertToifLoadOk.push_back(open); - - read = new SgInputOutputStmt(READ_STAT, *makeExprList({ &frmt, &unit }, false), *new SgVarRefExp(loadS[3])); - SgIfStmt* ifLoadOk1 = new SgIfStmt(*iostat == *new SgValueExp(0), *read); - SgAssignStmt* loadZero = new SgAssignStmt(*new SgVarRefExp(loadS[0]), *new SgValueExp(0)); - ifLoadOk1->insertStmtAfter(*loadZero, *ifLoadOk1); - - insertToifLoadOk.push_back(ifLoadOk1); - - firstExec->insertStmtBefore(*gotoBlock, *hedrFrom); - - for (int z = insertToGotoBlock.size() - 1; z >= 0; --z) - gotoBlock->insertStmtAfter(*insertToGotoBlock[z], *gotoBlock); - - for (int z = insertToifLoadOk.size() - 1; z >= 0; --z) - ifLoadOk->insertStmtAfter(*insertToifLoadOk[z], *ifLoadOk); - - processedFrom[j->second] = ifLoadOk1->lexNext(); - processedFrom[j->second]->unparsestdout(); - } - else - { - SgStatement * read = new SgInputOutputStmt(READ_STAT, *makeExprList({ &frmt, &unit }, false), *new SgVarRefExp(loadS[3])); - gotoBlock->insertStmtAfter(*read, *gotoBlock); - processedFrom[j->second] = gotoBlock->lexNext(); - } - - } - - for (auto& callInfo : j->second->callsFromDetailed) - { - auto& call = callInfo.pointerDetailCallsFrom; - SgStatement* st = NULL; - - if (isSgFuncHedrStmt(hedrTo) && call.second == FUNC_CALL) - { - SgFunctionCallExp* callExp = (SgFunctionCallExp*)call.first; - if (!strcmp(callExp->funName()->identifier(), (j->first)->funcName.c_str())) - { - st = SgStatement::getStatmentByExpression(callExp); - SgSymbol * buf = new SgSymbol(VARIABLE_NAME, ("SPF_CALL_"+ (j->first)->funcName + "_" + to_string(callNum)).c_str(), callExp->type(), (j->second)->funcPointer->GetOriginal()); - SgExpression* bufRef = new SgVarRefExp(buf); - SgStatement* bufAssign = new SgAssignStmt(*bufRef, *callExp); - st->insertStmtBefore(*bufAssign,* (st->controlParent())); - replaceExprByExprInSt(st, callExp, bufRef); - makeDeclaration(hedrFrom, { buf }); - for (int i = 0; i < callExp->numberOfArgs(); i++) - { - if ((j->first)->funcParams.isArgInOut(i) || (j->first)->funcParams.isArgOut(i)) - { - SgSymbol* s, * sl; - SgStatement* lst = hedrTo->lastNodeOfStmt(); - sl = lst->lexNext() ? lst->lexNext()->symbol() : NULL; - for (s = hedrTo->symbol(); s != sl && s; s = s->next()) - { - if (s->scope() == hedrTo && !strcmp(s->identifier(), (j->first)->funcParams.identificators[i].c_str())) - { - break; - } - - } - - SgSymbol* argBuf = new SgSymbol(VARIABLE_NAME, ("SPF_ARG_" + (j->first)->funcName+"_" + to_string(callNum) + "_" + to_string(i)).c_str(), s->type(), (j->second)->funcPointer->GetOriginal()); - SgExpression* argBufRef = new SgVarRefExp(argBuf); - SgStatement* argBufAssign = new SgAssignStmt(*argBufRef, *(callExp->arg(i))); - bufAssign->insertStmtBefore(*argBufAssign, *(st->controlParent())); - SgStatement* decl = makeDeclaration(hedrFrom, {argBuf}); - - for (int i = 0; i < 3; i++) - { - SgExpression* e; - if (e = decl->expr(i)) - decl->setExpression(i, CalculateInteger(ReplaceConstant(e))); - } - - } - - } - st = bufAssign; - callNum++; - } - } - else if (isSgProcHedrStmt(hedrTo) && call.second == PROC_STAT) - { - SgCallStmt* callSt = (SgCallStmt*)call.first; - if (!strcmp(callSt->name()->identifier(), (j->first)->funcName.c_str())) { - st = callSt; - for (int i = 0; i < callSt->numberOfArgs(); i++) - { - if ((j->first)->funcParams.isArgInOut(i) || (j->first)->funcParams.isArgOut(i)) - { - SgSymbol* buf1 = new SgSymbol(VARIABLE_NAME, "TEMP1", callSt->arg(i)->type(), hedrFrom); - SgExpression* buf1Ref = new SgVarRefExp(buf1); - SgStatement* buf1Assign = new SgAssignStmt(*buf1Ref, *(callSt->arg(i))); - st->insertStmtBefore(*buf1Assign, *(st->controlParent())); - } - - } - } - } - if (st) { - SgStatement* loadBlock = new SgStatement(IF_NODE); - SgStatement* loadBlockLast = NULL; - SgStatement* storeBlock = new SgStatement(IF_NODE); - - st->insertStmtBefore(*loadBlock, *st->controlParent()); - st->insertStmtAfter(*storeBlock, *st->controlParent()); - - loadBlock->addComment("! LOAD CHECKPOINT\n"); - const int labNum = getNextFreeLabel(); - auto loadblockLab = new SgLabel(labNum); - loadBlock->setLabel(*loadblockLab); - - SgIfStmt* gotoIf = new SgIfStmt(*new SgVarRefExp(loadS[3]) == *new SgValueExp(labNum), *new SgGotoStmt(*loadblockLab)); - processedFrom[j->second]->insertStmtAfter(*gotoIf,*(processedFrom[j->second]->controlParent())); - - storeBlock->addComment("! STORE CHECKPOINT\n"); - - storeBlock->setExpression(0, *new SgVarRefExp(everyS[0]) >= *new SgValueExp(every)); - - vector insertToLoadS; - - loadBlock->setExpression(0, *new SgVarRefExp(loadS[0]) == *new SgValueExp(0)); - loadBlock->addComment("! LOAD DATA FROM CHECKPOINT\n"); - - //READ DATA - if (local.size()) - { - auto dataRead = new SgInputOutputStmt(READ_STAT, unit, *makeExprList(local)); - loadBlock->insertStmtAfter(*dataRead, *loadBlock); - } - - } - } + auto dataRead = new SgInputOutputStmt(READ_STAT, unit, *makeExprList(local)); + loadBlock->insertStmtAfter(*dataRead, *loadBlock); } } } } - - //process modules +} + +static void processModules(SgFile* file) +{ vector modules; findModulesInFile(file, modules); for (auto& mod : modules) @@ -1149,7 +749,7 @@ void createCheckpoints(SgFile *file, const map& commonBloc newF->AddArg("unit_f", *SgTypeInt()); newF->AddArg("type_of_op", *SgTypeInt()); - + if (local.size()) { SgExpression& unit = SgAssignOp(*new SgKeywordValExp("unit"), *new SgVarRefExp(*newF->parameter(0))); @@ -1161,7 +761,411 @@ void createCheckpoints(SgFile *file, const map& commonBloc ifBlock->addComment(("!STORE OR LOAD " + to_string(local.size()) + " ITEMS\n").c_str()); } - } + } +} + +void createCheckpoints(SgFile* file, const map& commonBlocks, const map& filesInfo, + const vector& allFuncInfo) +{ + map inFileCp; + bool inFile = findSpfCpDir(file, inFileCp); + + if (!inFile) + { + processModules(file); + return; + } + + set commonVars; + for (auto& common : commonBlocks) + for (auto& elem : common.second->getVariables()) + if (elem->getType() != CONST) + commonVars.insert(elem->getName()); + + const vector moduleNames = findAllModules(); + + SgStatement* moduleF = NULL; + const string cpModule = "spf_module_checkpoint"; + SgSymbol* mainModuleCpS = new SgSymbol(MODULE_NAME, cpModule.c_str()); + moduleF = new SgStatement(MODULE_STMT, NULL, mainModuleCpS); + SgStatement* global = current_file->firstStatement(); + global->insertStmtAfter(*moduleF, *global); + + for (auto& checkps : inFileCp) + { + const int cpLine = checkps.first; + const int every = checkps.second.every; + const int numOfFiles = checkps.second.numOfFiles; + const int unitNum = checkps.second.unitNum; + const string additional = string("_") + to_string(current_file_id) + "_" + to_string(cpLine); + const typeEvery type = checkps.second.type; + + const int numF = file->numberOfFunctions(); + SgStatement* func = NULL; + SgStatement* point = NULL; + for (int z = 0; z < numF; ++z) + { + func = file->functions(z); + point = func->lexNext(); + while (point && point->lineNumber() < cpLine && point != func->lastNodeOfStmt() && point->variant() != CONTAINS_STMT) + point = point->lexNext(); + + //cp place was found + if (point != func->lastNodeOfStmt()) + break; + point = NULL; + func = NULL; + } + checkNull(func, convertFileName(__FILE__).c_str(), __LINE__); + checkNull(point, convertFileName(__FILE__).c_str(), __LINE__); + + const int labNum = getNextFreeLabel(); + bool createdModuleForIO = createForIOs(filesInfo, func); + + SgStatement* lastDecl = func->lexNext(); + while (lastDecl && !isSgExecutableStatement(lastDecl->lexNext())) + lastDecl = lastDecl->lexNext(); + + checkNull(lastDecl, convertFileName(__FILE__).c_str(), __LINE__); + SgStatement* firstExec = lastDecl->lexNext(); + + vector local; + map localParams; + set addedToList; + findLocalData(func->lexNext(), firstExec, local, localParams, addedToList); + const vector useOfMods = findUseOfModules(func->lexNext(), firstExec); + + SgStatement* loadBlock = new SgStatement(IF_NODE); + SgStatement* storeBlock = new SgStatement(IF_NODE); + + point->insertStmtBefore(*loadBlock, *point->controlParent()); + point->insertStmtBefore(*storeBlock, *point->controlParent()); + + loadBlock->addComment("! LOAD CHECKPOINT\n"); + auto loadblockLab = new SgLabel(labNum); + loadBlock->setLabel(*loadblockLab); + + string filesS = "spf_cp_files" + additional; + SgSymbol* files = new SgSymbol(VARIABLE_NAME, filesS.c_str(), createArrayCharType(32, numOfFiles + 1), func); + SgArrayRefExp* journal = new SgArrayRefExp(*files, *new SgValueExp(numOfFiles + 1)); + + //give max len, dont insert + int maxFileLen = insertInitNamesOfFiles(numOfFiles, additional, files, journal, NULL); + + vector everyS; + vector profS; + vector initS; + + string profSs = "spf_cp_prof_s" + additional; + string profEs = "spf_cp_prof_e" + additional; + profS.push_back(new SgSymbol(VARIABLE_NAME, profSs.c_str(), SgTypeFloat(), func)); + profS.push_back(new SgSymbol(VARIABLE_NAME, profEs.c_str(), SgTypeFloat(), func)); + + SgSymbol* timeF = new SgSymbol(FUNCTION_NAME, "omp_get_wtime", SgTypeDouble(), func); // OR dvtime + + SgStatement* profCallS = new SgAssignStmt(*new SgVarRefExp(profS[0]), *new SgFunctionCallExp(*timeF)); + SgStatement* profCallE = new SgAssignStmt(*new SgVarRefExp(profS[1]), *new SgFunctionCallExp(*timeF)); + + if (type == typeEvery::TIME) + { + string everySs = "spf_cp_start" + additional; + string everyEs = "spf_cp_end" + additional; + everyS.push_back(new SgSymbol(VARIABLE_NAME, everySs.c_str(), SgTypeFloat(), func)); + everyS.push_back(new SgSymbol(VARIABLE_NAME, everyEs.c_str(), SgTypeFloat(), func)); + + initS.push_back(NULL); + initS.push_back(NULL); + + SgStatement* call = new SgAssignStmt(*new SgVarRefExp(everyS[0]), *new SgFunctionCallExp(*timeF)); + lastDecl->insertStmtAfter(*call, *func); + lastDecl->insertStmtAfter(*new SgStatement(DVM_BARRIER_DIR), *func); + + storeBlock->insertStmtAfter(call->copy(), *storeBlock); + storeBlock->insertStmtAfter(*new SgStatement(DVM_BARRIER_DIR), *storeBlock); + + call = new SgAssignStmt(*new SgVarRefExp(everyS[1]), *new SgFunctionCallExp(*timeF)); + storeBlock->insertStmtBefore(*new SgStatement(DVM_BARRIER_DIR), *storeBlock->controlParent()); + storeBlock->insertStmtBefore(*call, *storeBlock->controlParent()); + call->lexPrev()->addComment("! STORE CHECKPOINT\n"); + + storeBlock->setExpression(0, *new SgVarRefExp(everyS[1]) - *new SgVarRefExp(everyS[0]) >= *new SgValueExp(every)); + } + else if (type == typeEvery::ITER) + { + string everyIs = "spf_cp_interval" + additional; + everyS.push_back(new SgSymbol(VARIABLE_NAME, everyIs.c_str(), SgTypeInt(), func)); + initS.push_back(new SgValueExp(0)); + SgAssignStmt* init = new SgAssignStmt(*new SgVarRefExp(everyS[0]), *new SgValueExp(0)); + storeBlock->insertStmtAfter(*init, *storeBlock); + + SgAssignStmt* inc = new SgAssignStmt(*new SgVarRefExp(everyS[0]), *new SgVarRefExp(everyS[0]) + *new SgValueExp(1)); + storeBlock->insertStmtBefore(*inc, *storeBlock->controlParent()); + inc->addComment("! STORE CHECKPOINT\n"); + + storeBlock->setExpression(0, *new SgVarRefExp(everyS[0]) >= *new SgValueExp(every)); + } + + vector loadS; + vector initLoadS; + vector insertToLoadS; + + string cpLoadS = "spf_cp_load" + additional; + loadS.push_back(new SgSymbol(VARIABLE_NAME, cpLoadS.c_str(), SgTypeInt(), func)); + initLoadS.push_back(new SgValueExp(0)); + + string fileNS = "spf_cp_file_n" + additional; + loadS.push_back(new SgSymbol(VARIABLE_NAME, fileNS.c_str(), SgTypeInt(), func)); + initLoadS.push_back(new SgValueExp(1)); + + string iostatS = "spf_cp_iostat" + additional; + loadS.push_back(new SgSymbol(VARIABLE_NAME, iostatS.c_str(), SgTypeInt(), func)); + initLoadS.push_back(NULL); + + /*string loadSaveS = "spf_cp_load_save" + additional; + loadS.push_back(new SgSymbol(VARIABLE_NAME, loadSaveS.c_str(), SgTypeInt(), func)); + initLoadS.push_back(new SgValueExp(0));*/ + + string loadLabelS = "spf_cp_load_label" + additional; + loadS.push_back(new SgSymbol(VARIABLE_NAME, loadLabelS.c_str(), SgTypeInt(), func)); + initLoadS.push_back(new SgValueExp(0)); + + string saveFS = "spf_cp_save_flag" + additional; + loadS.push_back(new SgSymbol(VARIABLE_NAME, saveFS.c_str(), SgTypeInt(), func)); + initLoadS.push_back(new SgValueExp(0)); + + loadBlock->setExpression(0, *new SgVarRefExp(loadS[0]) == *new SgValueExp(0)); + SgAssignStmt* init = new SgAssignStmt(*new SgVarRefExp(loadS[0]), *new SgValueExp(1)); + insertToLoadS.push_back(init); + + + + SgExpression& unitNull = SgAssignOp(*new SgKeywordValExp("unit"), *new SgKeywordValExp("*")); + SgExpression& unit = SgAssignOp(*new SgKeywordValExp("unit"), *new SgValueExp(unitNum)); + SgExpression& frmt = SgAssignOp(*new SgKeywordValExp("fmt"), *new SgKeywordValExp("*")); + SgExpression& frmtProf = SgAssignOp(*new SgKeywordValExp("fmt"), *new SgValueExp(("(A,A" + to_string(maxFileLen) + ",F4.2,A)").c_str())); + + SgExpression* iostat = new SgVarRefExp(loadS[2]); + SgExpression* fileIdx = new SgVarRefExp(loadS[1]); + + insertToLoadS.push_back(createOpenJ_old(iostat, journal, unit)); + + vector insertToifLoadOk; + SgIfStmt* ifLoadOk = new SgIfStmt(*iostat == *new SgValueExp(0)); + insertToLoadS.push_back(ifLoadOk); + + SgInputOutputStmt* read = new SgInputOutputStmt(READ_STAT, *makeExprList({ &frmt, &unit }, false), *fileIdx); + insertToifLoadOk.push_back(read); + insertToifLoadOk.push_back(new SgIOControlStmt(CLOSE_STAT, unit)); + insertToifLoadOk.push_back(createOpen(iostat, files, fileIdx, unit)); + + SgIfStmt* ifLoadOk1 = new SgIfStmt(*iostat == *new SgValueExp(0), *new SgIOControlStmt(CLOSE_STAT, unit)); + + + insertToifLoadOk.push_back(ifLoadOk1); + ifLoadOk1->insertStmtAfter(*new SgIfStmt(*fileIdx == *new SgValueExp(numOfFiles + 1), *new SgAssignStmt(*fileIdx, *new SgValueExp(1))), *ifLoadOk1); + ifLoadOk1->insertStmtAfter(*new SgAssignStmt(*fileIdx, *fileIdx + *new SgValueExp(1)), *ifLoadOk1); + ifLoadOk1->addComment("! LOAD DATA FROM CHECKPOINT\n"); + + vector commentArgs; + commentArgs.push_back(new SgValueExp(" SECONDS")); + commentArgs.push_back(&(*new SgVarRefExp(profS[1]) - *new SgVarRefExp(profS[0]))); + commentArgs.push_back(new SgArrayRefExp(*files, *fileIdx)); + commentArgs.push_back(new SgValueExp("SPF CHECKPOINT LOADED FROM ")); + + ifLoadOk1->insertStmtAfter(*new SgInputOutputStmt(WRITE_STAT, *makeExprList({ &frmtProf, &unitNull }, false), *makeExprList(commentArgs, false)), *ifLoadOk1); + ifLoadOk1->insertStmtAfter(profCallE->copy(), *ifLoadOk1); + + //open all files + if (createdModuleForIO) + { + SgCallStmt* call = new SgCallStmt(*new SgSymbol(FUNCTION_NAME, iosNames[1].c_str())); + ifLoadOk1->insertStmtAfter(*call, *ifLoadOk1); + } + + //READ from modules + for (auto& mod : moduleNames) + { + SgCallStmt* call = new SgCallStmt(*new SgSymbol(FUNCTION_NAME, ("SPF_CP_" + mod).c_str())); + call->addArg(*new SgValueExp(unitNum)); + call->addArg(*new SgValueExp(0)); + ifLoadOk1->insertStmtAfter(*call, *ifLoadOk1); + } + + //READ DATA + if (local.size()) + { + auto dataRead = new SgInputOutputStmt(READ_STAT, unit, *makeExprList(local, false)); + ifLoadOk1->insertStmtAfter(*dataRead, *ifLoadOk1); + } + + ifLoadOk1->insertStmtAfter(profCallS->copy(), *ifLoadOk1); + + vector listSpec; + listSpec.push_back(&SgAssignOp(*new SgKeywordValExp("form"), *new SgValueExp("unformatted"))); + listSpec.push_back(&SgAssignOp(*new SgKeywordValExp("iostat"), *iostat)); + listSpec.push_back(&SgAssignOp(*new SgKeywordValExp("file"), *new SgArrayRefExp(*files, *fileIdx))); + listSpec.push_back(&unit); + + SgIOControlStmt* open = new SgIOControlStmt(OPEN_STAT, *makeExprList(listSpec, false)); + storeBlock->insertStmtAfter(*open, *storeBlock); + + SgIfStmt* ifStoreOk = new SgIfStmt(*iostat == *new SgValueExp(0)); + open->insertStmtAfter(*ifStoreOk, *storeBlock); + ifStoreOk->insertStmtAfter(*new SgIfStmt(*fileIdx == *new SgValueExp(numOfFiles + 1), *new SgAssignStmt(*fileIdx, *new SgValueExp(1))), *ifStoreOk); + ifStoreOk->insertStmtAfter(*new SgAssignStmt(*fileIdx, *fileIdx + *new SgValueExp(1)), *ifStoreOk); + ifStoreOk->addComment(("! STORE DATA TO CHECKPOINT " + to_string(local.size()) + " items\n").c_str()); + + commentArgs.clear(); + commentArgs.push_back(new SgValueExp(" SECONDS")); + commentArgs.push_back(&(*new SgVarRefExp(profS[1]) - *new SgVarRefExp(profS[0]))); + commentArgs.push_back(new SgArrayRefExp(*files, *fileIdx)); + commentArgs.push_back(new SgValueExp("SPF CHECKPOINT STORED TO ")); + + ifStoreOk->insertStmtAfter(*new SgInputOutputStmt(WRITE_STAT, *makeExprList({ &frmtProf, &unitNull }, false), *makeExprList(commentArgs, false)), *ifStoreOk); + ifStoreOk->insertStmtAfter(profCallE->copy(), *ifStoreOk); + + SgStatement* assign = ifStoreOk->lexNext(); + + //open all files + if (createdModuleForIO) + { + SgCallStmt* call = new SgCallStmt(*new SgSymbol(FUNCTION_NAME, iosNames[1].c_str())); + ifStoreOk->insertStmtAfter(*call, *ifStoreOk); + } + //WRITE from modules + for (auto& mod : moduleNames) + { + SgCallStmt* call = new SgCallStmt(*new SgSymbol(FUNCTION_NAME, ("SPF_CP_" + mod).c_str())); + call->addArg(*new SgValueExp(unitNum)); + call->addArg(*new SgValueExp(1)); + ifStoreOk->insertStmtAfter(*call, *ifStoreOk); + } + + //close and inc + if (createdModuleForIO) + { + SgCallStmt* call = new SgCallStmt(*new SgSymbol(FUNCTION_NAME, iosNames[2].c_str())); + ifStoreOk->insertStmtAfter(*call, *ifStoreOk); + call = new SgCallStmt(*new SgSymbol(FUNCTION_NAME, iosNames[0].c_str())); + ifStoreOk->insertStmtAfter(*call, *ifStoreOk); + } + + //WRITE DATA + if (local.size()) + { + SgStatement* dataWrite = new SgInputOutputStmt(WRITE_STAT, unit, *makeExprList(local, false)); + ifStoreOk->insertStmtAfter(*dataWrite, *ifStoreOk); + } + + listSpec.clear(); + listSpec.push_back(&SgAssignOp(*new SgKeywordValExp("iostat"), *iostat)); + listSpec.push_back(&SgAssignOp(*new SgKeywordValExp("file"), *journal)); + listSpec.push_back(&unit); + + SgIOControlStmt* openJ_new = new SgIOControlStmt(OPEN_STAT, *makeExprList(listSpec, false)); + + assign->insertStmtBefore(*new SgIOControlStmt(CLOSE_STAT, unit), *ifStoreOk); + assign->insertStmtBefore(*openJ_new, *ifStoreOk); + assign->insertStmtBefore(*new SgInputOutputStmt(WRITE_STAT, *makeExprList({ &frmt, &unit }, false), *fileIdx), *ifStoreOk); + assign->insertStmtBefore(*new SgIOControlStmt(CLOSE_STAT, unit), *ifStoreOk); + + ifStoreOk->insertStmtAfter(profCallS->copy(), *ifStoreOk); + + SgStatement* copyForGoto = loadBlock->copyPtr(); + copyForGoto->deleteLabel(); + firstExec->insertStmtBefore(*copyForGoto, *func); + insertInitNamesOfFiles(numOfFiles, additional, files, journal, copyForGoto, true); + + copyForGoto->insertStmtAfter(insertToLoadS[insertToLoadS.size() - 1]->copy(), *copyForGoto); + copyForGoto->insertStmtAfter(insertToLoadS[insertToLoadS.size() - 2]->copy(), *copyForGoto); + + copyForGoto = copyForGoto->lexNext()->lexNext(); + + copyForGoto->insertStmtAfter(*new SgGotoStmt(*loadblockLab), *copyForGoto); + copyForGoto->insertStmtAfter(*new SgIOControlStmt(CLOSE_STAT, unit), *copyForGoto); + + for (int z = insertToLoadS.size() - 1; z >= 0; --z) + loadBlock->insertStmtAfter(*insertToLoadS[z], *loadBlock); + + for (int z = insertToifLoadOk.size() - 1; z >= 0; --z) + ifLoadOk->insertStmtAfter(*insertToifLoadOk[z], *ifLoadOk); + + + //TODO: + /*set elemNotDeclHere; + for (auto& elem : commonVars) + { + if (addedToList.find(elem) == addedToList.end()) + elemNotDeclHere.insert(elem); + } + for (auto& elem : elemNotDeclHere) + printf("%s\n", elem.c_str());*/ + + // make all new declarations + makeDeclaration(moduleF, everyS, &initS); + makeDeclaration(moduleF, loadS, &initLoadS); + makeDeclaration(moduleF, profS); + makeDeclaration(moduleF, { files }); + makeDeclaration(func, { timeF }); + + func->insertStmtAfter(*new SgStatement(USE_STMT, NULL, mainModuleCpS), *func); + + //check use + map modulesDone; + for (auto& elem : moduleNames) + modulesDone[elem] = false; + + //check with ONLY + for (auto& use : useOfMods) + { + const string modName = use->symbol()->identifier(); + if (!modulesDone[modName]) + { + if (use->expr(0)) // has ONLY + { + SgExpression* ex = use->expr(0); + if (ex && ex->variant() == ONLY_NODE) + { + modulesDone[modName] = true; + auto callName = new SgSymbol(VARIABLE_NAME, ("SPF_CP_" + modName).c_str()); + ex->setLhs(new SgExpression(EXPR_LIST, new SgVarRefExp(callName), ex->lhs())); + } + } + } + } + + //check other + for (auto& use : useOfMods) + { + const string modName = use->symbol()->identifier(); + if (!modulesDone[modName]) + modulesDone[modName] = true; + } + + for (auto& elem : modulesDone) + { + if (!elem.second) + { + auto callName = new SgSymbol(VARIABLE_NAME, ("SPF_CP_" + elem.first).c_str()); + SgSymbol* modS = new SgSymbol(VARIABLE_NAME, elem.first.c_str()); + + vector onlyList; + onlyList.push_back(new SgVarRefExp(callName)); + if (elem.first == "spf_module_ios") + for (int z = 0; z < 3; ++z) + onlyList.push_back(new SgVarRefExp(new SgSymbol(VARIABLE_NAME, iosNames[z].c_str()))); + + SgExpression* only = new SgExpression(ONLY_NODE, makeExprList(onlyList), NULL); + SgStatement* use = new SgStatement(USE_STMT, NULL, modS, only, NULL, NULL); + func->insertStmtAfter(*use, *func); + } + } + + //TODO: this function needs to be completely rewritten!! + //processFunctionCallChain(func, allFuncInfo, moduleF, loadS, iostat, journal, frmt, unit, files, fileIdx, every, everyS); + } + + processModules(file); } static string cuttingType(const string& all_decl_with_init)