From b80c941fec8ec92f0be743ef442c345efa95929c Mon Sep 17 00:00:00 2001 From: DenisDudarenko Date: Thu, 21 Mar 2024 21:05:14 +0300 Subject: [PATCH] Fix internal program error --- sapfor/experts/Sapfor_2017/CMakeLists.txt | 7 +- .../Transformations/set_implicit_none.cpp | 176 +++++++++--------- 2 files changed, 96 insertions(+), 87 deletions(-) diff --git a/sapfor/experts/Sapfor_2017/CMakeLists.txt b/sapfor/experts/Sapfor_2017/CMakeLists.txt index 02f7fb9..7d0c5d2 100644 --- a/sapfor/experts/Sapfor_2017/CMakeLists.txt +++ b/sapfor/experts/Sapfor_2017/CMakeLists.txt @@ -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) 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 f891380..c7c6eb9 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp @@ -5,39 +5,86 @@ using std::vector; using std::map; using std::set; -map types; -set allVars; -vector 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 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 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* 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& 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 FunctionImplicitCheck(SgStatement* function, map>& typesByFunctions) +{ + set allVars; + map types; + vector 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> 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& types = FunctionImplicitCheck(function, typesByFunctions); + typesByFunctions[function] = types; } - char leftVal = AddLettersToMap(expr->lhs(), type); - char rightVal = AddLettersToMap(expr->rhs(), type); - - if (expr->variant() == DDOT) - if (leftVal != NULL && rightVal != NULL) - for (char letter = leftVal; letter <= rightVal; letter++) - types[letter] = type; + typesByFunctions.clear(); - if (expr->variant() == EXPR_LIST) - { - if (leftVal != NULL) - types[leftVal] = type; - if (rightVal != NULL) - types[rightVal] = type; - } - - return NULL; + printf("%s", file->firstStatement()->unparse()); } \ No newline at end of file