fixed omp analysis

This commit is contained in:
ALEXks
2023-12-28 20:41:31 +03:00
parent 34f0214404
commit 85aaee900b
2 changed files with 27 additions and 3 deletions

View File

@@ -721,6 +721,27 @@ static inline void addToAttribute(SgStatement* st, int var, vector<SgExpression*
} }
} }
static bool is_private_in_do(SgStatement* st, const string& var)
{
checkNull(st, convertFileName(__FILE__).c_str(), __LINE__);
if (st->variant() != FOR_NODE)
return false;
SgStatement* lastNode = st->lastNodeOfStmt();
for (SgStatement* op = st->lexNext(); st != lastNode; st = st->lexNext())
{
if (st->variant() == ASSIGN_STAT)
{
SgExpression* ex = st->expr(0);
if (ex->variant() == ARRAY_REF || ex->variant() == VAR_REF)
if (var == ex->symbol()->identifier())
return true;
}
}
return false;
}
vector<OmpDir> parseOmpDirs(void* stIn, const set<string> &globalPriv, bool forDo) vector<OmpDir> parseOmpDirs(void* stIn, const set<string> &globalPriv, bool forDo)
{ {
SgStatement* st = (SgStatement*)stIn; SgStatement* st = (SgStatement*)stIn;
@@ -825,7 +846,10 @@ vector<OmpDir> parseOmpDirs(void* stIn, const set<string> &globalPriv, bool forD
{ {
vector<SgExpression*> list; vector<SgExpression*> list;
for (auto& var : globalPriv) for (auto& var : globalPriv)
if (is_private_in_do(st, var))
list.push_back(new SgVarRefExp(findSymbolOrCreate(current_file, var, NULL, getFuncStat(st)))); list.push_back(new SgVarRefExp(findSymbolOrCreate(current_file, var, NULL, getFuncStat(st))));
if (list.size())
addToAttribute(st, ACC_PRIVATE_OP, list); addToAttribute(st, ACC_PRIVATE_OP, list);
} }
} }

View File

@@ -1,3 +1,3 @@
#pragma once #pragma once
#define VERSION_SPF "2262" #define VERSION_SPF "2263"