c - Assignment Insertion in ROSE compiler after AssignOp -
lately i've been working rose compiler , able apply few insertions of code c source , successful output. however, haven't been able insert assignment statement when visiting sgassignops. simplified version of code show problem:
#include "rose.h" #include <iostream> #include <transformationsupport.h> using namespace sageinterface; using namespace sagebuilder; using namespace std;  int main (int argc, char *argv[]) {     sgproject *project = frontend (argc, argv);      // find assignment operations     std::vector<sgnode* > assignoplist = nodequery::querysubtree (project, v_sgassignop);      std::vector<sgnode*>::iterator iter;      (iter = assignoplist.begin(); iter!= assignoplist.end(); iter++) {           sgnode * node = (*iter);          sgstatement * asmstmt = transformationsupport::getstatement(node);          //add pragma statement before                ostringstream ospragma;         ospragma << "example statement";         sgpragmadeclaration* pragmadecl = buildpragmadeclaration(ospragma.str());         insertstatementbefore(asmstmt, pragmadecl);          //add assignment statement after         sgexprstatement* newasmt = buildassignstatement(buildvarrefexp("a"),buildintval(9));         insertstatementafter(asmstmt,newasmt);     }      asttests::runalltests(project);      // translation     project->unparse(); }   a simple input code:
int main(int argc, char* argv[]) {     int a;      = 3;      return a;  }   the code compiles. however..
when applied input code segmentation fault, no error messages.
if remove assignment statement insertion, pragma insertion works.
if remove call runalltests() following error message when unparsing:
test: /mnt/data/rose/src/backend/unparser/namequalificationsupport.c:4986: virtual namequalificationinheritedattribute namequalificationtraversal::evaluateinheritedattribute(sgnode*, namequalificationinheritedattribute): assertion `initializedname->get_parent() != __null' failed. aborted (core dumped)   notice i'm using "a" in example , in input code, variable declared.
what right way make assignment insertion that?
the provided example in tutorial uses scope on main function body , inserts @ end, need happen after assignment. need push scope on node scopestack? , if so, how expressed? i'm not familiar push , pop scope stack methods.
this old, answering people problem in future.
the error comes when calling buildvarrefexp , buildpragmadeclaration. can bee seen through doxygen, take optional parameter sgscopestatement. scope statement sagebuilder finds variable referenced (github source). if not given, takes scopestack. however, when haven't pushed onto scopestack , call these functions without optional parameter, not know look.
so, 2 solutions are:
- use scopestack storing sgscopestatement (eg pushscopestack)
 - pass sgscopestatement buildvarrefexp , buildpragmadeclaration argument.
 
in case specifically, do:
sgscopestatement scope = transformationsupport::getfunctiondeclaration(node)->get_scope();   and replace sagebuilder statements with:
buildpragmadeclaration(ospragma.str(), scope); buildvarrefexp("a", scope);      
Comments
Post a Comment