void CompassAnalyses::DefaultCase::Traversal:: visit(SgNode* node) { SgSwitchStatement* theSwitch = isSgSwitchStatement(node); if (!theSwitch) return; bool has_default = false; if (isSgBasicBlock(theSwitch->get_body())) { SgBasicBlock* BBlock = isSgBasicBlock(theSwitch->get_body()); //I should maybe do more sanity checking for nulls here SgStatementPtrList BBlockStmts = BBlock->get_statements(); for (Rose_STL_Container<SgStatement*>::iterator j = BBlockStmts.begin(); j != BBlockStmts.end(); j++) { if (isSgDefaultOptionStmt(*j)){ has_default = true; break; } } } else { if (isSgDefaultOptionStmt(theSwitch->get_body())) { has_default = true; } } if (!has_default){ output->addOutput(new CheckerOutput(node)); } // Implement your traversal here. } //End of the visit function.
void instr(SgScopeStatement* scope) { if(isSgBasicBlock(scope)) { #ifdef LOCK_KEY_INSERT instr(isSgBasicBlock(scope)); #endif } else if(isSgGlobal(scope)) { instr(isSgGlobal(scope)); } }
// DQ (2/6/2010): This codes was moved from tests/trestTranslator.C // It is not currently called within the the fixup of the AST. // Note that this used to be called using: // if (getenv("ROSE_TEST_ELSE_DISAMBIGUATION") != NULL) removeEmptyElses(project); // But I didn't feel that we wanted evnvironment variable based testing like this. // This is a fixup that we might want later. void removeEmptyElses(SgNode* top) { std::vector<SgNode*> ifs = NodeQuery::querySubTree(top, V_SgIfStmt); for (size_t i = 0; i < ifs.size(); ++i) { SgIfStmt* s = isSgIfStmt(ifs[i]); if (isSgBasicBlock(s->get_false_body()) && isSgBasicBlock(s->get_false_body())->get_statements().empty()) { s->set_false_body(NULL); } } }
void MyTraversal::visit ( SgNode* astNode ) { SgBasicBlock* bb = isSgBasicBlock(astNode); SgGlobal *sg=isSgGlobal(astNode); string symbol_id="foo"; string incstr="#include \"newadinc.h\""; if (bb!=NULL) { // insert declaration double foo; // on top of this block Sg_File_Info * finfo=new Sg_File_Info(bb->getFileName(), 1,1); SgName sgnm(symbol_id.c_str()); SgType * ptype = new SgTypeDouble(); SgVariableDeclaration *sgdecl=new SgVariableDeclaration(finfo,sgnm, ptype); bb->prepend_statement(sgdecl); // MiddleLevelRewrite::insert(bb, sgdecl->unparseToString(),MidLevelCollectionTypedefs::TopOfCurrentScope); } else { if(sg!=NULL) { MiddleLevelRewrite::insert(sg,incstr, MidLevelCollectionTypedefs::TopOfCurrentScope); } } }
void CompassAnalyses::ExplicitTestForNonBooleanValue::Traversal:: visit(SgNode* node) { // Implement your traversal here. // 1. conditional expression if(NULL != isSgBasicBlock(node)) { Rose_STL_Container<SgNode*> conditionalExpList = NodeQuery::querySubTree(node, V_SgConditionalExp); for(Rose_STL_Container<SgNode*>::iterator i=conditionalExpList.begin(); i != conditionalExpList.end(); i++) { SgConditionalExp* conditionalExp = isSgConditionalExp(*i); //ROSE_ASSERT(conditionalExp != NULL); if(NULL != conditionalExp && NULL != isSgCastExp(conditionalExp->get_conditional_exp())) { output->addOutput(new CheckerOutput(conditionalExp)); } } } else { SgExprStatement* exprStatement = NULL; // 2. test statement in a if statement SgIfStmt* ifStmt = isSgIfStmt(node); if(NULL != ifStmt) exprStatement = isSgExprStatement(ifStmt->get_conditional()); // 3. test statement in a while statement SgWhileStmt* whileStmt = isSgWhileStmt(node); if(NULL != whileStmt) exprStatement = isSgExprStatement(whileStmt->get_condition()); // 4. test statement in a do-while statement SgDoWhileStmt* doWhileStmt = isSgDoWhileStmt(node); if(NULL != doWhileStmt) exprStatement = isSgExprStatement(doWhileStmt->get_condition()); // 5. test statement in a for statement SgForStatement* forStatement = isSgForStatement(node); if(NULL != forStatement) exprStatement = isSgExprStatement(forStatement->get_test()); if(NULL != exprStatement && NULL != isSgCastExp(exprStatement->get_expression())) { output->addOutput(new CheckerOutput(node)); } } } //End of the visit function.
SgStatement *findSafeInsertPoint(SgNode *node) { SgStatement *insertPoint = SageInterface::getEnclosingStatement(node); SgStatement *es = isSgExprStatement(insertPoint); SgStatement *esParent = es ? isSgStatement(es->get_parent()) : 0; if (es && (isSgSwitchStatement(esParent) || isSgIfStmt(esParent))) { // Make sure insertion point is outside of the condition of an if-stmt // or the selector of a switch-stmt. insertPoint = esParent; } else { if (esParent) { assert(isSgBasicBlock(esParent)); } } return insertPoint; }
void FindVariableDeclarations::visit ( SgNode* astNode ) { SgBasicBlock* block = isSgBasicBlock(astNode); if (block != NULL) { SgStatementPtrList & listOfStatements = block->get_statements(); for (size_t i = 0; i < listOfStatements.size(); i++) { SgVariableDeclaration* variableDeclaration = isSgVariableDeclaration(listOfStatements[i]); if (variableDeclaration != NULL) { printf ("Found a variable decaration in a SgBasicBlock at: \n"); variableDeclaration->get_file_info()->display("Found a variable decaration in a SgBasicBlock"); } } } }
// DQ (10/6/2007): Added fixup function to set scopes not set properly by the ROSETTA generated copy! void SgBasicBlock::fixupCopy_symbols(SgNode* copy, SgCopyHelp & help) const { #if DEBUG_FIXUP_COPY printf ("Inside of SgBasicBlock::fixupCopy_symbols() for %p = %s copy = %p \n",this,this->class_name().c_str(),copy); #endif SgBasicBlock* block_copy = isSgBasicBlock(copy); ROSE_ASSERT(block_copy != NULL); const SgStatementPtrList & statementList_original = this->getStatementList(); const SgStatementPtrList & statementList_copy = block_copy->getStatementList(); // Check that this need not be handled as a special case such as SgIfStmt. if (this->containsOnlyDeclarations() == true) { ROSE_ASSERT(this->getDeclarationList().size() == statementList_original.size()); } else { ROSE_ASSERT(this->getStatementList().size() == statementList_original.size()); } SgStatementPtrList::const_iterator i_original = statementList_original.begin(); SgStatementPtrList::const_iterator i_copy = statementList_copy.begin(); // Iterate over both lists to match up the correct pairs of SgStatement objects while ( (i_original != statementList_original.end()) && (i_copy != statementList_copy.end()) ) { (*i_original)->fixupCopy_symbols(*i_copy,help); i_original++; i_copy++; } // Call the base class fixupCopy member function SgScopeStatement::fixupCopy_symbols(copy,help); // printf ("\nLeaving SgBasicBlock::fixupCopy_symbols() this = %p = %s copy = %p \n",this,this->class_name().c_str(),copy); }
void SimpleInstrumentation::visit ( SgNode* astNode ) { SgBasicBlock* block = isSgBasicBlock(astNode); if (block != NULL) { // Mark this as a transformation (required) Sg_File_Info* sourceLocation = Sg_File_Info::generateDefaultFileInfoForTransformationNode(); ROSE_ASSERT(sourceLocation != NULL); SgType* type = new SgTypeInt(); ROSE_ASSERT(type != NULL); SgName name = "newVariable"; SgVariableDeclaration* variableDeclaration = new SgVariableDeclaration(sourceLocation,name,type); ROSE_ASSERT(variableDeclaration != NULL); SgInitializedName* initializedName = *(variableDeclaration->get_variables().begin()); initializedName->set_file_info(Sg_File_Info::generateDefaultFileInfoForTransformationNode()); // DQ (6/18/2007): The unparser requires that the scope be set (for name qualification to work). initializedName->set_scope(block); // Liao (2/13/2008): AstTests requires this to be set variableDeclaration->set_firstNondefiningDeclaration(variableDeclaration); ROSE_ASSERT(block->get_statements().size() > 0); block->get_statements().insert(block->get_statements().begin(),variableDeclaration); variableDeclaration->set_parent(block); // Add a symbol to the sybol table for the new variable SgVariableSymbol* variableSymbol = new SgVariableSymbol(initializedName); block->insert_symbol(name,variableSymbol); } }
bool ClangToSageTranslator::VisitFunctionDecl(clang::FunctionDecl * function_decl, SgNode ** node) { #if DEBUG_VISIT_DECL std::cerr << "ClangToSageTranslator::VisitFunctionDecl" << std::endl; #endif bool res = true; // FIXME: There is something weird here when try to Traverse a function reference in a recursive function (when first Traverse is not complete) // It seems that it tries to instantiate the decl inside the function... // It may be faster to recode from scratch... // If I am not wrong this have been fixed.... SgName name(function_decl->getNameAsString()); SgType * ret_type = buildTypeFromQualifiedType(function_decl->getResultType()); SgFunctionParameterList * param_list = SageBuilder::buildFunctionParameterList_nfi(); applySourceRange(param_list, function_decl->getSourceRange()); // FIXME find the good SourceRange (should be stored by Clang...) for (unsigned i = 0; i < function_decl->getNumParams(); i++) { SgNode * tmp_init_name = Traverse(function_decl->getParamDecl(i)); SgInitializedName * init_name = isSgInitializedName(tmp_init_name); if (tmp_init_name != NULL && init_name == NULL) { std::cerr << "Runtime error: tmp_init_name != NULL && init_name == NULL" << std::endl; res = false; continue; } param_list->append_arg(init_name); } if (function_decl->isVariadic()) { SgName empty = ""; SgType * ellipses_type = SgTypeEllipse::createType(); param_list->append_arg(SageBuilder::buildInitializedName_nfi(empty, ellipses_type, NULL)); } SgFunctionDeclaration * sg_function_decl; if (function_decl->isThisDeclarationADefinition()) { sg_function_decl = SageBuilder::buildDefiningFunctionDeclaration(name, ret_type, param_list, NULL); sg_function_decl->set_definingDeclaration(sg_function_decl); if (function_decl->isVariadic()) { sg_function_decl->hasEllipses(); } if (!function_decl->hasBody()) { std::cerr << "Defining function declaration without body..." << std::endl; res = false; } /* if (sg_function_decl->get_definition() != NULL) SageInterface::deleteAST(sg_function_decl->get_definition()); SgFunctionDefinition * function_definition = new SgFunctionDefinition(sg_function_decl, NULL); SgInitializedNamePtrList & init_names = param_list->get_args(); SgInitializedNamePtrList::iterator it; for (it = init_names.begin(); it != init_names.end(); it++) { (*it)->set_scope(function_definition); SgSymbolTable * st = function_definition->get_symbol_table(); ROSE_ASSERT(st != NULL); SgVariableSymbol * tmp_sym = new SgVariableSymbol(*it); st->insert((*it)->get_name(), tmp_sym); } */ SgFunctionDefinition * function_definition = sg_function_decl->get_definition(); if (sg_function_decl->get_definition()->get_body() != NULL) SageInterface::deleteAST(sg_function_decl->get_definition()->get_body()); SageBuilder::pushScopeStack(function_definition); SgNode * tmp_body = Traverse(function_decl->getBody()); SgBasicBlock * body = isSgBasicBlock(tmp_body); SageBuilder::popScopeStack(); if (tmp_body != NULL && body == NULL) { std::cerr << "Runtime error: tmp_body != NULL && body == NULL" << std::endl; res = false; } else { function_definition->set_body(body); body->set_parent(function_definition); applySourceRange(function_definition, function_decl->getSourceRange()); } sg_function_decl->set_definition(function_definition); function_definition->set_parent(sg_function_decl); SgFunctionDeclaration * first_decl; if (function_decl->getFirstDeclaration() == function_decl) { SgFunctionParameterList * param_list_ = SageBuilder::buildFunctionParameterList_nfi(); setCompilerGeneratedFileInfo(param_list_); SgInitializedNamePtrList & init_names = param_list->get_args(); SgInitializedNamePtrList::iterator it; for (it = init_names.begin(); it != init_names.end(); it++) { SgInitializedName * init_param = new SgInitializedName(**it); setCompilerGeneratedFileInfo(init_param); param_list_->append_arg(init_param); } first_decl = SageBuilder::buildNondefiningFunctionDeclaration(name, ret_type, param_list_, NULL); setCompilerGeneratedFileInfo(first_decl); first_decl->set_parent(SageBuilder::topScopeStack()); first_decl->set_firstNondefiningDeclaration(first_decl); if (function_decl->isVariadic()) first_decl->hasEllipses(); } else { SgSymbol * tmp_symbol = GetSymbolFromSymbolTable(function_decl->getFirstDeclaration()); SgFunctionSymbol * symbol = isSgFunctionSymbol(tmp_symbol); if (tmp_symbol != NULL && symbol == NULL) { std::cerr << "Runtime error: tmp_symbol != NULL && symbol == NULL" << std::endl; res = false; } if (symbol != NULL) first_decl = isSgFunctionDeclaration(symbol->get_declaration()); } sg_function_decl->set_firstNondefiningDeclaration(first_decl); first_decl->set_definingDeclaration(sg_function_decl); } else { sg_function_decl = SageBuilder::buildNondefiningFunctionDeclaration(name, ret_type, param_list, NULL); if (function_decl->isVariadic()) sg_function_decl->hasEllipses(); SgInitializedNamePtrList & init_names = param_list->get_args(); SgInitializedNamePtrList::iterator it; for (it = init_names.begin(); it != init_names.end(); it++) { (*it)->set_scope(SageBuilder::topScopeStack()); } if (function_decl->getFirstDeclaration() != function_decl) { SgSymbol * tmp_symbol = GetSymbolFromSymbolTable(function_decl->getFirstDeclaration()); SgFunctionSymbol * symbol = isSgFunctionSymbol(tmp_symbol); if (tmp_symbol != NULL && symbol == NULL) { std::cerr << "Runtime error: tmp_symbol != NULL && symbol == NULL" << std::endl; res = false; } SgFunctionDeclaration * first_decl = NULL; if (symbol != NULL) { first_decl = isSgFunctionDeclaration(symbol->get_declaration()); } else { // FIXME Is it correct? SgNode * tmp_first_decl = Traverse(function_decl->getFirstDeclaration()); first_decl = isSgFunctionDeclaration(tmp_first_decl); ROSE_ASSERT(first_decl != NULL); // ROSE_ASSERT(!"We should have see the first declaration already"); } if (first_decl != NULL) { if (first_decl->get_firstNondefiningDeclaration() != NULL) sg_function_decl->set_firstNondefiningDeclaration(first_decl->get_firstNondefiningDeclaration()); else { ROSE_ASSERT(first_decl->get_firstNondefiningDeclaration() != NULL); } } else { ROSE_ASSERT(!"First declaration not found!"); } } else { sg_function_decl->set_firstNondefiningDeclaration(sg_function_decl); } } ROSE_ASSERT(sg_function_decl->get_firstNondefiningDeclaration() != NULL); /* // TODO Fix problem with function symbols... SgSymbol * symbol = GetSymbolFromSymbolTable(function_decl); if (symbol == NULL) { SgFunctionSymbol * func_sym = new SgFunctionSymbol(isSgFunctionDeclaration(sg_function_decl->get_firstNondefiningDeclaration())); SageBuilder::topScopeStack()->insert_symbol(name, func_sym); } */ // ROSE_ASSERT(GetSymbolFromSymbolTable(function_decl) != NULL); *node = sg_function_decl; return VisitDeclaratorDecl(function_decl, node) && res; }
/* recommenderTraversal::visit */ void recommenderTraversal::visit(SgNode *node) { Sg_File_Info *info = NULL; SgFunctionDefinition *function = NULL; SgForStatement *c_loop = NULL; SgNode *grandparent = NULL; SgNode *parent = NULL; int node_found = 0; info = node->get_file_info(); /* Find code fragment for bottlenecks type 'loop' in C */ if ((isSgForStatement(node)) && (info->get_line() == fragment->line) && (PERFEXPERT_HOTSPOT_LOOP == fragment->type)) { /* Found a C loop on the exact line number */ OUTPUT_VERBOSE((8, " [loop] %s (line %d)", _GREEN((char *)"found"), info->get_line())); /* Extract the loop fragment */ if (PERFEXPERT_SUCCESS != output_fragment(node, info, fragment)) { OUTPUT(("%s", _ERROR((char *)"extracting fragment"))); rc = PERFEXPERT_ERROR; return; } /* Save the fragment path and filename */ PERFEXPERT_ALLOC(char, fragment->fragment_file, (strlen(globals.workdir) + strlen(FRAGMENTS_DIR) + strlen(fragment->file) + 15)); sprintf(fragment->fragment_file, "%s/%s/%s_%d", globals.workdir, FRAGMENTS_DIR, fragment->file, fragment->line); /* What is the loop detph and who is parent node */ if (2 <= fragment->depth) { parent = node->get_parent(); /* It is a basic block. Who is this basic block's parent? */ if (NULL != isSgBasicBlock(parent)) { parent = parent->get_parent(); } /* Is it a for/do/while? */ if (isSgForStatement(parent)) { info = parent->get_file_info(); fragment->outer_loop_line = info->get_line(); /* The parent is a loop */ OUTPUT_VERBOSE((8, " [parent loop] %s (line %d)", _GREEN((char *)"found"), fragment->outer_loop_line)); /* Extract the parent loop fragment */ if (PERFEXPERT_SUCCESS != output_fragment(parent, info, fragment)) { OUTPUT(("%s", _ERROR((char *)"extracting fragment"))); rc = PERFEXPERT_ERROR; return; } /* Save the fragment path and filename */ PERFEXPERT_ALLOC(char, fragment->outer_loop_fragment_file, (strlen(globals.workdir) + strlen(FRAGMENTS_DIR) + strlen(fragment->file) + 15)); sprintf(fragment->outer_loop_fragment_file, "%s/%s/%s_%d", globals.workdir, FRAGMENTS_DIR, fragment->file, fragment->outer_loop_line); /* What is the loop detph and who is the grandparent node */ if (3 <= fragment->depth) { grandparent = parent->get_parent(); /* It is a basic block. Who is this basic block's parent? */ if (NULL != isSgBasicBlock(grandparent)) { grandparent = grandparent->get_parent(); } /* Is it a for/do/while? */ if (isSgForStatement(grandparent)) { info = grandparent->get_file_info(); fragment->outer_outer_loop_line = info->get_line(); /* The grandparent is a loop */ OUTPUT_VERBOSE((8, " [grandparent loop] %s (line %d)", _GREEN((char *)"found"), fragment->outer_outer_loop_line)); /* Extract the parent loop fragment */ if (PERFEXPERT_SUCCESS != output_fragment(grandparent, info, fragment)) { OUTPUT(("%s", _ERROR((char *)"extracting fragment"))); rc = PERFEXPERT_ERROR; return; } /* Save the fragment path and filename */ PERFEXPERT_ALLOC(char, fragment->outer_outer_loop_fragment_file, (strlen(globals.workdir) + strlen(FRAGMENTS_DIR) + strlen(fragment->file) + 15)); sprintf(fragment->outer_outer_loop_fragment_file, "%s/%s/%s_%d", globals.workdir, FRAGMENTS_DIR, fragment->file, fragment->outer_outer_loop_line); } } }
bool ignore(SgScopeStatement * scope) { return isSgBasicBlock(scope); }
void RewriteFSM::visitSgFunctionDeclaration(SgFunctionDeclaration *FD) { SgFunctionDefinition *fdef = FD->get_definition(); if (!fdef) { return; } if (debugHooks) { std::cout << "Func decl: " << FD << " " << FD->get_name() << std::endl; } std::string modName = FD->get_name().getString(); HtdInfoAttribute *htd = getHtdInfoAttribute(fdef); bool isStreamingStencil = false; size_t pos = 0; if ((pos = modName.find(StencilStreamPrefix)) != std::string::npos && pos == 0) { isStreamingStencil = true; } #define hostEntryPrefix "__HTC_HOST_ENTRY_" bool isHostEntry = false; if ((pos = modName.find(hostEntryPrefix)) != std::string::npos && pos == 0) { isHostEntry = true; } // Emit a default, unnamed thread group. std::string modWidth = boost::to_upper_copy(modName) + "_HTID_W"; if (isStreamingStencil) { // The streaming version of a stencil must have width 0. htd->appendDefine(modWidth, "0"); } else if (isHostEntry) { htd->appendDefine(modWidth, "1"); } else if (htd->moduleWidth != -1) { htd->appendDefine(modWidth, boost::lexical_cast<std::string>(htd->moduleWidth)); } else { DefaultModuleWidthAttribute *dwAttr = getDefaultModuleWidthAttribute(SageInterface::getGlobalScope(fdef)); if (dwAttr) { htd->appendDefine(modWidth, boost::lexical_cast<std::string>(dwAttr->width)); } else { htd->appendDefine(modWidth, "5"); } } htd->appendModule(modName, "", modWidth); // For streaming stencils, ProcessStencils inserts a canned sequence, // so we bypass generating a normal FSM. if (isStreamingStencil) { return; } // // Create new case body blocks for each state. // The first executable statement starts the first state, and each // label starts a new state. // std::map<SgLabelStatement *, int> labelToState; std::map<int, std::string> stateToName; SgBasicBlock *funcBody = isSgBasicBlock(fdef->get_body()); SgStatementPtrList &stmts = funcBody->get_statements(); std::vector<SgStatement *>::iterator SI, SP; for (SI = stmts.begin(); SI != stmts.end(); ++SI) { if (!isSgDeclarationStatement(*SI)) { break; } } if (SI == stmts.end()) { return; } SP = SI; std::vector<SgBasicBlock *> newBlocks; SgBasicBlock *newbb = SageBuilder::buildBasicBlock(); newBlocks.push_back(newbb); stateToName[1] = "__START"; bool prevIsLabel = false; for (; SI != stmts.end(); ++SI) { SgStatement *stmt = *SI; SgLabelStatement *labstmt = isSgLabelStatement(stmt); if (labstmt) { if (!prevIsLabel) { newbb = SageBuilder::buildBasicBlock(); newBlocks.push_back(newbb); } int snum = newBlocks.size(); labelToState[labstmt] = snum; stateToName[snum] += "__" + labstmt->get_label().getString(); prevIsLabel = true; #if 1 // TODO: these labels can carry preproc infos-- but the unparser // doesn't output them if the label is not actually output. AttachedPreprocessingInfoType *comments = labstmt->getAttachedPreprocessingInfo(); if (comments && comments->size() > 0) { std::cerr << "DEVWARN: losing Preprocinfo on label" << std::endl; SageInterface::dumpPreprocInfo(labstmt); } #endif stmt->unsetOutputInCodeGeneration(); SageInterface::appendStatement(stmt, newbb); } else { prevIsLabel = false; SageInterface::appendStatement(stmt, newbb); } } stmts.erase(SP, stmts.end()); // Add module name to each state name and create enum decl. SgEnumDeclaration *enumDecl = SageBuilder::buildEnumDeclaration("states", fdef); for (int i = 1; i <= newBlocks.size(); i++) { stateToName[i] = modName + stateToName[i]; boost::to_upper(stateToName[i]); SgName nm(stateToName[i]); SgInitializedName *enumerator = SageBuilder::buildInitializedName(nm, SageBuilder::buildIntType(), SageBuilder::buildAssignInitializer(SageBuilder::buildIntVal(i))); enumerator->set_scope(funcBody); enumDecl->append_enumerator(enumerator); // Add the instruction to the htd info. htd->appendInst(nm.getString()); } SageInterface::prependStatement(enumDecl, funcBody); if (!debugHooks) { enumDecl->unsetOutputInCodeGeneration(); } SgGlobal *GS = SageInterface::getGlobalScope(FD); SgVariableDeclaration *declHtValid = HtDeclMgr::buildHtlVarDecl("PR_htValid", GS); SgVariableDeclaration *declHtInst = HtDeclMgr::buildHtlVarDecl("PR_htInst", GS); SgFunctionDeclaration *declHtContinue = HtDeclMgr::buildHtlFuncDecl("HtContinue", GS); SgFunctionDeclaration *declHtAssert = HtDeclMgr::buildHtlFuncDecl("HtAssert", GS); // // Create the finite state machine switch statement "switch (PR_htInst)", // and insert guard "if (PR_htValid)". // SgBasicBlock *newSwitchBody = SageBuilder::buildBasicBlock(); SgExpression *htInstExpr = SageBuilder::buildVarRefExp(declHtInst); SgSwitchStatement *newSwitch = SageBuilder::buildSwitchStatement(htInstExpr, newSwitchBody); SgExpression *htValidExpr = SageBuilder::buildVarRefExp(declHtValid); SgIfStmt *newIfStmt = SageBuilder::buildIfStmt(htValidExpr, SageBuilder::buildBasicBlock(newSwitch), 0); SageInterface::appendStatement(newIfStmt, funcBody); int casenum = 1; foreach (SgBasicBlock *newCaseBody, newBlocks) { SgExpression *caseExpr = SageBuilder::buildEnumVal_nfi(casenum, enumDecl, stateToName[casenum]); SgCaseOptionStmt *newCase = SageBuilder::buildCaseOptionStmt(caseExpr, newCaseBody); SageInterface::appendStatement(newCase, newSwitchBody); casenum++; }
//! Translate generated Pragma Attributes one by one void translatePragmas (std::vector <MPI_PragmaAttribute*>& Attribute_List) { std::vector<MPI_PragmaAttribute*>::iterator iter; for (iter = Attribute_List.begin(); iter!=Attribute_List.end(); iter ++) { MPI_PragmaAttribute* cur_attr = *iter; cout<<"Translating ..." << cur_attr->toString() <<endl; SgScopeStatement* scope = cur_attr->pragma_node ->get_scope(); ROSE_ASSERT (scope != NULL); // simply obtain the default value and remove the pragma if (cur_attr-> pragma_type == pragma_mpi_device_default) { mpi_device_default_choice = cur_attr->default_semantics; // no automatic handling of attached preprocessed info. for now removeStatement(cur_attr->pragma_node, false); } // find omp target device(mpi:all) begin else if (cur_attr-> pragma_type == pragma_mpi_device_all_begin) { iter ++; // additional increment once MPI_PragmaAttribute* end_attribute = *iter; ROSE_ASSERT (end_attribute->pragma_type = pragma_mpi_device_all_end); removeStatement(cur_attr->pragma_node, false); removeStatement(end_attribute ->pragma_node, false); } else if (cur_attr-> pragma_type == pragma_mpi_device_master_begin) { // TODO refactor into a function iter ++; // additional increment once MPI_PragmaAttribute* end_attribute = *iter; ROSE_ASSERT (end_attribute->pragma_type = pragma_mpi_device_master_end); //insert a if (rank) .. after the end pragma SgIfStmt * ifstmt = buildIfStmt (buildEqualityOp(buildVarRefExp("_xomp_rank", scope), buildIntVal(0)), buildBasicBlock(), NULL); insertStatementAfter (end_attribute->pragma_node, ifstmt); SgBasicBlock * bb = isSgBasicBlock(ifstmt->get_true_body()); SgStatement* next_stmt = getNextStatement(cur_attr->pragma_node); // the next stmt is BB, skip it by starting the search from it ROSE_ASSERT (next_stmt != NULL); // normalize all declarations while ( next_stmt != end_attribute ->pragma_node) { // save current stmt before getting next one SgStatement* cur_stmt = next_stmt; next_stmt = getNextStatement (next_stmt); ROSE_ASSERT (next_stmt != NULL); if (SgVariableDeclaration* decl = isSgVariableDeclaration (cur_stmt)) splitVariableDeclaration (decl); } // move all non-declaration statements in between into the block next_stmt = getNextStatement(cur_attr->pragma_node); //reset from the beginning while ( next_stmt != end_attribute ->pragma_node) { // save current stmt before getting next one SgStatement* cur_stmt = next_stmt; next_stmt = getNextStatement (next_stmt); ROSE_ASSERT (next_stmt != NULL); if (!isSgVariableDeclaration(cur_stmt)) { // now remove the current stmt removeStatement (cur_stmt, false); appendStatement(cur_stmt, bb); } } // remove pragmas removeStatement(cur_attr->pragma_node, false); removeStatement(end_attribute ->pragma_node, false); } } // end for } // end translatePragmas ()
POETCode* POETAstInterface::Ast2POET(const Ast& n) { static SgTemplateInstantiationFunctionDecl* tmp=0; SgNode* input = (SgNode*) n; if (input == 0) return EMPTY; POETCode* res = POETAstInterface::find_Ast2POET(input); if (res != 0) return res; { SgProject* sageProject=isSgProject(input); if (sageProject != 0) { int filenum = sageProject->numberOfFiles(); for (int i = 0; i < filenum; ++i) { SgSourceFile* sageFile = isSgSourceFile(sageProject->get_fileList()[i]); SgGlobal *root = sageFile->get_globalScope(); SgDeclarationStatementPtrList declList = root->get_declarations (); POETCode* curfile = ROSE_2_POET_list(declList, 0, tmp); curfile = new POETCode_ext(sageFile, curfile); POETAstInterface::set_Ast2POET(sageFile, curfile); res=LIST(curfile, res); } POETAstInterface::set_Ast2POET(sageProject,res); return res; } } { SgBasicBlock* block = isSgBasicBlock(input); if (block != 0) { res=ROSE_2_POET_list(block->get_statements(), res, tmp); POETAstInterface::set_Ast2POET(block, res); return res; } } { SgExprListExp* block = isSgExprListExp(input); if (block != 0) { res=ROSE_2_POET_list(block->get_expressions(), 0, tmp); POETAstInterface::set_Ast2POET(block, res); return res; } } { SgForStatement *f = isSgForStatement(input); if (f != 0) { POETCode* init = ROSE_2_POET_list(f->get_for_init_stmt()->get_init_stmt(),0, tmp); POETCode* ctrl = new POETCode_ext(f, TUPLE3(init,Ast2POET(f->get_test_expr()), Ast2POET(f->get_increment()))); res = CODE_ACC("Nest", PAIR(ctrl,Ast2POET(f->get_loop_body()))); POETAstInterface::set_Ast2POET(input, res); return res; } } { SgVarRefExp * v = isSgVarRefExp(input); if (v != 0) { res = STRING(v->get_symbol()->get_name().str()); POETAstInterface::set_Ast2POET(input, res); return res; } } { SgMemberFunctionRefExp * v = isSgMemberFunctionRefExp(input); if (v != 0) { res = STRING(v->get_symbol()->get_name().str()); POETAstInterface::set_Ast2POET(input, res); return res; } } { SgIntVal * v = isSgIntVal(input); if (v != 0) { res = ICONST(v->get_value()); POETAstInterface::set_Ast2POET(input, res); return res; } } { SgInitializedName* var = isSgInitializedName(input); if (var != 0) { POETCode* name = STRING(var->get_name().str()); POETCode* init = Ast2POET(var->get_initializer()); res = new POETCode_ext(var, PAIR(name,init)); POETAstInterface::set_Ast2POET(input, res); return res; } } /* { std::string fname; AstInterface::AstList params; AstNodeType returnType; AstNodePtr body; if (AstInterface :: IsFunctionDefinition( input, &fname, ¶ms, (AstInterface::AstList*)0, &body, (AstInterface::AstTypeList*)0, &returnType)) { if (body != AST_NULL) std::cerr << "body not empty:" << fname << "\n"; POETCode* c = TUPLE4(STRING(fname), ROSE_2_POET_list(0,params,0), STRING(AstInterface::GetTypeName(returnType)), Ast2POET(body.get_ptr())); res = new POETCode_ext(input, c); POETAstInterface::set_Ast2POET(input,res); return res; } } */ AstInterface::AstList c = AstInterface::GetChildrenList(input); switch (input->variantT()) { case V_SgCastExp: case V_SgAssignInitializer: res = Ast2POET(c[0]); POETAstInterface::set_Ast2POET(input, res); return res; case V_SgDotExp: { POETCode* v1 = Ast2POET(c[1]); if (dynamic_cast<POETString*>(v1)->get_content() == "operator()") return Ast2POET(c[0]); res = CODE_ACC("Bop",TUPLE3(STRING("."), Ast2POET(c[0]), v1)); return res; } case V_SgLessThanOp: res = CODE_ACC("Bop",TUPLE3(STRING("<"),Ast2POET(c[0]), Ast2POET(c[1]))); POETAstInterface::set_Ast2POET(input, res); return res; case V_SgSubtractOp: res = CODE_ACC("Bop",TUPLE3(STRING("-"),Ast2POET(c[0]), Ast2POET(c[1]))); POETAstInterface::set_Ast2POET(input, res); return res; case V_SgAddOp: res = CODE_ACC("Bop",TUPLE3(STRING("+"),Ast2POET(c[0]), Ast2POET(c[1]))); POETAstInterface::set_Ast2POET(input, res); return res; case V_SgMultiplyOp: res = CODE_ACC("Bop",TUPLE3(STRING("*"),Ast2POET(c[0]), Ast2POET(c[1]))); POETAstInterface::set_Ast2POET(input, res); return res; case V_SgDivideOp: res = CODE_ACC("Bop",TUPLE3(STRING("/"),Ast2POET(c[0]), Ast2POET(c[1]))); POETAstInterface::set_Ast2POET(input, res); return res; case V_SgAssignOp: res = CODE_ACC("Assign",PAIR(Ast2POET(c[0]), Ast2POET(c[1]))); POETAstInterface::set_Ast2POET(input, res); return res; case V_SgFunctionCallExp: res = CODE_ACC("FunctionCall",PAIR(Ast2POET(c[0]), Ast2POET(c[1]))); POETAstInterface::set_Ast2POET(input, res); return res; } POETCode * c2 = 0; if (tmp == 0) tmp=isSgTemplateInstantiationFunctionDecl(input); switch (c.size()) { case 0: break; case 1: c2 = Ast2POET(c[0]); break; case 2: c2 = PAIR(Ast2POET(c[0]),Ast2POET(c[1])); break; case 3: c2 = TUPLE3(Ast2POET(c[0]),Ast2POET(c[1]),Ast2POET(c[2])); break; case 4: c2 = TUPLE4(Ast2POET(c[0]),Ast2POET(c[1]),Ast2POET(c[2]),Ast2POET(c[3])); break; default: //std::cerr << "too many children: " << c.size() << ":" << input->unparseToString() << "\n"; c2 = EMPTY; } if (tmp == input) tmp = 0; res = new POETCode_ext(input, c2); POETAstInterface::set_Ast2POET(input,res); return res; }
void getSgScopeStatement(SgScopeStatement* scopeStat) { VariantT var = scopeStat->variantT(); std::string scopeStatStr = ""; switch (var) { case V_SgBasicBlock: { getSgBasicBlock(isSgBasicBlock(scopeStat)); break; } case V_SgCatchOptionStmt: { std::cout << "SgCatchOptionStmt is not yet implemented" << std::endl; ROSE_ASSERT(false); break; } case V_SgDoWhileStmt: { std::cout << "SgDoWhileStmt is not yet implemented" << std::endl; ROSE_ASSERT(false); break; } case V_SgForStatement: { // std::cout << "SgForStatement is not yet implemented" << std::endl; #ifdef FORLOOPONCETHROUGH forOnceThrough(isSgForStatement(scopeStat)); #else std::cout << "SgForStatement is not yet implemented" << std::endl; ROSE_ASSERT(false); #endif break; } case V_SgGlobal: { std::cout << "SgGlobal is not yet implemented" << std::endl; ROSE_ASSERT(false); break; } case V_SgIfStmt: { getSgIfStmt(isSgIfStmt(scopeStat)); break; } case V_SgSwitchStatement: { std::cout << "SgSwitchStatement is not yet implemented" << std::endl; ROSE_ASSERT(false); break; } case V_SgWhileStmt: { std::cout << "SgWhileStmt is not yet implemented" << std::endl; ROSE_ASSERT(false); break; } case V_SgForAllStatement: { std::cout << "SgForAllStatement is not yet implemented" << std::endl; ; ROSE_ASSERT(false); break; } case V_SgAssociateStatement: { std::cout << "SgAssociateStatement is not yet implemented" << std::endl; ; ROSE_ASSERT(false); break; } case V_SgBlockDataStatement: { std::cout << "SgBlockDataStatement is not yet implemented" << std::endl; ; ROSE_ASSERT(false); break; } case V_SgNamespaceDefinitionStatement: { std::cout << "SgNamespaceDefinitionStatement is not yet implemented" << std::endl; ; ROSE_ASSERT(false); break; } case V_SgClassDefinition: { std::cout << "SgClassDefinition should not be found here! " << std::endl; ROSE_ASSERT(false); break; } case V_SgFunctionDefinition: { getSgFunctionDefinition(isSgFunctionDefinition(scopeStat)); break; } case V_SgCAFWithTeamStatement: { std::cout << "SgCAFWithTeamStatement should not be found here! " << std::endl; ROSE_ASSERT(false); break; } case V_SgFortranDo: { std::cout << "SgFortranDo should not be found here! " << std::endl; ROSE_ASSERT(false); break; } case V_SgFortranNonblockedDo: { std::cout << "SgFortranNonblockedDo should not be found here! " << std::endl; ROSE_ASSERT(false); break; } case V_SgJavaForEachStatement: { std::cout << "SgJavaForEachStatement should not be found here! " << std::endl; ROSE_ASSERT(false); break; } case V_SgJavaLabelStatement: { std::cout << "SgJavaLabelStatement should not be found here! " << std::endl; ROSE_ASSERT(false); break; } case V_SgUpcForAllStatement: { std::cout << "SgUpcForAllStatement should not be found here! " << std::endl; ROSE_ASSERT(false); break; } default: { std::cout << " Unknown node type!: " << scopeStat->class_name() << std::endl; ROSE_ASSERT(false); } } return; }
/** Visits AST nodes in pre-order */ FunctionCallInheritedAttribute FunctionEvaluationOrderTraversal::evaluateInheritedAttribute(SgNode* astNode, FunctionCallInheritedAttribute parentAttribute) { FunctionCallInheritedAttribute result = parentAttribute; SgForStatement* parentForLoop = isSgForStatement(parentAttribute.currentScope); SgWhileStmt* parentWhileLoop = isSgWhileStmt(parentAttribute.currentScope); SgDoWhileStmt* parentDoWhileLoop = isSgDoWhileStmt(parentAttribute.currentScope); SgConditionalExp* parentSgConditionalExp = astNode->get_parent() ? isSgConditionalExp(astNode->get_parent()) : NULL; SgAndOp* parentAndOp = astNode->get_parent() ?isSgAndOp(astNode->get_parent()) : NULL; SgOrOp* parentOrOp = astNode->get_parent() ? isSgOrOp(astNode->get_parent()) : NULL; if (isSgForStatement(astNode)) result.currentScope = isSgForStatement(astNode); else if (isSgWhileStmt(astNode)) result.currentScope = isSgWhileStmt(astNode); else if (isSgDoWhileStmt(astNode)) result.currentScope = isSgDoWhileStmt(astNode); //else if (isSgConditionalExp(astNode)) // result.currentScope = isSgConditionalExp(astNode); //else if (isSgAndOp(astNode)) // result.currentScope = isSgAndOp(astNode); //else if (isSgOrOp(astNode)) // result.currentScope = isSgOrOp(astNode); else if (isSgForInitStatement(astNode)) { ROSE_ASSERT(result.scopeStatus == FunctionCallInheritedAttribute::IN_SAFE_PLACE); result.scopeStatus = FunctionCallInheritedAttribute::INSIDE_FOR_INIT; ROSE_ASSERT(isSgForStatement(result.currentScope)); } else if (parentForLoop != NULL && parentForLoop->get_test() == astNode) { ROSE_ASSERT(result.scopeStatus == FunctionCallInheritedAttribute::IN_SAFE_PLACE); result.scopeStatus = FunctionCallInheritedAttribute::INSIDE_FOR_TEST; } else if (parentForLoop != NULL && parentForLoop->get_increment() == astNode) { ROSE_ASSERT(result.scopeStatus == FunctionCallInheritedAttribute::IN_SAFE_PLACE); result.scopeStatus = FunctionCallInheritedAttribute::INSIDE_FOR_INCREMENT; } else if (parentWhileLoop != NULL && parentWhileLoop->get_condition() == astNode) { ROSE_ASSERT(result.scopeStatus == FunctionCallInheritedAttribute::IN_SAFE_PLACE); result.scopeStatus = FunctionCallInheritedAttribute::INSIDE_WHILE_CONDITION; } else if (parentDoWhileLoop != NULL && parentDoWhileLoop->get_condition() == astNode) { ROSE_ASSERT(result.scopeStatus == FunctionCallInheritedAttribute::IN_SAFE_PLACE); result.scopeStatus = FunctionCallInheritedAttribute::INSIDE_DO_WHILE_CONDITION; } else if( parentSgConditionalExp != NULL && parentSgConditionalExp->get_true_exp() == astNode) { // if the scope status was safe, turn it into unsafe if (IsStatusSafe(result.scopeStatus)) result.scopeStatus = FunctionCallInheritedAttribute::INSIDE_CONDITIONAL_EXP_TRUE_ARM; } else if(parentSgConditionalExp != NULL && parentSgConditionalExp->get_false_exp() == astNode) { // if the scope status was safe, turn it into unsafe if (IsStatusSafe(result.scopeStatus)) result.scopeStatus = FunctionCallInheritedAttribute::INSIDE_CONDITIONAL_EXP_FALSE_ARM; } else if( parentOrOp != NULL && parentOrOp->get_rhs_operand () == astNode) { // if the scope status was safe, turn it into unsafe if (IsStatusSafe(result.scopeStatus)) result.scopeStatus = FunctionCallInheritedAttribute::INSIDE_SHORT_CIRCUIT_EXP_RHS; } else if( parentAndOp != NULL && parentAndOp->get_rhs_operand () == astNode) { // if the scope status was safe, turn it into unsafe if (IsStatusSafe(result.scopeStatus)) result.scopeStatus = FunctionCallInheritedAttribute::INSIDE_SHORT_CIRCUIT_EXP_RHS; } //We can't insert variables before an expression statement that appears inside if(), switch, throw, etc. if (isSgExprStatement(astNode) && !isSgBasicBlock(astNode->get_parent())) { //We can't insert a variable declaration at these locations. Use the parent statement } else if (isSgStatement(astNode)) { result.lastStatement = isSgStatement(astNode); } return result; }
void SgNode::insertSourceCode ( SgProject & project, const char* sourceCodeString, const char* localDeclaration, const char* globalDeclaration, bool locateNewCodeAtTop, bool isADeclaration ) { // If this function is useful only for SgBasicBlock then it should be put into that class directly. // This function is used to insert code into AST object for which insertion make sense: // (specifically any BASIC_BLOCK_STMT) if (variant() != BASIC_BLOCK_STMT) { printf ("ERROR: insert only make since for BASIC_BLOCK_STMT statements (variant() == variant()) \n"); ROSE_ABORT(); } SgBasicBlock* currentBlock = isSgBasicBlock(this); ROSE_ASSERT (currentBlock != NULL); // printf ("##### Calling SgNode::generateAST() \n"); #if 0 printf ("In insertSourceCode(): globalDeclaration = \n%s\n",globalDeclaration); printf ("In insertSourceCode(): localDeclaration = \n%s\n",localDeclaration); printf ("In insertSourceCode(): sourceCodeString = \n%s\n",sourceCodeString); #endif // SgNode* newTransformationAST = generateAST (project,sourceCodeString,globalDeclaration); // ROSE_ASSERT (newTransformationAST != NULL); SgStatementPtrList* newTransformationStatementListPtr = generateAST (project,sourceCodeString,localDeclaration,globalDeclaration,isADeclaration); ROSE_ASSERT (newTransformationStatementListPtr != NULL); ROSE_ASSERT (newTransformationStatementListPtr->size() > 0); // printf ("##### DONE: Calling SgNode::generateAST() \n"); // get a reference to the statement list out of the basic block SgStatementPtrList & currentStatementList = currentBlock->get_statements(); if (locateNewCodeAtTop == true) { // Insert at top of list (pull the elements off the bottom of the new statement list to get the order correct // printf ("Insert new statements (new statement list size = %d) at the top of the block (in reverse order to preset the order in the final block) \n",newTransformationStatementListPtr->size()); SgStatementPtrList::reverse_iterator transformationStatementIterator; for (transformationStatementIterator = newTransformationStatementListPtr->rbegin(); transformationStatementIterator != newTransformationStatementListPtr->rend(); transformationStatementIterator++) { // Modify where a statement is inserted to avoid dependent variables from being inserted // before they are declared. // Get a list of the variables // Generate the list of types used within the target subtree of the AST list<string> typeNameStringList = NameQuery::getTypeNamesQuery ( *transformationStatementIterator ); int statementCounter = 0; int previousStatementCounter = 0; // Declaration furthest in source sequence of all variables referenced in code to be inserted (last in source sequence order) // SgStatementPtrList::iterator furthestDeclarationInSourceSequence = NULL; SgStatementPtrList::iterator furthestDeclarationInSourceSequence; #if 0 string unparsedDeclarationCodeString = (*transformationStatementIterator)->unparseToString(); ROSE_ASSERT (unparsedDeclarationCodeString.c_str() != NULL); printf ("unparsedDeclarationCodeString = %s \n",unparsedDeclarationCodeString.c_str()); #endif if ( typeNameStringList.size() > 0 ) { // There should be at least one type in the statement ROSE_ASSERT (typeNameStringList.size() > 0); // printf ("typeNameStringList.size() = %d \n",typeNameStringList.size()); // printf ("This statement has a dependence upon a variable of some type \n"); // Loop over all the types and get list of variables of each type // (so they can be declared properly when the transformation is compiled) list<string>::iterator typeListStringElementIterator; for (typeListStringElementIterator = typeNameStringList.begin(); typeListStringElementIterator != typeNameStringList.end(); typeListStringElementIterator++) { // printf ("Type = %s \n",(*typeListStringElementIterator).c_str()); // Find a list of names of variable of type (*listStringElementIterator) list<string> operandNameStringList = NameQuery::getVariableNamesWithTypeNameQuery ( *transformationStatementIterator, *typeListStringElementIterator ); // There should be at least one variable of that type in the statement ROSE_ASSERT (operandNameStringList.size() > 0); // printf ("operandNameStringList.size() = %d \n",operandNameStringList.size()); // Loop over all the types and get list of variable of each type list<string>::iterator variableListStringElementIterator; for (variableListStringElementIterator = operandNameStringList.begin(); variableListStringElementIterator != operandNameStringList.end(); variableListStringElementIterator++) { #if 0 printf ("Type = %s Variable = %s \n", (*typeListStringElementIterator).c_str(), (*variableListStringElementIterator).c_str()); #endif string variableName = *variableListStringElementIterator; string typeName = *typeListStringElementIterator; SgName name = variableName.c_str(); SgVariableSymbol* symbol = currentBlock->lookup_var_symbol(name); if ( symbol != NULL ) { // found a variable with name -- make sure that the declarations // represented by *transformationStatementIterator are inserted // after their declaration. #if 0 printf ("Found a valid symbol corresponding to Type = %s Variable = %s (must be defined in the local scope) \n", (*typeListStringElementIterator).c_str(), (*variableListStringElementIterator).c_str()); #endif ROSE_ASSERT (symbol != NULL); SgInitializedName* declarationInitializedName = symbol->get_declaration(); ROSE_ASSERT (declarationInitializedName != NULL); SgDeclarationStatement* declarationStatement = declarationInitializedName->get_declaration(); ROSE_ASSERT (declarationStatement != NULL); #if 0 printf ("declarationStatementString located at line = %d of file = %s \n", rose::getLineNumber(declarationStatement), rose::getFileName(declarationStatement)); string declarationStatementString = declarationStatement->unparseToString(); printf ("declarationStatementString = %s \n",declarationStatementString.c_str()); #endif statementCounter = 1; SgStatementPtrList::iterator i = currentStatementList.begin(); bool declarationFound = false; while ( ( i != currentStatementList.end() ) && ( declarationFound == false ) ) { // searching for the declarationStatement #if 0 printf ("statementCounter = %d previousStatementCounter = %d \n", statementCounter,previousStatementCounter); string currentStatementString = (*i)->unparseToString(); printf ("currentStatementString = %s \n",currentStatementString.c_str()); #endif if ( (*i == declarationStatement) && (statementCounter > previousStatementCounter) ) { // printf ("Found the declarationStatement at position (statementCounter = %d previousStatementCounter = %d) \n",statementCounter,previousStatementCounter); declarationFound = true; } else { // printf ("Not the declaration we are looking for! \n"); i++; statementCounter++; } } // Save a reference to the variable declaration that is furthest in // the source sequence so that we can append the new statement just // after it (so that variables referenced in the new statement will // be defined). if ( (statementCounter > previousStatementCounter) && ( declarationFound == true ) ) { previousStatementCounter = statementCounter; furthestDeclarationInSourceSequence = i; } #if 0 printf ("AFTER LOOP OVER STATEMENTS: previousStatementCounter = %d \n",previousStatementCounter); string lastStatementString = (*furthestDeclarationInSourceSequence)->unparseToString(); printf ("lastStatementString = %s \n",lastStatementString.c_str()); #endif } else { // If the variable is not found then insert the new statement at the front of the list #if 0 printf ("Can NOT find a valid symbol corresponding to Type = %s Variable = %s (so it is not declared in the local scope) \n", (*typeListStringElementIterator).c_str(), (*variableListStringElementIterator).c_str()); #endif // currentStatementList.push_front(*transformationStatementIterator); } #if 0 printf ("BOTTOM OF LOOP OVER VARIABLES: previousStatementCounter = %d \n",previousStatementCounter); #endif } if (statementCounter > previousStatementCounter) previousStatementCounter = statementCounter; #if 0 printf ("BOTTOM OF LOOP OVER TYPES: previousStatementCounter = %d \n",previousStatementCounter); #endif #if 0 printf ("Exiting in insertSourceCode(): transformationStatementIterator loop (type = %s) ... \n",(*typeListStringElementIterator).c_str()); ROSE_ABORT(); #endif } #if 0 printf ("Exiting in loop insertSourceCode (type = %s) ... \n",(*typeListStringElementIterator).c_str()); ROSE_ABORT(); #endif // Now append the new statement AFTER the declaration that we have found // currentStatementList.insert(*targetDeclarationStatementIterator,*transformationStatementIterator); // currentStatementList.insert(lastStatementIterator,*transformationStatementIterator); #if 1 // printf ("BEFORE ADDING NEW STATEMENT: previousStatementCounter = %d \n",previousStatementCounter); if (previousStatementCounter == 0) { printf ("##### Prepend new statement to the top of the local scope \n"); // currentStatementList.push_front(*transformationStatementIterator); currentBlock->prepend_statement (*transformationStatementIterator); } else { // printf ("##### Append the new statement after the last position where a dependent variable is declared in the local scope \n"); // Use new function added to append/prepend at a specified location in the list of statements currentBlock->append_statement (furthestDeclarationInSourceSequence,*transformationStatementIterator); } #else SgStatementPtrList::iterator tempIterator = furthestDeclarationInSourceSequence; tempIterator++; // Handle the case of appending at the end of the list if ( tempIterator == currentStatementList.end() ) { currentBlock->append_statement (*transformationStatementIterator); } else { currentBlock->insert_statement (tempIterator,*transformationStatementIterator); } #endif } else { // This statement has no type information (so it has no dependence upon any non-primative type) // "int x;" would be an example of a statement that would not generate a type (though perhaps it should?) // printf ("This statement has no type information (so it has no dependence upon any non-primative type) \n"); // So this statment can be places at the front of the list of statements in this block // *** Note that we can't use the STL function directly since it does not set the parent information *** // currentStatementList.push_front(*transformationStatementIterator); currentBlock->insert_statement (currentStatementList.begin(),*transformationStatementIterator); } #if 0 string bottomUnparsedDeclarationCodeString = (*transformationStatementIterator)->unparseToString(); ROSE_ASSERT (bottomUnparsedDeclarationCodeString.c_str() != NULL); printf ("bottomUnparsedDeclarationCodeString = %s \n",bottomUnparsedDeclarationCodeString.c_str()); #endif } #if 0 printf ("Exiting in insertSourceCode(): case of locateNewCodeAtTop == true ... \n"); ROSE_ABORT(); #endif } else { // Put the new statements at the end of the list (traverse the new statements from first to last) // But put it before any return statement! So find the last statement! SgStatementPtrList::iterator lastStatement = currentStatementList.begin(); bool foundEndOfList = false; while ( (foundEndOfList == false) && (lastStatement != currentStatementList.end()) ) { SgStatementPtrList::iterator tempStatement = lastStatement; tempStatement++; if (tempStatement == currentStatementList.end()) foundEndOfList = true; else lastStatement++; } ROSE_ASSERT ( *lastStatement != NULL ); // printf ("(*lastStatement)->sage_class_name() = %s \n",(*lastStatement)->sage_class_name()); // printf ("Insert new statements at the bottom of the block \n"); SgStatementPtrList::iterator transformationStatementIterator; for (transformationStatementIterator = newTransformationStatementListPtr->begin(); transformationStatementIterator != newTransformationStatementListPtr->end(); transformationStatementIterator++) { // If there is a RETURN_STMT in the block then insert the new statement just before the // existing RETURN_STMT if ( (*lastStatement)->variant() == RETURN_STMT) { // printf ("Backing away from the end of the list to find the last non-return statement \n"); // lastStatement--; currentBlock->insert_statement(lastStatement,*transformationStatementIterator); } else { currentStatementList.push_back(*transformationStatementIterator); } } } // printf ("$CLASSNAME::insertSourceCode taking (SgProject,char*,char*) not implemented yet! \n"); // ROSE_ABORT(); }