added load/asve blocks

fixed creation module
This commit is contained in:
2024-04-19 14:35:58 +03:00
parent 7ae26ff776
commit 22c281398a

View File

@@ -76,7 +76,7 @@ static void findDecls(SgExpression* ex, vector<SgExpression*>& local, const map<
static FuncInfo* findFileInfoByName(SgStatement* func, const vector<FuncInfo*>& allFuncInfo)
{
FuncInfo* funcI = NULL;
for (auto& funcs : allFuncInfo)
for (const auto& funcs : allFuncInfo)
if (funcs->funcName == func->symbol()->identifier())
funcI = funcs;
checkNull(funcI, convertFileName(__FILE__).c_str(), __LINE__);
@@ -462,7 +462,7 @@ static int insertInitNamesOfFiles(const int numOfFiles, const string& additional
if (before)
insert->insertStmtBefore(*new SgAssignStmt(*new SgArrayRefExp(*files, *new SgValueExp(z)), *new SgValueExp(tmp.c_str())), *insert->controlParent());
else
insert->insertStmtAfter(*new SgAssignStmt(*new SgArrayRefExp(*files, *new SgValueExp(z)), *new SgValueExp(tmp.c_str())), *insert);
insert->insertStmtAfter(*new SgAssignStmt(*new SgArrayRefExp(*files, *new SgValueExp(z)), *new SgValueExp(tmp.c_str())), *insert->controlParent());
}
}
@@ -472,7 +472,7 @@ static int insertInitNamesOfFiles(const int numOfFiles, const string& additional
if (before)
insert->insertStmtBefore(*new SgAssignStmt(*journal, *new SgValueExp(tmp.c_str())), *insert->controlParent());
else
insert->insertStmtAfter(*new SgAssignStmt(*journal, *new SgValueExp(tmp.c_str())), *insert);
insert->insertStmtAfter(*new SgAssignStmt(*journal, *new SgValueExp(tmp.c_str())), *insert->controlParent());
}
return maxFileLen;
@@ -744,7 +744,15 @@ static void processModules(SgFile* file, const vector<FuncInfo*>& allFuncInfo)
findModulesInFile(file, modules);
for (auto& mod : modules)
{
if (!strcmp(mod->symbol()->identifier(), "spf_module_checkpoint"))
/*if (!strcmp(mod->symbol()->identifier(), "spf_module_checkpoint")) {
std::cout << "was here" << std::endl;
continue;
}*/
char pref[5];
strncpy(pref, mod->symbol()->identifier(), 4);
pref[4] = '\0';
if (!strcmp(pref, "spf_"))
continue;
bool hasContains = false;
@@ -782,14 +790,21 @@ static void processModules(SgFile* file, const vector<FuncInfo*>& allFuncInfo)
}
}
static SgSymbol* renamedNewSymb(SgSymbol* oldSymb, const char* prefix) {
int lenPrefix = strlen(prefix);
int lenSymbol = strlen(oldSymb->identifier());
char* result = new char[lenPrefix + lenSymbol + 2];
static char* mergedChar(const char* l, const char* r)
{
int lenL = strlen(l);
int lenR = strlen(r);
char* result = new char[lenL + lenR + 2];
strcpy(result, prefix);
strcpy(result, l);
strcat(result, "_");
strcat(result, oldSymb->identifier());
strcat(result, r);
return result;
}
static SgSymbol* renamedNewSymb(SgSymbol* oldSymb, const char* prefix) {
char* result = mergedChar(prefix, oldSymb->identifier());
SgSymbol* newSymb = new SgSymbol(oldSymb->variant(), result, oldSymb->type(), oldSymb->scope());
@@ -813,14 +828,16 @@ static void renameEx(SgExpression* sizeEx, const char* funcName) {
static void findSizeEx(SgExpression* sizeEx, const map<string, SgStatement*>& moduleStmts, const map<string, SgStatement*>& moduleParamStmts, SgStatement* proc_moduleF, set<string>& addedModuleParams) {
if (sizeEx->variant() == CONST_REF) {
if (moduleParamStmts.count(sizeEx->symbol()->identifier()) == 1) {
if (moduleParamStmts.count(sizeEx->symbol()->identifier()) == 1 && addedModuleParams.count(sizeEx->symbol()->identifier()) == 0) {
auto decl = (SgParameterStmt*)moduleParamStmts.at(sizeEx->symbol()->identifier());
SgStatement* copyParamStmt = moduleParamStmts.at(sizeEx->symbol()->identifier())->copyPtr();
proc_moduleF->insertStmtAfter(*copyParamStmt, *proc_moduleF);
if (moduleStmts.count(sizeEx->symbol()->identifier())) {
SgStatement* copyStmt = moduleStmts.at(sizeEx->symbol()->identifier())->copyPtr();
proc_moduleF->insertStmtAfter(*copyStmt, *proc_moduleF);
}
addedModuleParams.insert(sizeEx->symbol()->identifier());
@@ -867,12 +884,7 @@ static void processVarStmt(SgStatement* st, map<string, SgStatement*>& moduleStm
{
lhs = ex->lhs();
int lenSymbol = strlen(lhs->symbol()->identifier());
char* result = new char[lenFuncName + lenSymbol + 2];
strcpy(result, funcName);
strcat(result, "_");
strcat(result, lhs->symbol()->identifier());
char* result = mergedChar(funcName, lhs->symbol()->identifier());
SgSymbol* symb = new SgSymbol(lhs->symbol()->variant(), result, lhs->symbol()->type(), lhs->symbol()->scope());
SgExpression* newExpr = new SgExpression(lhs->variant());
@@ -932,7 +944,26 @@ static void processParamStmt(SgStatement* st, map<string, SgStatement*>& moduleP
}
}
static void processVarBlock(SgStatement* func, SgStatement* firstExec, map<string, SgStatement*>& moduleStmts, map<string, SgStatement*>& moduleParamStmts, set<string>& commonVariables)
static void processExternStmt(SgStatement* st, set<string>& externVars)
{
if (st->expr(0))
{
SgExpression* ex = st->expr(0);
SgExpression* lhs;
while (ex && ex->lhs())
{
lhs = ex->lhs();
externVars.insert(lhs->sunparse());
ex = ex->rhs();
}
}
}
static void processVarBlock(SgStatement* func, SgStatement* firstExec, map<string, SgStatement*>& moduleStmts,
map<string, SgStatement*>& moduleParamStmts, set<string>& commonVariables,
set<string>& externVars)
{
const char* funcName = func->symbol()->identifier();
@@ -944,24 +975,27 @@ static void processVarBlock(SgStatement* func, SgStatement* firstExec, map<strin
processVarStmt(st, moduleStmts, funcName);
else if (st->variant() == PARAM_DECL)
processParamStmt(st, moduleParamStmts, funcName);
else if (st->variant() == EXTERN_STAT)
processExternStmt(st, externVars);
}
}
static void insertStmtToModule(map<string, SgStatement*>& moduleStmts, map<string, SgStatement*>& moduleParamStmts, set<string>& addedModuleParams, set<string>& commonVariables, SgStatement* proc_moduleF)
static void insertStmtToModule(const map<string, SgStatement*>& moduleStmts, const map<string, SgStatement*>& moduleParamStmts,
set<string>& addedModuleParams, const set<string>& commonVariables, SgStatement* proc_moduleF,
set<string>& localVarNoParams, const set<string>& externVars)
{
SgStatement* endProcModuleF = proc_moduleF->lastNodeOfStmt();
endProcModuleF->unparsestdout();
for (const auto& [varName, varStmt] : moduleStmts) {
string varNameNoPref = varName;
string::size_type pos{};
pos = varName.find_first_of("_", pos);
varNameNoPref.erase(0, pos + 1);
if ((commonVariables.count(varNameNoPref) == 0) && (moduleParamStmts.count(varName) == 0)) {
if (commonVariables.count(varNameNoPref) == 0 && moduleParamStmts.count(varName) == 0
&& externVars.count(varNameNoPref) == 0) {
localVarNoParams.insert(varNameNoPref);
endProcModuleF->insertStmtBefore(*varStmt, *proc_moduleF);
if (varStmt->expr(0)->variant() == ARRAY_REF) {
@@ -1052,40 +1086,36 @@ void createCheckpoints(SgFile* file, const map<string, CommonBlock*>& commonBloc
set<string> addedToList;
findLocalData(func, firstExec, local, localParams, addedToList, allFuncInfo);
// external perems?
const char* funcName = func->symbol()->identifier();
int lenFuncName = strlen(funcName);
SgStatement* proc_moduleF = NULL;
const string proc_cpModule = "spf_module_" + string(funcName);
SgSymbol* proc_mainModuleCpS = new SgSymbol(MODULE_NAME, proc_cpModule.c_str());
proc_moduleF = new SgStatement(MODULE_STMT, NULL, proc_mainModuleCpS);
moduleF->insertStmtAfter(*proc_moduleF, *global);
SgStatement* endProcModuleF = new SgStatement(CONTROL_END);
proc_moduleF->insertStmtAfter(*endProcModuleF, *proc_moduleF);
const string proc_cpModule = "spf_module_" + string(funcName);;
createModule(proc_moduleF, proc_cpModule);
SgSymbol* proc_mainModuleCpS = proc_moduleF->symbol();
//SgStatement* endProcModuleF = proc_moduleF->lastNodeOfStmt();
map<string, SgStatement*> moduleStmts;
map<string, SgStatement*> moduleParamStmts;
set<string> commonVariables;
processVarBlock(func, firstExec, moduleStmts, moduleParamStmts, commonVariables);
set<string> externVars;
processVarBlock(func, firstExec, moduleStmts, moduleParamStmts, commonVariables, externVars);
set<string> addedModuleParams;
insertStmtToModule(moduleStmts, moduleParamStmts, addedModuleParams, commonVariables, proc_moduleF);
set<string> localVarNoParams;
insertStmtToModule(moduleStmts, moduleParamStmts, addedModuleParams, commonVariables, proc_moduleF, localVarNoParams, externVars);
const vector<SgStatement*> useOfMods = findUseOfModules(func->lexNext(), firstExec);
SgStatement* loadBlock = new SgStatement(IF_NODE);
SgStatement* storeBlock = new SgStatement(IF_NODE);
point->insertStmtBefore(*loadBlock, *point->controlParent());
firstExec->insertStmtBefore(*loadBlock, *firstExec->controlParent());
point->insertStmtBefore(*storeBlock, *point->controlParent());
loadBlock->addComment("! LOAD CHECKPOINT\n");
auto loadblockLab = new SgLabel(labNum);
loadBlock->setLabel(*loadblockLab);
//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);
@@ -1171,12 +1201,16 @@ void createCheckpoints(SgFile* file, const map<string, CommonBlock*>& commonBloc
loadS.push_back(new SgSymbol(VARIABLE_NAME, loadLabelS.c_str(), SgTypeInt(), func));
initLoadS.push_back(new SgValueExp(0));
string loadFS = "spf_cp_load_flag" + additional;
loadS.push_back(new SgSymbol(VARIABLE_NAME, loadFS.c_str(), SgTypeInt(), func));
initLoadS.push_back(new SgValueExp(1));
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));
loadBlock->setExpression(0, *new SgVarRefExp(loadS[4]) == *new SgValueExp(1)); //*new SgVarRefExp(loadS[0])
SgAssignStmt* init = new SgAssignStmt(*new SgVarRefExp(loadS[4]), *new SgValueExp(0));
insertToLoadS.push_back(init);
@@ -1186,6 +1220,7 @@ void createCheckpoints(SgFile* file, const map<string, CommonBlock*>& commonBloc
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* labelIdx = new SgVarRefExp(loadS[3]);
SgExpression* iostat = new SgVarRefExp(loadS[2]);
SgExpression* fileIdx = new SgVarRefExp(loadS[1]);
@@ -1195,15 +1230,21 @@ void createCheckpoints(SgFile* file, const map<string, CommonBlock*>& commonBloc
SgIfStmt* ifLoadOk = new SgIfStmt(*iostat == *new SgValueExp(0));
insertToLoadS.push_back(ifLoadOk);
SgInputOutputStmt* read = new SgInputOutputStmt(READ_STAT, *makeExprList({ &frmt, &unit }, false), *fileIdx);
SgInputOutputStmt* read = new SgInputOutputStmt(READ_STAT, *makeExprList({ &frmt, &unit }, false), *fileIdx); //*makeExprList({ fileIdx, labelIdx })
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));
SgIfStmt* ifLoadOk1 = new SgIfStmt(*iostat == *new SgValueExp(0)); //, *new SgIOControlStmt(CLOSE_STAT, unit)
insertToifLoadOk.push_back(ifLoadOk1);
auto nextStLab = new SgLabel(labNum);
ifLoadOk1->insertStmtAfter(*new SgGotoStmt(*nextStLab), *ifLoadOk1);
point->setLabel(*nextStLab);
ifLoadOk1->insertStmtAfter(*new SgIOControlStmt(CLOSE_STAT, unit), *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"); // program sleep (frozed) here
@@ -1217,6 +1258,16 @@ void createCheckpoints(SgFile* file, const map<string, CommonBlock*>& commonBloc
ifLoadOk1->insertStmtAfter(*new SgInputOutputStmt(WRITE_STAT, *makeExprList({ &frmtProf, &unitNull }, false), *makeExprList(commentArgs, false)), *ifLoadOk1);
ifLoadOk1->insertStmtAfter(profCallE->copy(), *ifLoadOk1);
// insert copy_block
for (auto localVar : localVarNoParams)
{
SgSymbol* leftSymb = new SgSymbol(VARIABLE_NAME, localVar.c_str());
SgExpression* leftEx = new SgVarRefExp(leftSymb);
SgSymbol* rightSymb = renamedNewSymb(leftSymb, funcName);
SgExpression* rightEx = new SgVarRefExp(rightSymb);
ifLoadOk1->insertStmtAfter(*new SgAssignStmt(*leftEx, *rightEx), *ifLoadOk1);
}
//open all files
if (createdModuleForIO)
{
@@ -1224,6 +1275,22 @@ void createCheckpoints(SgFile* file, const map<string, CommonBlock*>& commonBloc
ifLoadOk1->insertStmtAfter(*call, *ifLoadOk1);
}
//READ LOCAL DATA
vector<SgExpression*> variablesVec;
if (moduleStmts.size())
{
for (auto localVar : localVarNoParams)
{
const char* varName = localVar.c_str();
char* varNameWithPref = mergedChar(funcName, varName);
SgSymbol* symbVar = new SgSymbol(VARIABLE_NAME, varNameWithPref);
SgExpression* exVar = new SgVarRefExp(symbVar);
variablesVec.push_back(exVar);
}
auto dataRead = new SgInputOutputStmt(READ_STAT, unit, *makeExprList(variablesVec, false));
ifLoadOk1->insertStmtAfter(*dataRead, *ifLoadOk1);
}
//READ from modules
for (auto& mod : moduleNames)
{
@@ -1233,12 +1300,26 @@ void createCheckpoints(SgFile* file, const map<string, CommonBlock*>& commonBloc
ifLoadOk1->insertStmtAfter(*call, *ifLoadOk1);
}
//READ DATA
//READ COMMON DATA
vector<SgExpression*> commanVariablesVec;
if (commonVariables.size())
{
for (auto commanVar : commonVariables)
{
SgSymbol* symbCommon = new SgSymbol(VARIABLE_NAME, commanVar.c_str());
SgExpression* exCommon = new SgVarRefExp(symbCommon);
commanVariablesVec.push_back(exCommon);
}
auto commonDataRead = new SgInputOutputStmt(READ_STAT, unit, *makeExprList(commanVariablesVec, false));
ifLoadOk1->insertStmtAfter(*commonDataRead, *ifLoadOk1);
}
/*
if (local.size())
{
auto dataRead = new SgInputOutputStmt(READ_STAT, unit, *makeExprList(local, false));
ifLoadOk1->insertStmtAfter(*dataRead, *ifLoadOk1);
}
} */
ifLoadOk1->insertStmtAfter(profCallS->copy(), *ifLoadOk1);
@@ -1293,12 +1374,35 @@ void createCheckpoints(SgFile* file, const map<string, CommonBlock*>& commonBloc
}
//WRITE DATA
if (variablesVec.size())
{
auto dataWrite = new SgInputOutputStmt(WRITE_STAT, unit, *makeExprList(variablesVec, false));
ifStoreOk->insertStmtAfter(*dataWrite, *ifStoreOk);
}
if (commanVariablesVec.size())
{
auto commonDataWrite = new SgInputOutputStmt(WRITE_STAT, unit, *makeExprList(commanVariablesVec, false));
ifStoreOk->insertStmtAfter(*commonDataWrite, *ifStoreOk);
}
// insert copy_block
for (auto localVar : localVarNoParams)
{
SgSymbol* rightSymb = new SgSymbol(VARIABLE_NAME, localVar.c_str());
SgExpression* rightEx = new SgVarRefExp(rightSymb);
SgSymbol* leftSymb = renamedNewSymb(rightSymb, funcName);
SgExpression* leftEx = new SgVarRefExp(leftSymb);
ifStoreOk->insertStmtAfter(*new SgAssignStmt(*leftEx, *rightEx), *ifStoreOk);
}
/*
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));
@@ -1313,18 +1417,18 @@ void createCheckpoints(SgFile* file, const map<string, CommonBlock*>& commonBloc
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);
insertInitNamesOfFiles(numOfFiles, additional, files, journal, lastDecl, false);
/*
SgStatement* timeFStmt = new SgStatement(VAR_DECL);
timeFStmt->setSymbol(*timeF);
copyForGoto = copyForGoto->lexNext()->lexNext();
SgExpression* timeFExpr = new SgExpression(VAR_REF);
timeFStmt->setExpression(0, timeFExpr);
copyForGoto->insertStmtAfter(*new SgGotoStmt(*loadblockLab), *copyForGoto);
copyForGoto->insertStmtAfter(*new SgIOControlStmt(CLOSE_STAT, unit), *copyForGoto);
SgExpression* typeExpr = new SgExpression(DOUBLE_VAL);
timeFStmt->setExpression(1, typeExpr);
lastDecl->insertStmtBefore(*timeFStmt, *lastDecl->controlParent()); */
for (int z = insertToLoadS.size() - 1; z >= 0; --z)
loadBlock->insertStmtAfter(*insertToLoadS[z], *loadBlock);