fixed implicit pass
This commit is contained in:
@@ -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++;
|
||||
|
||||
@@ -52,12 +52,10 @@ void initIntrinsicFunctionNames()
|
||||
return;
|
||||
|
||||
intrinsicF.insert(string("abs"));
|
||||
#ifdef __SPF
|
||||
intrinsicF.insert(string("adjustl"));
|
||||
#endif
|
||||
intrinsicF.insert(string("adjustl"));
|
||||
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"));
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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) @<<
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
#pragma once
|
||||
|
||||
#define VERSION_SPF "2322"
|
||||
#define VERSION_SPF "2324"
|
||||
|
||||
Reference in New Issue
Block a user