checkpoints refactored
This commit is contained in:
@@ -497,24 +497,290 @@ static void replaceExprByExprInSt(SgStatement* st, SgExpression* from, SgExpress
|
||||
}
|
||||
}
|
||||
|
||||
static SgStatement* createOpenJ_old(SgExpression* iostat, SgArrayRefExp* journal, SgExpression& unit)
|
||||
{
|
||||
vector<SgExpression*> 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);
|
||||
|
||||
void createCheckpoints(SgFile *file, const map<string, CommonBlock*>& commonBlocks, const map<int, UserFiles>& filesInfo,
|
||||
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<SgExpression*> 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<FuncInfo*>& allFuncInfo, SgStatement* moduleF,
|
||||
const vector<SgSymbol*>& loadS, SgExpression* iostat, SgArrayRefExp* journal,
|
||||
SgExpression& frmt, SgExpression& unit,
|
||||
SgSymbol* files, SgExpression* fileIdx,
|
||||
const int every, const vector<SgSymbol*>& 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<pair<FuncInfo*, FuncInfo*>> toProcess;
|
||||
fillToProcess(funcI, toProcess);
|
||||
|
||||
map<FuncInfo*, SgStatement*> processedFrom;
|
||||
for (auto& pairs : toProcess)
|
||||
{
|
||||
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<SgExpression*> local;
|
||||
map<string, SgStatement*> localParams;
|
||||
set<string> addedToList;
|
||||
findLocalData(hedrFrom->lexNext(), firstExec, local, localParams, addedToList);
|
||||
|
||||
if (!processedFrom.count(funcFrom))
|
||||
{
|
||||
SgSymbol* modS = moduleF->symbol();
|
||||
SgStatement* useSt = new SgStatement(USE_STMT);
|
||||
useSt->setSymbol(*modS);
|
||||
hedrFrom->insertStmtAfter(*useSt, *hedrFrom);
|
||||
|
||||
SgStatement* gotoBlock = new SgStatement(IF_NODE);
|
||||
vector<SgStatement*> insertToGotoBlock;
|
||||
|
||||
gotoBlock->addComment("!GOTO LOAD BLOCK \n");
|
||||
gotoBlock->setExpression(0, *new SgVarRefExp(loadS[0]) == *new SgValueExp(0));
|
||||
|
||||
if (funcFrom->isMain)
|
||||
{
|
||||
SgAssignStmt* loadOne = new SgAssignStmt(*new SgVarRefExp(loadS[0]), *new SgValueExp(1));
|
||||
insertToGotoBlock.push_back(loadOne);
|
||||
insertToGotoBlock.push_back(createOpenJ_old(iostat, journal, unit));
|
||||
|
||||
vector<SgStatement*> 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));
|
||||
insertToifLoadOk.push_back(createOpen(iostat, files, fileIdx, 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);
|
||||
|
||||
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[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()))
|
||||
{
|
||||
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 });
|
||||
|
||||
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<SgStatement*> 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void processModules(SgFile* file)
|
||||
{
|
||||
vector<SgStatement*> modules;
|
||||
findModulesInFile(file, modules);
|
||||
for (auto& mod : modules)
|
||||
{
|
||||
if (!strcmp(mod->symbol()->identifier(), "spf_module_checkpoint"))
|
||||
continue;
|
||||
|
||||
bool hasContains = false;
|
||||
SgStatement* st = mod->lexNext();
|
||||
while (st != mod->lastNodeOfStmt() && !hasContains)
|
||||
{
|
||||
hasContains = st->variant() == CONTAINS_STMT;
|
||||
st = st->lexNext();
|
||||
}
|
||||
|
||||
vector<SgExpression*> local;
|
||||
map<string, SgStatement*> localParams;
|
||||
set<string> addedToList;
|
||||
findLocalData(mod->lexNext(), hasContains ? st : mod->lastNodeOfStmt(), local, localParams, addedToList);
|
||||
|
||||
SgProcHedrStmt* newF = new SgProcHedrStmt((string("spf_cp_") + mod->symbol()->identifier()).c_str());
|
||||
if (!hasContains)
|
||||
mod->lastNodeOfStmt()->insertStmtBefore(*new SgStatement(CONTAINS_STMT), *mod);
|
||||
mod->lastNodeOfStmt()->insertStmtBefore(*newF, *mod);
|
||||
|
||||
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)));
|
||||
auto dataRead = new SgInputOutputStmt(READ_STAT, unit, *makeExprList(local));
|
||||
auto dataWrite = new SgInputOutputStmt(WRITE_STAT, unit, *makeExprList(local));
|
||||
|
||||
SgIfStmt* ifBlock = new SgIfStmt(*new SgVarRefExp(*newF->parameter(1)) == *new SgValueExp(0), *dataRead, *dataWrite);
|
||||
newF->lastNodeOfStmt()->insertStmtBefore(*ifBlock, *newF);
|
||||
|
||||
ifBlock->addComment(("!STORE OR LOAD " + to_string(local.size()) + " ITEMS\n").c_str());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void createCheckpoints(SgFile* file, const map<string, CommonBlock*>& commonBlocks, const map<int, UserFiles>& filesInfo,
|
||||
const vector<FuncInfo*>& allFuncInfo)
|
||||
{
|
||||
map<int, cpInfo> inFileCp;
|
||||
bool inFile = findSpfCpDir(file, inFileCp);
|
||||
|
||||
if (inFile)
|
||||
if (!inFile)
|
||||
{
|
||||
processModules(file);
|
||||
return;
|
||||
}
|
||||
|
||||
set<string> commonVars;
|
||||
for (auto& common : commonBlocks)
|
||||
{
|
||||
for (auto& elem : common.second->getVariables())
|
||||
{
|
||||
if (elem->getType() != CONST)
|
||||
commonVars.insert(elem->getName());
|
||||
}
|
||||
}
|
||||
|
||||
const vector<string> moduleNames = findAllModules();
|
||||
|
||||
@@ -527,24 +793,24 @@ void createCheckpoints(SgFile *file, const map<string, CommonBlock*>& commonBloc
|
||||
|
||||
for (auto& checkps : inFileCp)
|
||||
{
|
||||
const int line = checkps.first;
|
||||
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(line);
|
||||
const string additional = string("_") + to_string(current_file_id) + "_" + to_string(cpLine);
|
||||
const typeEvery type = checkps.second.type;
|
||||
SgStatement* lastDecl = NULL;
|
||||
|
||||
int numF = file->numberOfFunctions();
|
||||
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() < line && point != func->lastNodeOfStmt() && point->variant() != CONTAINS_STMT)
|
||||
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;
|
||||
@@ -553,13 +819,10 @@ void createCheckpoints(SgFile *file, const map<string, CommonBlock*>& commonBloc
|
||||
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();
|
||||
SgStatement* lastDecl = func->lexNext();
|
||||
while (lastDecl && !isSgExecutableStatement(lastDecl->lexNext()))
|
||||
lastDecl = lastDecl->lexNext();
|
||||
|
||||
@@ -569,8 +832,8 @@ void createCheckpoints(SgFile *file, const map<string, CommonBlock*>& commonBloc
|
||||
vector<SgExpression*> local;
|
||||
map<string, SgStatement*> localParams;
|
||||
set<string> addedToList;
|
||||
findLocalData(func->lexNext(), lastDecl, local, localParams, addedToList);
|
||||
const vector<SgStatement*> useOfMods = findUseOfModules(func->lexNext(), lastDecl);
|
||||
findLocalData(func->lexNext(), firstExec, local, localParams, addedToList);
|
||||
const vector<SgStatement*> useOfMods = findUseOfModules(func->lexNext(), firstExec);
|
||||
|
||||
SgStatement* loadBlock = new SgStatement(IF_NODE);
|
||||
SgStatement* storeBlock = new SgStatement(IF_NODE);
|
||||
@@ -598,7 +861,7 @@ void createCheckpoints(SgFile *file, const map<string, CommonBlock*>& commonBloc
|
||||
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
|
||||
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));
|
||||
@@ -674,7 +937,7 @@ void createCheckpoints(SgFile *file, const map<string, CommonBlock*>& commonBloc
|
||||
SgAssignStmt* init = new SgAssignStmt(*new SgVarRefExp(loadS[0]), *new SgValueExp(1));
|
||||
insertToLoadS.push_back(init);
|
||||
|
||||
vector<SgExpression*> listSpec;
|
||||
|
||||
|
||||
SgExpression& unitNull = SgAssignOp(*new SgKeywordValExp("unit"), *new SgKeywordValExp("*"));
|
||||
SgExpression& unit = SgAssignOp(*new SgKeywordValExp("unit"), *new SgValueExp(unitNum));
|
||||
@@ -684,13 +947,7 @@ void createCheckpoints(SgFile *file, const map<string, CommonBlock*>& commonBloc
|
||||
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);
|
||||
insertToLoadS.push_back(createOpenJ_old(iostat, journal, unit));
|
||||
|
||||
vector<SgStatement*> insertToifLoadOk;
|
||||
SgIfStmt* ifLoadOk = new SgIfStmt(*iostat == *new SgValueExp(0));
|
||||
@@ -699,16 +956,7 @@ void createCheckpoints(SgFile *file, const map<string, CommonBlock*>& commonBloc
|
||||
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);
|
||||
insertToifLoadOk.push_back(createOpen(iostat, files, fileIdx, unit));
|
||||
|
||||
SgIfStmt* ifLoadOk1 = new SgIfStmt(*iostat == *new SgValueExp(0), *new SgIOControlStmt(CLOSE_STAT, unit));
|
||||
|
||||
@@ -752,13 +1000,13 @@ void createCheckpoints(SgFile *file, const map<string, CommonBlock*>& commonBloc
|
||||
|
||||
ifLoadOk1->insertStmtAfter(profCallS->copy(), *ifLoadOk1);
|
||||
|
||||
listSpec.clear();
|
||||
vector<SgExpression*> 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);
|
||||
|
||||
open = new SgIOControlStmt(OPEN_STAT, *makeExprList(listSpec, false));
|
||||
SgIOControlStmt* open = new SgIOControlStmt(OPEN_STAT, *makeExprList(listSpec, false));
|
||||
storeBlock->insertStmtAfter(*open, *storeBlock);
|
||||
|
||||
SgIfStmt* ifStoreOk = new SgIfStmt(*iostat == *new SgValueExp(0));
|
||||
@@ -913,255 +1161,11 @@ void createCheckpoints(SgFile *file, const map<string, CommonBlock*>& commonBloc
|
||||
}
|
||||
}
|
||||
|
||||
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<pair<FuncInfo*, FuncInfo*>> toProcess;
|
||||
fillToProcess(funcI, toProcess);
|
||||
|
||||
map<FuncInfo*, SgStatement*> 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<SgExpression*> local;
|
||||
map<string, SgStatement*> localParams;
|
||||
set<string> 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<SgStatement*> 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<SgStatement*> 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();
|
||||
//TODO: this function needs to be completely rewritten!!
|
||||
//processFunctionCallChain(func, allFuncInfo, moduleF, loadS, iostat, journal, frmt, unit, files, fileIdx, every, everyS);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
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<SgStatement*> 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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//process modules
|
||||
vector<SgStatement*> modules;
|
||||
findModulesInFile(file, modules);
|
||||
for (auto& mod : modules)
|
||||
{
|
||||
if (!strcmp(mod->symbol()->identifier(), "spf_module_checkpoint"))
|
||||
continue;
|
||||
|
||||
bool hasContains = false;
|
||||
SgStatement* st = mod->lexNext();
|
||||
while (st != mod->lastNodeOfStmt() && !hasContains)
|
||||
{
|
||||
hasContains = st->variant() == CONTAINS_STMT;
|
||||
st = st->lexNext();
|
||||
}
|
||||
|
||||
vector<SgExpression*> local;
|
||||
map<string, SgStatement*> localParams;
|
||||
set<string> addedToList;
|
||||
findLocalData(mod->lexNext(), hasContains ? st : mod->lastNodeOfStmt(), local, localParams, addedToList);
|
||||
|
||||
SgProcHedrStmt* newF = new SgProcHedrStmt((string("spf_cp_") + mod->symbol()->identifier()).c_str());
|
||||
if (!hasContains)
|
||||
mod->lastNodeOfStmt()->insertStmtBefore(*new SgStatement(CONTAINS_STMT), *mod);
|
||||
mod->lastNodeOfStmt()->insertStmtBefore(*newF, *mod);
|
||||
|
||||
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)));
|
||||
auto dataRead = new SgInputOutputStmt(READ_STAT, unit, *makeExprList(local));
|
||||
auto dataWrite = new SgInputOutputStmt(WRITE_STAT, unit, *makeExprList(local));
|
||||
|
||||
SgIfStmt* ifBlock = new SgIfStmt(*new SgVarRefExp(*newF->parameter(1)) == *new SgValueExp(0), *dataRead, *dataWrite);
|
||||
newF->lastNodeOfStmt()->insertStmtBefore(*ifBlock, *newF);
|
||||
|
||||
ifBlock->addComment(("!STORE OR LOAD " + to_string(local.size()) + " ITEMS\n").c_str());
|
||||
}
|
||||
}
|
||||
processModules(file);
|
||||
}
|
||||
|
||||
static string cuttingType(const string& all_decl_with_init)
|
||||
|
||||
Reference in New Issue
Block a user