fixed implicit pass

This commit is contained in:
ALEXks
2024-04-18 21:36:40 +03:00
parent 387707cd82
commit 0f79933131
7 changed files with 118 additions and 65 deletions

View File

@@ -4442,19 +4442,17 @@ void Call(SgSymbol *s, SgExpression *e)
if (IsInternalProcedure(s) && analyzing)
Error(" Call of the procedure %s in a region, which is internal/module procedure", s->identifier(), 580, cur_st);
if (!isUserFunction(s) && isIntrinsicFunctionName(s->identifier())) //IsNoBodyProcedure(s)
if (!isUserFunction(s) && (s->attributes() & INTRINSIC_BIT || isIntrinsicFunctionName(s->identifier()))) //IsNoBodyProcedure(s)
{
RefInExpr(e, _READ_);
return;
}
//if (inparloop || IN_STATEMENT_GROUP(cur_st))
//{
if (analyzing)
{
if ((!IsPureProcedure(s) && (s->variant() != FUNCTION_NAME || !options.isOn(NO_PURE_FUNC))) || IS_BY_USE(s))
{
Warning(" Call of the procedure %s in a region, which is not pure or is module procedure", s->identifier(), 580, cur_st);
Warning(" Call of the procedure %s in a region, which is not pure. Module procedure call is illegal. Intrinsic procedure should be specified by INTRINSIC statement.", s->identifier(), 580, cur_st);
doNotForCuda();
}
}
@@ -4464,7 +4462,7 @@ void Call(SgSymbol *s, SgExpression *e)
MarkAsCalled(s);
acc_call_list = AddNewToSymbList(acc_call_list, s);
}
//}
if (!e) //argument list is absent
return;
in_arg_list++;

View File

@@ -52,12 +52,10 @@ void initIntrinsicFunctionNames()
return;
intrinsicF.insert(string("abs"));
#ifdef __SPF
intrinsicF.insert(string("adjustl"));
#endif
intrinsicF.insert(string("and"));
#ifdef __SPF
intrinsicF.insert(string("any"));
#ifdef __SPF
intrinsicF.insert(string("associated"));
intrinsicF.insert(string("allocated"));
#endif
@@ -86,11 +84,9 @@ void initIntrinsicFunctionNames()
intrinsicF.insert(string("atanh"));
intrinsicF.insert(string("atan2"));
intrinsicF.insert(string("atan2d"));
#ifdef __SPF
intrinsicF.insert(string("aint"));
intrinsicF.insert(string("anint"));
intrinsicF.insert(string("achar"));
#endif
intrinsicF.insert(string("babs"));
intrinsicF.insert(string("bbits"));
intrinsicF.insert(string("bbset"));
@@ -149,8 +145,8 @@ void initIntrinsicFunctionNames()
intrinsicF.insert(string("dfloti"));
intrinsicF.insert(string("dflotj"));
intrinsicF.insert(string("dflotk"));
#ifdef __SPF
intrinsicF.insert(string("dint"));
#ifdef __SPF
intrinsicF.insert(string("dvtime"));
#endif
intrinsicF.insert(string("dmax1"));
@@ -190,9 +186,7 @@ void initIntrinsicFunctionNames()
intrinsicF.insert(string("dcotan"));
intrinsicF.insert(string("dcotand"));
intrinsicF.insert(string("dtanh"));
#ifdef __SPF
intrinsicF.insert(string("dnint"));
#endif
intrinsicF.insert(string("dcmplx"));
intrinsicF.insert(string("dconjg"));
intrinsicF.insert(string("dimag"));
@@ -227,9 +221,7 @@ void initIntrinsicFunctionNames()
intrinsicF.insert(string("hshftc"));
intrinsicF.insert(string("hsign"));
intrinsicF.insert(string("htest"));
#ifdef __SPF
intrinsicF.insert(string("huge"));
#endif
intrinsicF.insert(string("hypot"));
intrinsicF.insert(string("iiabs"));
#ifdef __SPF
@@ -254,12 +246,10 @@ void initIntrinsicFunctionNames()
intrinsicF.insert(string("index"));
intrinsicF.insert(string("iabs"));
intrinsicF.insert(string("ibits"));
#ifdef __SPF
intrinsicF.insert(string("idnint"));
intrinsicF.insert(string("ichar"));
intrinsicF.insert(string("iachar"));
intrinsicF.insert(string("isnan"));
#endif
intrinsicF.insert(string("iand"));
intrinsicF.insert(string("ior"));
intrinsicF.insert(string("ibset"));
@@ -316,9 +306,7 @@ void initIntrinsicFunctionNames()
intrinsicF.insert(string("kmod"));
intrinsicF.insert(string("knot"));
intrinsicF.insert(string("len"));
#ifdef __SPF
intrinsicF.insert(string("len_trim"));
#endif
intrinsicF.insert(string("lge"));
intrinsicF.insert(string("lgt"));
intrinsicF.insert(string("lle"));
@@ -342,26 +330,22 @@ void initIntrinsicFunctionNames()
intrinsicF.insert(string("mod"));
intrinsicF.insert(string("modulo"));
intrinsicF.insert(string("not"));
#ifdef __SPF
intrinsicF.insert(string("nint"));
intrinsicF.insert(string("null"));
#endif
intrinsicF.insert(string("or"));
intrinsicF.insert(string("popcnt"));
intrinsicF.insert(string("poppar"));
intrinsicF.insert(string("random_number"));
intrinsicF.insert(string("real"));
intrinsicF.insert(string("reshape"));
#ifdef __SPF
intrinsicF.insert(string("present"));
intrinsicF.insert(string("repeat"));
#endif
intrinsicF.insert(string("rshft"));
intrinsicF.insert(string("rshift"));
intrinsicF.insert(string("sign"));
#ifdef __SPF
intrinsicF.insert(string("size"));
intrinsicF.insert(string("scan"));
#ifdef __SPF
intrinsicF.insert(string("sizeof"));
#endif
intrinsicF.insert(string("sngl"));
@@ -379,9 +363,7 @@ void initIntrinsicFunctionNames()
intrinsicF.insert(string("tan"));
intrinsicF.insert(string("tand"));
intrinsicF.insert(string("tanh"));
#ifdef __SPF
intrinsicF.insert(string("tiny"));
#endif
intrinsicF.insert(string("trailz"));
intrinsicF.insert(string("trim"));
intrinsicF.insert(string("xor"));
@@ -532,9 +514,7 @@ void initIntrinsicFunctionNames()
intrinsicDoubleT.insert(string("dfloti"));
intrinsicDoubleT.insert(string("dflotj"));
intrinsicDoubleT.insert(string("dflotk"));
#ifdef __SPF
intrinsicDoubleT.insert(string("dint"));
#endif
intrinsicDoubleT.insert(string("dmax1"));
intrinsicDoubleT.insert(string("dmin1"));
intrinsicDoubleT.insert(string("dmod"));
@@ -572,9 +552,7 @@ void initIntrinsicFunctionNames()
intrinsicDoubleT.insert(string("dcotan"));
intrinsicDoubleT.insert(string("dcotand"));
intrinsicDoubleT.insert(string("dtanh"));
#ifdef __SPF
intrinsicDoubleT.insert(string("dnint"));
#endif
intrinsicDoubleT.insert(string("dcmplx"));
intrinsicDoubleT.insert(string("dconjg"));
intrinsicDoubleT.insert(string("dimag"));

View File

@@ -11,7 +11,9 @@ OBJS=\
statfile.o \
statread.o \
treeinter.o \
statprintf.o
statprintf.o \
stat.o \
statinter.o
$(BINDIR)/$(EXECUTABLES): $(OBJS)
$(LINKER) -o $@ $(OBJS) -L$(ZLIBDIR) -l$(ZLIB)
@@ -36,3 +38,7 @@ treeinter.o:
$(CXX) $(COPT) treeinter.cpp
statprintf.o:
$(CXX) $(COPT) statprintf.cpp
stat.o:
$(CXX) $(COPT) stat.cpp
statinter.o:
$(CXX) $(COPT) statinter.cpp

View File

@@ -28,7 +28,9 @@ OBJS=\
$(OUTDIR)\statfile.obj \
$(OUTDIR)\statread.obj \
$(OUTDIR)\treeinter.obj \
$(OUTDIR)\statprintf.obj
$(OUTDIR)\statprintf.obj \
$(OUTDIR)\stat.obj \
$(OUTDIR)\statinter.obj
$(BINDIR)/$(EXECUTABLES).exe: $(OBJS)
$(LINKER) @<<

View File

@@ -438,6 +438,8 @@ static bool runAnalysis(SgProject &project, const int curr_regime, const bool ne
auto rw_analyzer = ReadWriteAnalyzer(allFuncInfo); // doesn't analyze anything until first query
int global_err = 0;
map<string, int> same_decls;
for (int i = n - 1; i >= 0; --i)
{
createNeededException();
@@ -1033,6 +1035,24 @@ static bool runAnalysis(SgProject &project, const int curr_regime, const bool ne
}
else if (curr_regime == TEST_PASS)
{
/*int funcNum = file->numberOfFunctions();
for (int z = 0; z < funcNum; ++z)
{
SgStatement* f = file->functions(z);
for (auto st = f->lexNext(); st != f->lastNodeOfStmt(); st = st->lexNext())
{
if (st->variant() == CONTAINS_STMT)
break;
if (isSgExecutableStatement(st))
break;
string key = st->unparse();
if (same_decls.find(key) == same_decls.end())
same_decls[key] = 1;
else
same_decls[key]++;
}
}*/
//test pass
}

View File

@@ -30,16 +30,19 @@ static void FillCommonTypes(map<char, SgType*>& types)
types[letter.first] = new SgType(T_FLOAT);
}
static void FindAllVars(SgExpression* expr, set<SgSymbol*>& allVars)
static void FindAllVars(SgExpression* expr, set<SgSymbol*>& allVars, set<SgSymbol*>& allVarsConst)
{
if (expr == NULL)
return;
if (expr->variant() == VAR_REF || expr->variant() == ARRAY_REF)
const int var = expr->variant();
if (var == VAR_REF || var == ARRAY_REF)
allVars.insert(expr->symbol());
if (var == CONST_REF)
allVarsConst.insert(expr->symbol());
FindAllVars(expr->lhs(), allVars);
FindAllVars(expr->rhs(), allVars);
FindAllVars(expr->lhs(), allVars, allVarsConst);
FindAllVars(expr->rhs(), allVars, allVarsConst);
}
static char getValue(SgExpression* ex)
@@ -82,11 +85,63 @@ static void AddLettersToMap(SgExpression* expr, SgType* type, map<char, SgType*>
}
}
static vector<SgSymbol*> getVars(const char* funcSymbol, set<SgSymbol*>& toRename,
const set<SgSymbol*>& allVars, const map<char, SgType*>& types)
{
vector<SgSymbol*> varsWithoutDecl;
map<string, SgSymbol*> vars;
for (auto& var : allVars)
{
if (vars.find(var->identifier()) != vars.end())
printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
vars[var->identifier()] = var;
}
for (auto& var : allVars)
{
if (string(var->identifier()) == funcSymbol)
continue;
vector<SgStatement*> allDecls;
declaratedInStmt(var, &allDecls, false);
bool hasTypeDecls = false;
for (auto& decl : allDecls)
{
const int var = decl->variant();
if (var == VAR_DECL || var == VAR_DECL_90 || var == STRUCT_DECL)
hasTypeDecls = true;
}
if (!hasTypeDecls)
{
const char c = var->identifier()[0];
auto it = types.find(c);
if (it != types.end())
{
var->setType(it->second);
auto s = it->second->symbol();
if (s)
{
auto itS = vars.find(s->identifier());
if (itS != vars.end())
toRename.insert(itS->second);
}
}
varsWithoutDecl.push_back(var);
}
}
return varsWithoutDecl;
}
static map<char, SgType*> FunctionImplicitCheck(SgStatement* function, const map<SgStatement*, map<char, SgType*>>& typesByFunctions)
{
set<SgSymbol*> allVars;
set<SgSymbol*> allVars, allVarsConst;
map<char, SgType*> types;
vector<SgSymbol*> varsWithoutDecl;
vector<SgSymbol*> varsWithoutDecl, varsWithoutDeclConst;
set<SgSymbol*> toRename;
InitTypes(types);
FillCommonTypes(types);
@@ -128,27 +183,10 @@ static map<char, SgType*> FunctionImplicitCheck(SgStatement* function, const map
for (auto st = function; st != endOfFunc && st->variant() != CONTAINS_STMT; st = st->lexNext())
for (int i = 0; i < 3; ++i)
FindAllVars(st->expr(i), allVars);
FindAllVars(st->expr(i), allVars, allVarsConst);
for (auto& var : allVars)
{
if (string(var->identifier()) == function->symbol()->identifier())
continue;
vector<SgStatement*> _;
SgStatement* declaredInStatement = declaratedInStmt(var, &_, false);
if (declaredInStatement == NULL)
{
const char c = var->identifier()[0];
if (types.find(c) != types.end())
var->setType(types[c]);
varsWithoutDecl.push_back(var);
}
}
makeDeclaration(varsWithoutDecl, function, NULL);
varsWithoutDecl = getVars(function->symbol()->identifier(), toRename, allVars, types);
varsWithoutDeclConst = getVars(function->symbol()->identifier(), toRename, allVarsConst, types);
if (!hasImplicitNone)
{
@@ -170,11 +208,22 @@ static map<char, SgType*> FunctionImplicitCheck(SgStatement* function, const map
implNone->setlineNumber(function->lineNumber());
implNone->setFileName(function->fileName());
function->insertStmtAfter(*implNone, *function);
SgStatement* insertPlace = function;
while (insertPlace->lexNext()->variant() == USE_STMT)
insertPlace = insertPlace->lexNext();
insertPlace->insertStmtAfter(*implNone, *function);
insertPlace = insertPlace->lexNext();
makeDeclaration(varsWithoutDecl, function);
auto declList = makeDeclaration(varsWithoutDeclConst, NULL);
for (auto& decl : declList)
insertPlace->insertStmtAfter(*decl, *function);
}
allVars.clear();
varsWithoutDecl.clear();
for (auto& s : toRename)
s->changeName(TestAndCorrectName((string(s->identifier()) + "_").c_str()));
return types;
}

View File

@@ -1,3 +1,3 @@
#pragma once
#define VERSION_SPF "2322"
#define VERSION_SPF "2324"