From 0f79933131c535dc509db79186d3d79e05e34b87 Mon Sep 17 00:00:00 2001 From: ALEXks Date: Thu, 18 Apr 2024 21:36:40 +0300 Subject: [PATCH] fixed implicit pass --- dvm/fdvm/trunk/fdvm/acc.cpp | 8 +- dvm/fdvm/trunk/fdvm/acc_utilities.cpp | 32 +---- dvm/tools/pppa/trunk/src/makefile.uni | 8 +- dvm/tools/pppa/trunk/src/makefile.win | 4 +- sapfor/experts/Sapfor_2017/_src/Sapfor.cpp | 20 ++++ .../Transformations/set_implicit_none.cpp | 109 +++++++++++++----- .../experts/Sapfor_2017/_src/Utils/version.h | 2 +- 7 files changed, 118 insertions(+), 65 deletions(-) diff --git a/dvm/fdvm/trunk/fdvm/acc.cpp b/dvm/fdvm/trunk/fdvm/acc.cpp index 4e0fdc2..eb4fee7 100644 --- a/dvm/fdvm/trunk/fdvm/acc.cpp +++ b/dvm/fdvm/trunk/fdvm/acc.cpp @@ -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++; diff --git a/dvm/fdvm/trunk/fdvm/acc_utilities.cpp b/dvm/fdvm/trunk/fdvm/acc_utilities.cpp index 779dfe0..c096f43 100644 --- a/dvm/fdvm/trunk/fdvm/acc_utilities.cpp +++ b/dvm/fdvm/trunk/fdvm/acc_utilities.cpp @@ -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("reshape")); 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")); diff --git a/dvm/tools/pppa/trunk/src/makefile.uni b/dvm/tools/pppa/trunk/src/makefile.uni index e4ec242..4a5cdf9 100644 --- a/dvm/tools/pppa/trunk/src/makefile.uni +++ b/dvm/tools/pppa/trunk/src/makefile.uni @@ -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 diff --git a/dvm/tools/pppa/trunk/src/makefile.win b/dvm/tools/pppa/trunk/src/makefile.win index 77d30d3..4df058d 100644 --- a/dvm/tools/pppa/trunk/src/makefile.win +++ b/dvm/tools/pppa/trunk/src/makefile.win @@ -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) @<< diff --git a/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp b/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp index 5724802..0b251a2 100644 --- a/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp @@ -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 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 } diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp index bd0cc7f..730b36c 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp @@ -30,16 +30,19 @@ static void FillCommonTypes(map& types) types[letter.first] = new SgType(T_FLOAT); } -static void FindAllVars(SgExpression* expr, set& allVars) +static void FindAllVars(SgExpression* expr, set& allVars, set& 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 } } +static vector getVars(const char* funcSymbol, set& toRename, + const set& allVars, const map& types) +{ + vector varsWithoutDecl; + map 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 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 FunctionImplicitCheck(SgStatement* function, const map>& typesByFunctions) { - set allVars; + set allVars, allVarsConst; map types; - vector varsWithoutDecl; + vector varsWithoutDecl, varsWithoutDeclConst; + set toRename; InitTypes(types); FillCommonTypes(types); @@ -128,28 +183,11 @@ static map 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); - - for (auto& var : allVars) - { - if (string(var->identifier()) == function->symbol()->identifier()) - continue; - - vector _; - 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); + FindAllVars(st->expr(i), allVars, allVarsConst); + varsWithoutDecl = getVars(function->symbol()->identifier(), toRename, allVars, types); + varsWithoutDeclConst = getVars(function->symbol()->identifier(), toRename, allVarsConst, types); + if (!hasImplicitNone) { for (auto st = function->lexNext(); @@ -170,11 +208,22 @@ static map 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; } diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/version.h b/sapfor/experts/Sapfor_2017/_src/Utils/version.h index 616b105..d5b3c37 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/version.h +++ b/sapfor/experts/Sapfor_2017/_src/Utils/version.h @@ -1,3 +1,3 @@ #pragma once -#define VERSION_SPF "2322" +#define VERSION_SPF "2324"