Skip to content

Commit

Permalink
(Jovial) Frontend failure with multiple assigns
Browse files Browse the repository at this point in the history
1. Fixed VariableList in grammar (by creating VariableLVal).
2. Updated ATerm traversal for VariableLVal .
3. Repaired SageTreeBuilder to create an SgExprListExp if variable list size > 1
   for lhs of SgAssignOp.

GL-207
  • Loading branch information
rasmussn committed Apr 20, 2023
1 parent 2d15484 commit baf1bd7
Show file tree
Hide file tree
Showing 7 changed files with 85 additions and 86 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,7 @@ WhileClause
ControlledStatement
LoopType
Variable
VariableLVal
Formula OptFormula
VariableList
AbortStatement
Expand Down Expand Up @@ -1318,8 +1319,10 @@ context-free syntax
VariableList
'=' Formula ';' -> AssignmentStatement {cons("AssignmentStatement")}

{Variable ','}+ -> VariableList {cons("VariableList")}
{TableItemNoDeref ','}+ -> VariableList {cons("VariableList")}
{VariableLVal ','}+ -> VariableList {cons("VariableList")}

Variable -> VariableLVal {cons("VariableLVal")}
TableItemNoDeref -> VariableLVal {cons("VariableLVal")}

%% 4.2 LOOP STATEMENTS
%%
Expand Down
Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -895,8 +895,9 @@ Enter(SgExprStatement* &assign_stmt, SgExpression* &rhs, const std::vector<SgExp
{
mlog[TRACE] << "SageTreeBuilder::Enter(SgExprStatement* &, ...) \n";

SgAssignOp* assign_op = nullptr;
SgEnumVal* old_val = isSgEnumVal(rhs);
SgExpression* lhs{nullptr};
SgAssignOp* assign_op{nullptr};
SgEnumVal* old_val{isSgEnumVal(rhs)};

// For Jovial, the symbol table may have multiple enumerators with the same name. Check and
// replace a Jovial status constant with the correct value based on the type of the variable.
Expand All @@ -918,11 +919,15 @@ Enter(SgExprStatement* &assign_stmt, SgExpression* &rhs, const std::vector<SgExp
}

// Jovial may have more than one variable in an assignment statement
for (int i = vars.size()-1; i >= 0; i--) {
assign_op = SageBuilder::buildBinaryExpression_nfi<SgAssignOp>(vars[i], rhs);
if (vars.size() == 1) {
lhs = vars[0];
}
ROSE_ASSERT(assign_op);
else if (vars.size() > 1) {
lhs = SageBuilder::buildExprListExp(vars);
}
ASSERT_not_null(lhs);

assign_op = SageBuilder::buildBinaryExpression_nfi<SgAssignOp>(lhs, rhs);
assign_stmt = SageBuilder::buildExprStatement_nfi(assign_op);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@
#include <iostream>

#define PRINT_ATERM_TRAVERSAL 0
#define PRINT_WARNINGS 1

constexpr bool LOG_WARNINGS = true;

using namespace ATermSupport;
using namespace Jovial_ROSE_Translation;
Expand Down Expand Up @@ -302,9 +303,9 @@ ATbool ATermToSageJovialTraversal::traverse_ProgramBody(ATerm term)
} else return ATfalse;

if (labels.size() > 1) {
#if PRINT_WARNINGS
cerr << "WARNING UNIMPLEMENTED: ProgramBody - labels.size > 1\n";
#endif
if (LOG_WARNINGS) {
cerr << "WARNING UNIMPLEMENTED: ProgramBody - labels.size > 1\n";
}
return ATtrue;
}
}
Expand Down Expand Up @@ -402,9 +403,9 @@ ATbool ATermToSageJovialTraversal::traverse_IntegerMachineParameter(ATerm term,
expr = nullptr;

if (ATmatch(term, "BITSINBYTE")) {
#if PRINT_WARNINGS
cerr << "WARNING UNIMPLEMENTED: IntegerMachineParameter - BITSINBYTE\n";
#endif
if (LOG_WARNINGS) {
cerr << "WARNING UNIMPLEMENTED: IntegerMachineParameter - BITSINBYTE\n";
}
}
else if (ATmatch(term, "BITSINWORD")) {
expr = SageBuilder::buildVarRefExp("BITSINWORD", SageBuilder::topScopeStack());
Expand All @@ -413,14 +414,14 @@ ATbool ATermToSageJovialTraversal::traverse_IntegerMachineParameter(ATerm term,
expr = SageBuilder::buildVarRefExp("BYTESINWORD", SageBuilder::topScopeStack());
}
else if (ATmatch(term, "LOCSINWORD")) {
#if PRINT_WARNINGS
cerr << "WARNING UNIMPLEMENTED: IntegerMachineParameter - LOCSINWORD\n";
#endif
if (LOG_WARNINGS) {
cerr << "WARNING UNIMPLEMENTED: IntegerMachineParameter - LOCSINWORD\n";
}
}
else if (ATmatch(term, "BYTEPOS(<term>)", &t_formula)) {
#if PRINT_WARNINGS
cerr << "WARNING UNIMPLEMENTED: IntegerMachineParameter - BYTEPOS\n";
#endif
if (LOG_WARNINGS) {
cerr << "WARNING UNIMPLEMENTED: IntegerMachineParameter - BYTEPOS\n";
}
// MATCHED BYTEPOS
if (traverse_Formula(t_formula, expr)) {
// MATCHED CompileTimeNumericFormula
Expand All @@ -435,18 +436,18 @@ ATbool ATermToSageJovialTraversal::traverse_IntegerMachineParameter(ATerm term,


else if (ATmatch(term, "IMPLFLOATPRECISION(<term>)", &t_precision)) {
#if PRINT_WARNINGS
cerr << "WARNING UNIMPLEMENTED: IntegerMachineParameter - IMPLFLOATPRECISION\n";
#endif
if (LOG_WARNINGS) {
cerr << "WARNING UNIMPLEMENTED: IntegerMachineParameter - IMPLFLOATPRECISION\n";
}
// MATCHED IMPLFLOATPRECISION
if (traverse_Formula(t_precision, expr)) {
// MATCHED Precision
} else return ATfalse;
}
else if (ATmatch(term, "IMPLFIXEDPRECISION(<term>,<term>)", &t_scale_spec, &t_frac_spec)) {
#if PRINT_WARNINGS
cerr << "WARNING UNIMPLEMENTED: IntegerMachineParameter - IMPLFIXEDPRECISION\n";
#endif
if (LOG_WARNINGS) {
cerr << "WARNING UNIMPLEMENTED: IntegerMachineParameter - IMPLFIXEDPRECISION\n";
}
// MATCHED IMPLFIXEDPRECISION
if (traverse_Formula(t_scale_spec, expr)) {
// MATCHED ScaleSpecifier
Expand Down Expand Up @@ -2372,9 +2373,9 @@ ATbool ATermToSageJovialTraversal::traverse_SpecifiedTableItemDeclaration(ATerm
ASSERT_not_null(attr_list);

if (item_type == nullptr) {
#if PRINT_WARNINGS
cerr << "WARNING UNIMPLEMENTED: SpecifiedTableItemDeclaration - declared type is null \n";
#endif
if (LOG_WARNINGS) {
cerr << "WARNING UNIMPLEMENTED: SpecifiedTableItemDeclaration - declared type is null \n";
}
return ATtrue;
}

Expand Down Expand Up @@ -3343,9 +3344,9 @@ ATbool ATermToSageJovialTraversal::traverse_StatementNameDeclaration(ATerm term,
std::string name;

if (ATmatch(term, "StatementNameDeclaration(<term>)", &t_name)) {
#if PRINT_WARNINGS
cerr << "WARNING UNIMPLEMENTED: StatementNameDeclaration\n";
#endif
if (LOG_WARNINGS) {
cerr << "WARNING UNIMPLEMENTED: StatementNameDeclaration\n";
}

ATermList tail = (ATermList) ATmake("<term>", t_name);
while (! ATisEmpty(tail)) {
Expand Down Expand Up @@ -4398,9 +4399,9 @@ ATbool ATermToSageJovialTraversal::traverse_InlineDeclaration(ATerm term)
std::string subroutine_name;

if (ATmatch(term, "InlineDeclaration(<term>)", &t_subroutine_name)) {
#if PRINT_WARNINGS
cerr << "WARNING UNIMPLEMENTED: InlineDeclaration\n";
#endif
if (LOG_WARNINGS) {
cerr << "WARNING UNIMPLEMENTED: InlineDeclaration\n";
}
ATermList tail = (ATermList) ATmake("<term>", t_subroutine_name);
while (! ATisEmpty(tail)) {
ATerm head = ATgetFirst(tail);
Expand Down Expand Up @@ -4515,9 +4516,9 @@ ATbool ATermToSageJovialTraversal::traverse_SimpleStatement(ATerm term)
else return ATfalse;

if (labels.size() > 0) {
#if PRINT_WARNINGS
std::cerr << "WARNING UNIMPLEMENTED: SimpleStatement - labels.size() > 0 \n";
#endif
if (LOG_WARNINGS) {
std::cerr << "WARNING UNIMPLEMENTED: SimpleStatement - labels.size() > 0 \n";
}
}

return ATtrue;
Expand Down Expand Up @@ -4629,9 +4630,9 @@ ATbool ATermToSageJovialTraversal::traverse_LabelList(ATerm term, std::vector<st
} else return ATfalse;

if (labels.size() > 1) {
#if PRINT_WARNINGS
cerr << "WARNING UNIMPLEMENTED: LabelList - with multiple labels\n";
#endif
if (LOG_WARNINGS) {
cerr << "WARNING UNIMPLEMENTED: LabelList - with multiple labels\n";
}
}

return ATtrue;
Expand Down Expand Up @@ -4663,10 +4664,10 @@ ATbool ATermToSageJovialTraversal::traverse_AssignmentStatement(ATerm term)
} else return ATfalse;

if (rhs == nullptr) {
#if PRINT_WARNINGS
cerr << "WARNING UNIMPLEMENTED: AssignmentStatement "
<< "- could be FunctionCall, or StatusConstant, or PointerLiteral, etc.\n";
#endif
if (LOG_WARNINGS) {
cerr << "WARNING UNIMPLEMENTED: AssignmentStatement "
<< "- could be FunctionCall, or StatusConstant, or PointerLiteral, etc.\n";
}
return ATtrue;
}

Expand Down Expand Up @@ -5320,9 +5321,9 @@ ATbool ATermToSageJovialTraversal::traverse_CaseIndex(ATerm term, SgExpression*
else return ATfalse;

if (case_index == nullptr) {
#if PRINT_WARNINGS
cerr << "WARNING UNIMPLEMENTED: CaseIndex = nullptr, probably StatusConstant in lower_bound or upper_bound\n";
#endif
if (LOG_WARNINGS) {
cerr << "WARNING UNIMPLEMENTED: CaseIndex = nullptr, probably StatusConstant in lower_bound or upper_bound\n";
}
}

ASSERT_not_null(case_index);
Expand Down Expand Up @@ -6247,6 +6248,24 @@ ATbool ATermToSageJovialTraversal::traverse_Variable(ATerm term, SgExpression* &
return ATtrue;
}

ATbool ATermToSageJovialTraversal::traverse_VariableLVal(ATerm term, SgExpression* &var)
{
#if PRINT_ATERM_TRAVERSAL
printf("... traverse_VariableLVal: %s\n", ATwriteToString(term));
#endif

ATerm t_var;
var = nullptr;

if (ATmatch(term, "VariableLVal(<term>)" , &t_var)) {
if (traverse_Variable(t_var, var)) {
// MATCHED Variable
} else return ATfalse;
}

return ATtrue;
}

ATbool ATermToSageJovialTraversal::traverse_VariableList(ATerm term, std::vector<SgExpression*> &vars)
{
#if PRINT_ATERM_TRAVERSAL
Expand All @@ -6264,7 +6283,7 @@ ATbool ATermToSageJovialTraversal::traverse_VariableList(ATerm term, std::vector
ATerm head = ATgetFirst(tail);
tail = ATgetNext(tail);

if (traverse_Variable(head, var)) {
if (traverse_VariableLVal(head, var)) {
vars.push_back(var);
} else return ATfalse;
}
Expand Down Expand Up @@ -6893,10 +6912,10 @@ ATbool ATermToSageJovialTraversal::traverse_UserDefinedFunctionCall(ATerm term,
// a replication operator (yes?).
if (expr_list->get_expressions().size() != 1) {
// It is not clear that a replication operator can't have expression size other than 1.
#if PRINT_WARNINGS
cerr << "WARNING: UserDefinedFunctionCall - variable reference ambiguous "
<< "with replication operator and # expressions != 1 for variable " << name << endl;
#endif
if (LOG_WARNINGS) {
cerr << "WARNING: UserDefinedFunctionCall - variable reference ambiguous "
<< "with replication operator and # expressions != 1 for variable " << name << endl;
}
ROSE_ABORT();
}

Expand Down Expand Up @@ -7754,9 +7773,9 @@ ATbool ATermToSageJovialTraversal::traverse_StatusConversion(ATerm term, SgType*
type = nullptr;

if (ATmatch(term, "StatusConversion(<term>)", &t_type)) {
#if PRINT_WARNINGS
cerr << "WARNING UNIMPLEMENTED: StatusConversion \n";
#endif
if (LOG_WARNINGS) {
cerr << "WARNING UNIMPLEMENTED: StatusConversion \n";
}
if (traverse_StatusItemDescription(t_type, enum_decl, status_size)) {
// MATCHED StatusItemDescription
} else return ATfalse;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -309,6 +309,7 @@ ATbool traverse_PointerFormula (ATerm term, SgExpression* &expr);

// 6.1 VARIABLE AND BLOCK REFERENCES
ATbool traverse_Variable (ATerm term, SgExpression* &var);
ATbool traverse_VariableLVal (ATerm term, SgExpression* &var);
ATbool traverse_VariableList (ATerm term, std::vector<SgExpression*> &vars);
ATbool traverse_TableItem (ATerm term, SgExpression* &var);
ATbool traverse_Subscript (ATerm term, std::vector<SgExpression*> & indexes);
Expand Down
30 changes: 0 additions & 30 deletions src/frontend/SageIII/sageInterface/sageInterface.C
Original file line number Diff line number Diff line change
Expand Up @@ -10338,42 +10338,12 @@ void SageInterface::replaceStatement(SgStatement* oldStmt, SgStatement* newStmt,
if (oldStmt == newStmt) return;
SgStatement * p = isSgStatement(oldStmt->get_parent());
ROSE_ASSERT(p);
#if 0
// TODO handle replace the body of a C/Fortran function definition with a single statement?
// Liao 2/1/2010, in some case, we want to replace the entire body (SgBasicBlock) for some parent nodes.
// the built-in replace_statement() (insert_child() underneath) may not defined for them.
if (SgFortranDo * f_do = isSgFortranDo (p))
{
ROSE_ASSERT (f_do->get_body() == oldStmt);
if (!isSgBasicBlock(newStmt))
newStmt = buildBasicBlock (newStmt);
f_do->set_body(isSgBasicBlock(newStmt));
newStmt->set_parent(f_do);
}
else
#endif
p->replace_statement(oldStmt,newStmt);

// Some translators have their own handling for this (e.g. the outliner)
if (movePreprocessingInfoValue)
{
#if 0
printf ("In SageInterface::replaceStatement(): calling moveUpPreprocessingInfo() changed to movePreprocessingInfo() \n");
#endif

// DQ (12/28/2020): I think this should be movePreprocessingInfo instead of moveUpPreprocessingInfo
// (which has a collection of defaults that are not appropriate).
// moveUpPreprocessingInfo(newStmt, oldStmt);
#if 1
// DQ (12/28/2020): Since this works we will leave it in place (it appears to not be required to call this with: usePrepend == true).
moveUpPreprocessingInfo(newStmt, oldStmt);
#else
// void SageInterface::movePreprocessingInfo (SgStatement* stmt_src, SgStatement* stmt_dst, PreprocessingInfo::RelativePositionType src_position/* =PreprocessingInfo::undef */,
// PreprocessingInfo::RelativePositionType dst_position/* =PreprocessingInfo::undef */, bool usePrepend /*= false */)
bool usePrepend = true;
// movePreprocessingInfo ( newStmt, oldStmt, PreprocessingInfo::undef, PreprocessingInfo::undef, usePrepend );
movePreprocessingInfo ( oldStmt, newStmt, PreprocessingInfo::undef, PreprocessingInfo::undef, usePrepend );
#endif
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,7 @@ JOVIAL_TESTCODES = \
gitlab-issue-182.jov \
gitlab-issue-186.jov \
gitlab-issue-193.jov \
gitlab-issue-207.jov \
gitlab-issue-208.jov \
charlie.jov \
shadow.jov \
Expand Down

0 comments on commit baf1bd7

Please sign in to comment.