// To improve the default output add additional information here // Note you need to add "\\n" for newline string AstDOTGeneration::additionalNodeInfo(SgNode* node) { ostringstream ss; ss << "\\n"; // print number of max successors (= container size) AstSuccessorsSelectors::SuccessorsContainer c; AstSuccessorsSelectors::selectDefaultSuccessors(node,c); ss << c.size() << "\\n"; // add memory location of node to dot output ss << node << "\\n"; // DQ (8/31/2013): Added more information about the IR node to the dot graph. ss << sourcePositionInformation(node); // DQ (9/19/2013): Added more information about the IR node to the dot graph (comments and C preprocessor directive information). ss << commentAndCppInformation(node); // DQ (7/4/2008): Added support for output of information about attributes AstAttributeMechanism* astAttributeContainer = node->get_attributeMechanism(); if (astAttributeContainer != NULL) { ss << "Attribute list (size=" << astAttributeContainer->size() << "):" << "\\n"; for (AstAttributeMechanism::iterator i = astAttributeContainer->begin(); i != astAttributeContainer->end(); i++) { // pair<std::string,AstAttribute*> AstAttribute* attribute = i->second; ROSE_ASSERT(attribute != NULL); // Note cast to void* std::string name = i->first; std::string label = name + " : " + attribute->toString(); ss << label << "\\n"; } ss << "\\n"; ss << "\\n"; } return ss.str(); }
Detection_SynthesizedAttribute DetectionTraversal::evaluateSynthesizedAttribute (SgNode* astNode, Detection_InheritedAttribute inheritedAttribute, SubTreeSynthesizedAttributes synthesizedAttributeList ) { ROSE_ASSERT(astNode != NULL); Detection_SynthesizedAttribute return_synthesizedAttribute(astNode); #if 1 printf ("In evaluateSynthesizedAttribute(): astNode = %p = %s synthesizedAttributeList.size() = %zu dslChildren.size() = %zu \n", astNode,astNode->class_name().c_str(),synthesizedAttributeList.size(),return_synthesizedAttribute.dslChildren.size()); #endif // At each IR node and across all children, accumulate the dslChildren (child nodes for each of the DSL AST nodes). for (SubTreeSynthesizedAttributes::iterator i = synthesizedAttributeList.begin(); i != synthesizedAttributeList.end(); i++) { SgNode* childNode = (*i).node; // ROSE_ASSERT(childNode != NULL); if (childNode != NULL) { #if 0 printf ("Identified child node in evaluateSynthesizedAttribute(): childNode = %p = %s \n",childNode,childNode->class_name().c_str()); #endif // Insert each list from the child into the accumulated list in the current Synthesized Attribute. return_synthesizedAttribute.dslChildren.insert(return_synthesizedAttribute.dslChildren.end(),i->dslChildren.begin(),i->dslChildren.end()); #if 0 printf (" --- copying i->dslChildren.size() = %zu into return_synthesizedAttribute.dslChildren.size() = %zu \n",i->dslChildren.size(),return_synthesizedAttribute.dslChildren.size()); #endif if (return_synthesizedAttribute.dslChildren.empty() == false) { #if 0 printf ("In evaluateSynthesizedAttribute(): dslChildren.size() = %zu \n",return_synthesizedAttribute.dslChildren.size()); #endif } } else { #if 1 printf ("childNode == NULL \n"); #endif } } // Recognition of other control statements (e.g. for loops for the stencil evaluation) or expression/statement abstractions (e.g. function calls) // Note: DSL specific control abstractions might be recognised as loops containing DSL abstractions and having constant evaluatable base and bounds. // For any DSL specific AST nodes (C++ AST nodes containing a DSL_Attribute), initialize the pointers to children of the DSL IR node. AstAttributeMechanism* astAttributeContainer = astNode->get_attributeMechanism(); if (astAttributeContainer != NULL) { #if 1 printf ("In evaluateSynthesizedAttribute(): found a attribute on astNode = %p = %s \n",astNode,astNode->class_name().c_str()); #endif // I think there should only be one DSL attribute, in the future we can support more on a single IR node. if (astAttributeContainer->size() != 1) { printf ("WARNING: astAttributeContainer->size() != 1: astAttributeContainer->size() = %zu \n",astAttributeContainer->size()); } #if 1 // DQ: Allow this for the moment while testing. ROSE_ASSERT(astAttributeContainer->size() == 1); #endif // Loop over all the attributes at this IR node // Pei-Hung (12/22/15): THe ASTAttributeMechanmsim is changed and has to use new API // for (AstAttributeMechanism::iterator i = astAttributeContainer->begin(); i != astAttributeContainer->end(); i++) BOOST_FOREACH (const std::string &attributeName, astAttributeContainer->getAttributeIdentifiers()) { AstAttribute* attribute = astNode->getAttribute(attributeName); ROSE_ASSERT(attribute != NULL); #if 1 // DSL_Attribute* dslAstAttribute = dynamic_cast<DSL_Attribute*>(attribute); dsl_attribute* dslAstAttribute = dynamic_cast<dsl_attribute*>(attribute); ROSE_ASSERT(dslAstAttribute != NULL); #if 1 printf ("Identified dslAstAttribute in evaluateSynthesizedAttribute(): astNode = %p = %s \n",astNode,astNode->class_name().c_str()); printf (" --- return_synthesizedAttribute.dslChildren.size() = %zu \n",return_synthesizedAttribute.dslChildren.size()); #endif // Copy the dsl child data to the dsl attribute. dslAstAttribute->currentNode = astNode; dslAstAttribute->dslChildren = return_synthesizedAttribute.dslChildren; #endif } // Clear the dsl attributes becasue we the only collect dsl child attributes at dsl attributed IR nodes and don't pass then further up the tree. return_synthesizedAttribute.dslChildren.clear(); // Add the current node since it has an attribute. return_synthesizedAttribute.dslChildren.push_back(astNode); #if 0 printf ("Exiting as a test! \n"); ROSE_ASSERT(false); #endif }