Jump to content

ROSE Compiler Framework/Tutorial

From Wikibooks, open books for an open world

Debugging SgNodes

[edit | edit source]
SgNode* node = /* initialized */; node->variantT() // Get node type as Enumeration getVariantName(node->variantT()) // Get as string SageInterface::get_name(...) // Get a useful name to describe the SgNode 

From rose-public@nersc.gov mailing list (https://mailman.nersc.gov/pipermail/rose-public/2012-August/001786.html)

unparseToString() needs full scope information to work properly (thinking about C++ name qualification and other nasty things) It does fail on dangling AST pieces. A workaround it is 1)to call it AFTER the AST pieces are attached to somewhere. 2) call other member functions like ->class_name(), ->get_name() etc for debugging. We had discussion to relax it to handle partial AST. But it never made into our priority list." 

Filtering SgNodes

[edit | edit source]

Check if an SgNode is in a user-specified location (function not defined in ROSE API yet; you need to implement yourself):

 bool  IsNodeInUserLocation(const SgLocatedNode *const node, const std::string& path)  {  std::string filename = node->getFilenameString();    StringUtility::FileNameClassification file_classification =  StringUtility::classifyFileName(filename, path);  StringUtility::FileNameLocation file_location =  file_classification.getLocation();    return StringUtility::FILENAME_LOCATION_USER == file_location;  } 

Check if an SgNode is NOT in a user-specified location (function not defined in ROSE API yet; you need to implement yourself:

 bool IsNodeNotInUserLocation(const SgNode* node)  {  const SgLocatedNode* located_node = isSgLocatedNode(node);  if (located_node != NULL)  {  return ! IsNodeInUserLocation(  located_node,  source_directory);  }  else  {  return true;  }  }; 

Get all SgFunctionDeclaration nodes in a user-specified location:

 // Function Declarations  // Use NodeQuery to grab all SgFunctionDeclaration nodes  SgProject * project = <initialize>;  static Rose_STL_Container<SgNode*> function_decls =  NodeQuery::querySubTree(project,  V_SgFunctionDeclaration);  // Create iterators  Rose_STL_Container<SgNode*>::iterator ibegin_function_decls =  function_decls.begin();  Rose_STL_Container<SgNode*>::iterator iend_function_decls =  function_decls.end();  // Remove SgFunctionDeclaration nodes that aren't in the  // user-specified location  iend_function_decls =  remove_if(ibegin_function_decls,  iend_function_decls,  IsNodeNotInUserLocation);  // Check what we've found...  for ( ;  ibegin_function_decls != iend_function_decls;  ++ibegin_function_decls)  {  std::cout << (*ibegin_function_decls)->unparseToString() << std::endl;  } 

Traversing files

[edit | edit source]

Traverse only the named input file(s) (excluding header files) using traverseInputFiles:

int main(int argc, char** argv) {  SgProject* project = new SgProject(argc, argv);  Traversal traversal; // you need to define this  traversal.traverseInputFiles(project);  return 0; } 

Generating DOT files

[edit | edit source]

utility_functions.h defines generateDOT(SgProject* project).

Processing Custom Commandline Options

[edit | edit source]

TODO: