void Visitor::visit(SgNode* n) { SgFunctionDefinition* functionDefinition = isSgFunctionDefinition(n); if (functionDefinition != NULL) { SgTreeCopy tc; #if 1 std::string functionDefinitionString = functionDefinition->unparseToString(); printf ("(before copy) functionDefinitionString = %s \n",functionDefinitionString.c_str()); #endif #if 1 SgFunctionDefinition* copy = isSgFunctionDefinition(n->copy(tc)); ROSE_ASSERT (copy != NULL); #if 1 functionDefinitionString = functionDefinition->unparseToString(); printf ("(after copy) functionDefinitionString = %s \n",functionDefinitionString.c_str()); #endif SgFunctionDeclaration* parentScope = isSgFunctionDeclaration(functionDefinition->get_parent()); ROSE_ASSERT (parentScope); copy->set_parent(parentScope); #endif } }
int main(int argc, char * argv[]) { // Build the AST used by ROSE project = frontend(argc,argv); /*convertToOMPNormalForm(project, project); // Run internal consistancy tests on AST AstTests::runAllTests(project); Rose_STL_Container<SgNode*> functions = NodeQuery::querySubTree(project, V_SgFunctionDefinition); for (Rose_STL_Container<SgNode*>::const_iterator i = functions.begin(); i != functions.end(); ++i) { SgFunctionDefinition* func = isSgFunctionDefinition(*i); ROSE_ASSERT(func); printf("func = %s\n", func->unparseToString().c_str()); // output the CFG to a file ofstream fileCFG; fileCFG.open((func->get_declaration()->get_name().getString()+"_cfg.dot").c_str()); cout << " writing to file "<<(func->get_declaration()->get_name().getString()+"_cfg.dot")<<"\n"; cfgToDot(fileCFG, func->get_declaration()->get_name(), func->cfgForBeginning()); fileCFG.close(); } backend(project);*/ //generatePDF ( *project ); // find a declaration for foo() Rose_STL_Container<SgNode*> funcDecls = NodeQuery::querySubTree(project, V_SgFunctionDeclaration); for(Rose_STL_Container<SgNode*>::iterator it = funcDecls.begin(); it!=funcDecls.end(); it++) { SgFunctionDeclaration* decl = isSgFunctionDeclaration(*it); ROSE_ASSERT(decl); if(decl->get_name().getString() == "foo") { fooDecl = decl; break; } } if(!fooDecl) { printf("ERROR: could not find declaration of function foo()!\n"); numFails++; } testParsing(); convertToOMPNormalForm(project, project); testOMPForSensitiveInsertion(); AstTests::runAllTests(project); insertTopBottomOmpDirectives(project, ompUtils::omp_critical, true, &fooCallStmtCreate); insertTopBottomOmpDirectives(project, ompUtils::omp_single, false, &fooCallStmtCreate); // Run internal consistancy tests on AST // // Generate the CFGs of all the functions to ensure that all CFG data is good Rose_STL_Container<SgNode*> functions = NodeQuery::querySubTree(project, V_SgFunctionDefinition); for (Rose_STL_Container<SgNode*>::const_iterator i = functions.begin(); i != functions.end(); ++i) { SgFunctionDefinition* func = isSgFunctionDefinition(*i); ROSE_ASSERT(func); printf("func = %s\n", func->unparseToString().c_str()); // output the CFG to a file ofstream fileCFG; fileCFG.open((func->get_declaration()->get_name().getString()+"_cfg.dot").c_str()); cout << " writing to file "<<(func->get_declaration()->get_name().getString()+"_cfg.dot")<<"\n"; cfgToDot(fileCFG, func->get_declaration()->get_name(), func->cfgForBeginning()); fileCFG.close(); } backend(project); system("diff rose_test_example.c test_example.valid_rose_output.c > selfTest.out"); struct stat file; stat("selfTest.out",&file); if(file.st_size!=0) { printf("Error: found differences between rose_test_example.c and the canonical test_example.valid_rose_output.c! Details in selfTest.out.\n"); numFails++; } if(numFails==0) cout << "PASSED\n"; else cout << "FAILED!\n"; }