Fix internal program error

This commit is contained in:
2024-03-21 21:05:14 +03:00
parent fbcddeea8f
commit b80c941fec
2 changed files with 96 additions and 87 deletions

View File

@@ -178,9 +178,9 @@ set(TR_LOOP_SPLIT _src/Transformations/loops_splitter.cpp
set(TR_LOOP_UNROLL _src/Transformations/loops_unrolling.cpp
_src/Transformations/loops_unrolling.h)
set(TR_PRIV_BR _src/Transformations/private_arrays_resizing.cpp
_src/Transformations/private_arrays_resizing.h)
_src/Transformations/private_arrays_resizing.h)
set(TR_PRIV_DEL _src/Transformations/private_removing.cpp
_src/Transformations/private_removing.h)
_src/Transformations/private_removing.h)
set(TR_SWAP_ARR_DIMS _src/Transformations/swap_array_dims.cpp
_src/Transformations/swap_array_dims.h)
set(TR_FUNC_DUP _src/Transformations/uniq_call_chain_dup.cpp
@@ -190,8 +190,7 @@ set(TR_FUNC_PURE _src/Transformations/function_purifying.cpp
set(TR_GV _src/Transformations/fix_common_blocks.cpp
_src/Transformations/fix_common_blocks.h)
set(TR_CONV _src/Transformations/convert_to_c.cpp
_src/Transformations/convert_to_c.h)
_src/Transformations/convert_to_c.h)
set(TR_IMPLICIT_NONE _src/Transformations/set_implicit_none.cpp
_src/Transformations/set_implicit_none.h)

View File

@@ -5,39 +5,86 @@ using std::vector;
using std::map;
using std::set;
map<char, SgType*> types;
set<SgSymbol*> allVars;
vector<SgSymbol*> varsWithoutDecl;
const char commonIntLetters[6] = {'i', 'j', 'k', 'm', 'n', 'l'};
static const char commonIntLetters[6] = {'i', 'j', 'k', 'm', 'n', 'l'};
void InitTypes();
void FillCommonTypes();
void CleanTypes();
void FunctionImplicitCheck(SgStatement* function);
void FindAllVars(SgExpression* expr);
char AddLettersToMap(SgExpression* params, SgType* type);
void ImplicitCheck(SgFile* file)
static void InitTypes(map<char, SgType*> types)
{
for (int functionNumber = 0; functionNumber < file->numberOfFunctions(); functionNumber++)
{
InitTypes();
FillCommonTypes();
SgStatement* function = file->functions(functionNumber);
FunctionImplicitCheck(function);
CleanTypes();
}
for (char letter = 'a'; letter <= 'z'; letter++)
types[letter] = NULL;
}
static void FunctionImplicitCheck(SgStatement* function)
static void FillCommonTypes(map<char, SgType*> types)
{
for (char letter : commonIntLetters)
if (types[letter] == NULL)
types[letter] = new SgType(T_INT);
for (auto letter : types)
if (letter.second == NULL)
types[letter.first] = new SgType(T_FLOAT);
}
static void FindAllVars(SgExpression* expr, set<SgSymbol*>* allVars)
{
if (expr == NULL)
return;
if (expr->variant() == VAR_REF || expr->variant() == ARRAY_REF)
allVars->insert(expr->symbol());
FindAllVars(expr->lhs(), allVars);
FindAllVars(expr->rhs(), allVars);
}
static char AddLettersToMap(SgExpression* expr, SgType* type, map<char, SgType*>& types)
{
if (expr == NULL)
return NULL;
if (expr->variant() == CHAR_VAL)
{
SgValueExp* val = isSgValueExp(expr);
return val->charValue();
}
char leftVal = AddLettersToMap(expr->lhs(), type, types);
char rightVal = AddLettersToMap(expr->rhs(), type, types);
if (expr->variant() == DDOT)
if (leftVal != NULL && rightVal != NULL)
for (char letter = leftVal; letter <= rightVal; letter++)
types[letter] = type;
if (expr->variant() == EXPR_LIST)
{
if (leftVal != NULL)
types[leftVal] = type;
if (rightVal != NULL)
types[rightVal] = type;
}
return NULL;
}
static map<char, SgType*> FunctionImplicitCheck(SgStatement* function, map<SgStatement*, map<char, SgType*>>& typesByFunctions)
{
set<SgSymbol*> allVars;
map<char, SgType*> types;
vector<SgSymbol*> varsWithoutDecl;
InitTypes(types);
FillCommonTypes(types);
if (typesByFunctions.find(function->controlParent()) != typesByFunctions.end())
for (auto parentType : typesByFunctions[function->controlParent()])
types[parentType.first] = parentType.second;
auto implicitNoneDeclaration = new SgStatement(IMPL_DECL);
auto hasImplicitNone = false;
for (SgStatement* statement = function; statement != NULL; statement = statement->lexNext())
{
if (statement->variant() == IMPL_DECL)
{
SgImplicitStmt* implicitStatement = isSgImplicitStmt(statement);
@@ -52,8 +99,8 @@ static void FunctionImplicitCheck(SgStatement* function)
SgType* type = implicitStatement->implicitType(j);
SgExpression* lettersExpression = implicitStatement->implicitRangeList(j);
AddLettersToMap(lettersExpression, type);
}
AddLettersToMap(lettersExpression, type, types);
}
}
else
hasImplicitNone = true;
@@ -63,9 +110,15 @@ static void FunctionImplicitCheck(SgStatement* function)
break;
}
for (SgStatement* statement = function; statement != function->lastExecutable(); statement = statement->lexNext())
for (SgStatement* statement = function;
statement != NULL && statement->variant() != CONTAINS_STMT; statement = statement->lexNext())
{
for (int expressionNumber = 0; expressionNumber < 3; expressionNumber++)
FindAllVars(statement->expr(expressionNumber));
FindAllVars(statement->expr(expressionNumber), &allVars);
if (statement == function->lastExecutable())
break;
}
for (auto var : allVars)
{
@@ -86,7 +139,8 @@ static void FunctionImplicitCheck(SgStatement* function)
if (!hasImplicitNone)
{
for (SgStatement* statement = function->lexNext(); statement != NULL;)
for (SgStatement* statement = function->lexNext();
statement != NULL && statement->variant() != CONTAINS_STMT && isSgExecutableStatement(statement) == NULL;)
{
if (statement->variant() == IMPL_DECL)
{
@@ -100,70 +154,26 @@ static void FunctionImplicitCheck(SgStatement* function)
function->insertStmtAfter(*implicitNoneDeclaration, *function);
}
}
static void InitTypes()
{
for (char letter = 'a'; letter <= 'z'; letter++)
types[letter] = NULL;
}
static void FillCommonTypes()
{
for (char letter : commonIntLetters)
if (types[letter] == NULL)
types[letter] = new SgType(T_INT);
for (auto letter : types)
if (letter.second == NULL)
types[letter.first] = new SgType(T_FLOAT);
}
static void CleanTypes()
{
types.clear();
allVars.clear();
varsWithoutDecl.clear();
return types;
}
static void FindAllVars(SgExpression* expr)
void ImplicitCheck(SgFile* file)
{
if (expr == NULL)
return;
map<SgStatement*, map<char, SgType*>> typesByFunctions;
if (expr->variant() == VAR_REF || expr->variant() == ARRAY_REF)
allVars.insert(expr->symbol());
FindAllVars(expr->lhs());
FindAllVars(expr->rhs());
}
static char AddLettersToMap(SgExpression* expr, SgType* type)
{
if (expr == NULL)
return NULL;
if (expr->variant() == CHAR_VAL)
for (int functionNumber = 0; functionNumber < file->numberOfFunctions(); functionNumber++)
{
SgValueExp* val = isSgValueExp(expr);
return val->charValue();
SgStatement* function = file->functions(functionNumber);
map<char, SgType*>& types = FunctionImplicitCheck(function, typesByFunctions);
typesByFunctions[function] = types;
}
char leftVal = AddLettersToMap(expr->lhs(), type);
char rightVal = AddLettersToMap(expr->rhs(), type);
typesByFunctions.clear();
if (expr->variant() == DDOT)
if (leftVal != NULL && rightVal != NULL)
for (char letter = leftVal; letter <= rightVal; letter++)
types[letter] = type;
if (expr->variant() == EXPR_LIST)
{
if (leftVal != NULL)
types[leftVal] = type;
if (rightVal != NULL)
types[rightVal] = type;
}
return NULL;
printf("%s", file->firstStatement()->unparse());
}