Program Listing for File AstDOTGeneration.h#
↰ Return to documentation for file (src/midend/astDump/AstDOTGeneration.h)
// Author: Markus Schordan
// $Id: AstDOTGeneration.h,v 1.4 2008/01/08 02:56:38 dquinlan Exp $
#ifndef ASTDOTGENERATION_H
#define ASTDOTGENERATION_H
#include <set>
#include "DOTGeneration.h"
#include "roseInternal.h"
//#include "sage3.h"
class ROSE_DLL_API AstDOTGeneration : public DOTGeneration<SgNode*>
{
public:
//traverse full AST , nodes which represent code from include files . name postfix does not need an ending "."
void generate(SgProject* node, traversalType tt=TOPDOWNBOTTOMUP, std::string filenamePostfix="");
void generate(SgNode* node, std::string filename, traversalType tt = TOPDOWNBOTTOMUP,std::string filenamePostfix = "");
void generate(SgProject* project, std::string const & filename);
// DQ (12/20/2018): Added support to exclude template instantiations to make the graphs more tractable within large C++ applications.
// traverse the subtree of AST which represents the files specified on the command line
void generateInputFiles(SgProject* node, traversalType tt=TOPDOWNBOTTOMUP, std::string filenamePostfix="", bool excludeTemplateInstantiations = false);
// only the nodes which represent code of the same file as the start node
void generateWithinFile(SgFile* node, traversalType tt=TOPDOWNBOTTOMUP, std::string filenamePostfix="");
void writeIncidenceGraphToDOTFile(SgIncidenceDirectedGraph* graph, const std::string& filename);
void addAdditionalNodesAndEdges(SgNode* node);
protected:
virtual DOTInheritedAttribute evaluateInheritedAttribute(SgNode* node, DOTInheritedAttribute ia);
virtual DOTSynthesizedAttribute evaluateSynthesizedAttribute(SgNode* node, DOTInheritedAttribute ia, SubTreeSynthesizedAttributes l);
std::string additionalNodeInfo(SgNode* node);
// DQ (11/1/2003) added mechanism to add node options (to add color, etc.)
std::string additionalNodeOptions(SgNode* node);
// DQ (3/5/2007) added mechanism to add edge options (to add color, etc.)
std::string additionalEdgeInfo(SgNode* from, SgNode* to, std::string label);
// DQ (3/5/2007) added mechanism to add edge options (to add color, etc.)
std::string additionalEdgeOptions(SgNode* from, SgNode* to, std::string label);
// DQ (7/27/2008): Added support to eliminate IR nodes in DOT graphs
// (to tailor the presentation of information about ASTs).
bool commentOutNodeInGraph(SgNode* node);
bool skip_write_during_traversal{false};
};
namespace AstDOTGenerationExtended_Defaults
{
struct ROSE_DLL_API NamedExtraNodeInfo
{
#if 1
// DQ (6/25/2011): Put the function definition into the source file (avoid function definitions in header files).
std::string operator()(SgNode* node);
#else
// std::string AstDOTGenerationExtended_Defaults::NamedExtraNodeInfo::operator()(SgNode* node)
std::string operator()(SgNode* node)
{
std::ostringstream ss;
// add namespace name
if (SgNamespaceDeclarationStatement* n = isSgNamespaceDeclarationStatement(node))
{
ss << n->get_qualified_name().str() << "\\n";
}
// add class name
if (SgClassDeclaration* n = isSgClassDeclaration(node))
{
ss << n->get_qualified_name().str() << "\\n";
}
// add function name
if (SgFunctionDeclaration* n = isSgFunctionDeclaration(node))
{
ss << n->get_qualified_name().str() << "\\n";
}
if (SgFunctionRefExp* n = isSgFunctionRefExp(node))
{
SgFunctionDeclaration* decl = n->getAssociatedFunctionDeclaration();
if (decl) // it's null if through a function pointer
{
ss << decl->get_qualified_name().str() << "\\n";
}
}
// add variable name
if (SgInitializedName* n = isSgInitializedName(node))
{
ss << n->get_qualified_name().str() << "\\n";
}
if (SgVarRefExp* n = isSgVarRefExp(node))
{
SgVariableSymbol* sym = n->get_symbol();
ss << sym->get_name().getString() << "\\n";
}
// add variable name
if (SgVariableSymbol* n = isSgVariableSymbol(node))
{
ss << n->get_name().str() << "\\n";
}
return ss.str();
}
#endif
};
struct AddressExtraNodeInfo
{
std::string operator()(SgNode* node)
{
std::ostringstream ss;
ss << node << "\\n";
return ss.str();
}
};
struct ContainerSizeExtraNodeInfo
{
std::string operator()(SgNode* node)
{
std::ostringstream ss;
// print number of max successors (= container size)
AstSuccessorsSelectors::SuccessorsContainer c;
AstSuccessorsSelectors::selectDefaultSuccessors(node,c);
ss << c.size() << "\\n";
return ss.str();
}
};
struct ROSE_DLL_API LValueExtraNodeInfo
{
#if 1
// DQ (6/25/2011): Put the function definition into the source file (avoid function definitions in header files).
std::string operator()(SgNode* node);
#else
// std::string AstDOTGenerationExtended_Defaults::LValueExtraNodeInfo::operator()(SgNode* node)
std::string operator()(SgNode* node)
{
std::ostringstream ss;
// adds whether or not it is an l-value
if (SgExpression* n = isSgExpression(node))
{
ss << (n->isLValue() ? "L-Value" : "!L-Value") << "\\n";
}
return ss.str();
}
#endif
};
struct ROSE_DLL_API TypeExtraNodeInfo
{
#if 1
// DQ (6/25/2011): Put the function definition into the source file (avoid function definitions in header files).
std::string operator()(SgNode* node);
#else
// std::string AstDOTGenerationExtended_Defaults::TypeExtraNodeInfo::operator()(SgNode* node)
std::string operator()(SgNode* node)
{
std::ostringstream ss;
if (SgExpression* n = isSgExpression(node))
{
ss << n->get_type()->unparseToString() << "\\n";
}
return ss.str();
}
#endif
};
struct DefaultExtraNodeInfo
{
std::string operator()(SgNode* node)
{
ContainerSizeExtraNodeInfo cs;
NamedExtraNodeInfo name;
AddressExtraNodeInfo add;
return std::string("\\n") + cs(node) + name(node) + add(node);
}
};
struct DefaultExtraNodeOptions
{
std::string operator()(SgNode*)
{
return std::string();
}
};
struct DefaultExtraEdgeInfo
{
std::string operator()(SgNode*/*from*/, SgNode*/*to*/, std::string /*label*/)
{
return std::string();
}
};
struct DefaultExtraEdgeOptions
{
std::string operator()(SgNode*/*node*/, SgNode*/*to*/, std::string /*label*/)
{
return std::string();
}
};
}
// King84 (14/7/2010) added mechanism to customize node options on demand
// Note: aditionalEdgeInfo andadditionalEdgeOptions are inherited.
// Note: EdgeInfo and EdgeOptions are not used because they come into play
// for functions in the base class which are not virtual.
template <typename ExtraNodeInfo_t = AstDOTGenerationExtended_Defaults::DefaultExtraNodeInfo,
typename ExtraNodeOptions_t = AstDOTGenerationExtended_Defaults::DefaultExtraNodeOptions,
typename ExtraEdgeInfo_t = AstDOTGenerationExtended_Defaults::DefaultExtraEdgeInfo,
typename ExtraEdgeOptions_t = AstDOTGenerationExtended_Defaults::DefaultExtraEdgeOptions>
class AstDOTGenerationExtended : public AstDOTGeneration
{
protected:
ExtraNodeInfo_t eni;
ExtraNodeOptions_t eno;
ExtraEdgeInfo_t eei;
ExtraEdgeOptions_t eeo;
public:
AstDOTGenerationExtended(ExtraNodeInfo_t eni_ = ExtraNodeInfo_t(), ExtraNodeOptions_t eno_ = ExtraNodeOptions_t(), ExtraEdgeInfo_t eei_ = ExtraEdgeInfo_t(), ExtraEdgeOptions_t eeo_ = ExtraEdgeOptions_t())
: eni(eni_), eno(eno_), eei(eei_), eeo(eeo_)
{ }
// virtual DOTInheritedAttribute evaluateInheritedAttribute(SgNode* node, DOTInheritedAttribute ia);
virtual DOTSynthesizedAttribute evaluateSynthesizedAttribute(SgNode* node, DOTInheritedAttribute ia, SubTreeSynthesizedAttributes l);
};
#endif