fixed implicit pass

This commit is contained in:
ALEXks
2024-05-15 17:54:18 +03:00
parent 87a4413472
commit 2fa0eb3e42
5 changed files with 57 additions and 24 deletions

View File

@@ -30,7 +30,7 @@ static void FillCommonTypes(map<char, SgType*>& types)
types[letter.first] = new SgType(T_FLOAT); types[letter.first] = new SgType(T_FLOAT);
} }
static void FindAllVars(SgExpression* expr, set<SgSymbol*>& allVars, set<SgSymbol*>& allVarsConst) static void FindAllVars(SgExpression* expr, set<SgSymbol*>& allVars, set<SgSymbol*>& allVarsConst, SgStatement* scope)
{ {
if (expr == NULL) if (expr == NULL)
return; return;
@@ -41,17 +41,22 @@ static void FindAllVars(SgExpression* expr, set<SgSymbol*>& allVars, set<SgSymbo
auto s = expr->symbol(); auto s = expr->symbol();
if ((s->attributes() & EXTERNAL_BIT)) if ((s->attributes() & EXTERNAL_BIT))
{ {
if (var == FUNC_CALL) if (var == FUNC_CALL && !IS_BY_USE(s) && s->scope() == scope)
allVars.insert(s); allVars.insert(s);
} }
else else
{
if (!IS_BY_USE(s) && s->scope() == scope)
{
allVars.insert(s); allVars.insert(s);
} }
}
}
else if (var == CONST_REF) else if (var == CONST_REF)
allVarsConst.insert(expr->symbol()); allVarsConst.insert(expr->symbol());
FindAllVars(expr->lhs(), allVars, allVarsConst); FindAllVars(expr->lhs(), allVars, allVarsConst, scope);
FindAllVars(expr->rhs(), allVars, allVarsConst); FindAllVars(expr->rhs(), allVars, allVarsConst, scope);
} }
static char getValue(SgExpression* ex) static char getValue(SgExpression* ex)
@@ -94,7 +99,7 @@ static void AddLettersToMap(SgExpression* expr, SgType* type, map<char, SgType*>
} }
} }
static vector<SgSymbol*> getVars(const char* funcSymbol, set<SgSymbol*>& toRename, static vector<SgSymbol*> getVars(const set<string>& functionSymbs, set<SgSymbol*>& toRename,
const set<SgSymbol*>& allVars, const map<char, SgType*>& types) const set<SgSymbol*>& allVars, const map<char, SgType*>& types)
{ {
vector<SgSymbol*> varsWithoutDecl; vector<SgSymbol*> varsWithoutDecl;
@@ -108,7 +113,7 @@ static vector<SgSymbol*> getVars(const char* funcSymbol, set<SgSymbol*>& toRenam
for (auto& var : allVars) for (auto& var : allVars)
{ {
if (string(var->identifier()) == funcSymbol) if (functionSymbs.count(var->identifier()))
continue; continue;
vector<SgStatement*> allDecls; vector<SgStatement*> allDecls;
@@ -194,14 +199,31 @@ static map<char, SgType*> FunctionImplicitCheck(SgStatement* function, const map
set<SgSymbol*> allDataSymbols; set<SgSymbol*> allDataSymbols;
for (auto s = function->symbol()->next(); s; s = s->next()) for (auto s = function->symbol()->next(); s; s = s->next())
if (s->attributes() & DATA_BIT) if ((s->attributes() & DATA_BIT) && s->scope() == function)
allDataSymbols.insert(s); allDataSymbols.insert(s);
set<string> functionSymbs = { function->symbol()->identifier() };
if (isSgFuncHedrStmt(function))
{
SgFuncHedrStmt* hedr = isSgFuncHedrStmt(function);
if (hedr->resultName())
functionSymbs.insert(hedr->resultName()->identifier());
}
for (auto st = function->lexNext(); st != endOfFunc && st->variant() != CONTAINS_STMT; st = st->lexNext()) for (auto st = function->lexNext(); st != endOfFunc && st->variant() != CONTAINS_STMT; st = st->lexNext())
{ {
if (skip.count(st->variant())) if (skip.count(st->variant()))
continue; continue;
if (isDVM_stat(st) || isSPF_stat(st))
continue;
if (st->variant() == INTERFACE_STMT)
{
st = st->lastNodeOfStmt();
continue;
}
if (st->variant() == DATA_DECL) if (st->variant() == DATA_DECL)
{ {
const string str = st->expr(0)->thellnd->entry.string_val; const string str = st->expr(0)->thellnd->entry.string_val;
@@ -214,10 +236,14 @@ static map<char, SgType*> FunctionImplicitCheck(SgStatement* function, const map
} }
for (int i = 0; i < 3; ++i) for (int i = 0; i < 3; ++i)
FindAllVars(st->expr(i), allVars, allVarsConst); FindAllVars(st->expr(i), allVars, allVarsConst, function);
if (st->variant() == FOR_NODE) if (st->variant() == FOR_NODE)
allVars.insert(isSgForStmt(st)->doName()); {
auto s = isSgForStmt(st)->doName();
if (!IS_BY_USE(s) && s->scope() == function)
allVars.insert(s);
}
} }
//add parameters //add parameters
@@ -232,8 +258,8 @@ static map<char, SgType*> FunctionImplicitCheck(SgStatement* function, const map
} }
} }
varsWithoutDecl = getVars(function->symbol()->identifier(), toRename, allVars, types); varsWithoutDecl = getVars(functionSymbs, toRename, allVars, types);
varsWithoutDeclConst = getVars(function->symbol()->identifier(), toRename, allVarsConst, types); varsWithoutDeclConst = getVars(functionSymbs, toRename, allVarsConst, types);
if (!hasImplicitNone) if (!hasImplicitNone)
{ {
@@ -272,10 +298,17 @@ static map<char, SgType*> FunctionImplicitCheck(SgStatement* function, const map
if (function->variant() == FUNC_HEDR) if (function->variant() == FUNC_HEDR)
{ {
SgFuncHedrStmt* hedr = isSgFuncHedrStmt(function);
auto type_op = function->expr(1); auto type_op = function->expr(1);
if (type_op == NULL) if (type_op == NULL)
{
if (hedr->resultName())
varsWithoutDecl.push_back(hedr->resultName());
else
varsWithoutDecl.push_back(function->symbol()); varsWithoutDecl.push_back(function->symbol());
} }
}
makeDeclaration(varsWithoutDecl, function); makeDeclaration(varsWithoutDecl, function);
@@ -306,9 +339,12 @@ void implicitCheck(SgFile* file)
{ {
map<SgStatement*, map<char, SgType*>> typesByFunctions; map<SgStatement*, map<char, SgType*>> typesByFunctions;
for (int func = 0; func < file->numberOfFunctions(); ++func) vector<SgStatement*> modulesAndFunctions;
getModulesAndFunctions(file, modulesAndFunctions);
for (int func = 0; func < modulesAndFunctions.size(); ++func)
{ {
SgStatement* function = file->functions(func); SgStatement* function = modulesAndFunctions[func];
typesByFunctions[function] = FunctionImplicitCheck(function, typesByFunctions); typesByFunctions[function] = FunctionImplicitCheck(function, typesByFunctions);
} }

View File

@@ -310,6 +310,8 @@ void InitPassesDependencies(map<passes, vector<passes>> &passDepsIn, set<passes>
list({ CALL_GRAPH2, REVERT_SUBST_EXPR_RD }) <= Pass(REMOVE_DEAD_CODE); list({ CALL_GRAPH2, REVERT_SUBST_EXPR_RD }) <= Pass(REMOVE_DEAD_CODE);
list({ REMOVE_DEAD_CODE, CONVERT_LOOP_TO_ASSIGN, RESTORE_LOOP_FROM_ASSIGN }) <= Pass(REMOVE_DEAD_CODE_AND_UNPARSE); list({ REMOVE_DEAD_CODE, CONVERT_LOOP_TO_ASSIGN, RESTORE_LOOP_FROM_ASSIGN }) <= Pass(REMOVE_DEAD_CODE_AND_UNPARSE);
Pass(CORRECT_VAR_DECL) <= Pass(SET_IMPLICIT_NONE);
passesIgnoreStateDone.insert({ CREATE_PARALLEL_DIRS, INSERT_PARALLEL_DIRS, INSERT_SHADOW_DIRS, EXTRACT_PARALLEL_DIRS, passesIgnoreStateDone.insert({ CREATE_PARALLEL_DIRS, INSERT_PARALLEL_DIRS, INSERT_SHADOW_DIRS, EXTRACT_PARALLEL_DIRS,
EXTRACT_SHADOW_DIRS, CREATE_REMOTES, UNPARSE_FILE, REMOVE_AND_CALC_SHADOW, EXTRACT_SHADOW_DIRS, CREATE_REMOTES, UNPARSE_FILE, REMOVE_AND_CALC_SHADOW,
REVERSE_CREATED_NESTED_LOOPS, PREDICT_SCHEME, CALCULATE_STATS_SCHEME, REVERT_SPF_DIRS, CLEAR_SPF_DIRS, TRANSFORM_SHADOW_IF_FULL, REVERSE_CREATED_NESTED_LOOPS, PREDICT_SCHEME, CALCULATE_STATS_SCHEME, REVERT_SPF_DIRS, CLEAR_SPF_DIRS, TRANSFORM_SHADOW_IF_FULL,

View File

@@ -997,7 +997,7 @@ static bool findSymbol(SgExpression *declLst, const string &toFind)
SgExpression* ex = exs.top(); SgExpression* ex = exs.top();
exs.pop(); exs.pop();
if (ex->variant() == ARRAY_REF || ex->variant() == VAR_REF) if (ex->variant() == ARRAY_REF || ex->variant() == VAR_REF || ex->variant() == CONST_REF)
{ {
if (ex->symbol()->identifier() == toFind) if (ex->symbol()->identifier() == toFind)
return true; return true;

View File

@@ -1,3 +1,3 @@
#pragma once #pragma once
#define VERSION_SPF "2337" #define VERSION_SPF "2339"

View File

@@ -590,7 +590,6 @@ bool checkAndMoveFormatOperators(SgFile* file, vector<Messages>& currMessages, b
SgStatement* lastNode = st->lastNodeOfStmt(); SgStatement* lastNode = st->lastNodeOfStmt();
vector<SgStatement*> toMove; vector<SgStatement*> toMove;
SgStatement* firstExec = NULL;
while (st != lastNode) while (st != lastNode)
{ {
if (st == NULL) if (st == NULL)
@@ -603,10 +602,7 @@ bool checkAndMoveFormatOperators(SgFile* file, vector<Messages>& currMessages, b
break; break;
if (isSgExecutableStatement(st) && !isDVM_stat(st) && !isSPF_stat(st)) if (isSgExecutableStatement(st) && !isDVM_stat(st) && !isSPF_stat(st))
{
firstExec = st;
break; break;
}
if (st->variant() == FORMAT_STAT) if (st->variant() == FORMAT_STAT)
{ {
@@ -630,9 +626,8 @@ bool checkAndMoveFormatOperators(SgFile* file, vector<Messages>& currMessages, b
{ {
if (!withError) if (!withError)
{ {
checkNull(firstExec, convertFileName(__FILE__).c_str(), __LINE__);
for (auto& format : toMove) for (auto& format : toMove)
firstExec->insertStmtBefore(*format, *firstExec->controlParent()); lastNode->insertStmtBefore(*format, *lastNode->controlParent());
} }
else else
{ {