88 #define INIT_LM_INDEX 2 107 " i=\"" << next_index++ << "\"" 109 #define NUMBER(label, num) \ 110 " " << label << "=\"" << num << "\"" 112 #define STRING(label, str) \ 113 " " << label << "=\"" << xml::EscapeStr(str) << "\"" 115 #define VRANGE(vma, len) \ 116 " v=\"{[0x" << hex << vma << "-0x" << vma + len << dec << ")}\"" 121 for (
int n = 1;
n <= depth;
n++) {
173 *os <<
"<?xml version=\"1.0\"?>\n" 174 <<
"<!DOCTYPE HPCToolkitStructure [\n" 177 <<
"<HPCToolkitStructure i=\"0\" version=\"4.7\" n=\"\">\n";
180 *gaps <<
"This file describes the unclaimed vma ranges (gaps) in the control\n" 181 <<
"flow graph for the following file. This is mostly for debugging and\n" 182 <<
"improving ParseAPI.\n\n" 196 *os <<
"</HPCToolkitStructure>\n";
279 printProc(ostream * os, ostream * gaps,
string gaps_file,
311 doGaps(os, gaps, gaps_file, finfo, ginfo, pinfo);
331 doGaps(ostream * os, ostream * gaps,
string gaps_file,
338 *gaps <<
"\nfunc: " << pinfo->
prettyName <<
"\n" 339 <<
"link: " << pinfo->
linkName <<
"\n" 341 <<
"0x" << hex << ginfo->
start <<
"--0x" << ginfo->
end << dec <<
"\n\n";
362 for (
auto git = ginfo->
gapSet.begin(); git != ginfo->
gapSet.end(); ++git) {
363 long start = git->beg();
364 long end = git->end();
365 long len = end - start;
367 *gaps <<
"gap: 0x" << hex << start <<
"--0x" << end
368 << dec <<
" (" << len <<
")\n";
414 for (
auto sit = root->
stmtMap.begin(); sit != root->
stmtMap.end(); ++sit) {
426 if (ait != alienMap.end()) {
443 for (
auto lit = root->
loopList.begin(); lit != root->
loopList.end(); ++lit) {
454 if (ait != alienMap.end()) {
475 for (
auto nit = alienMap.begin(); nit != alienMap.end(); ++nit) {
478 long base_index = nit->first;
479 ScopeInfo alien_scope(file_index, base_index);
509 for (
auto nit = root->
nodeMap.begin(); nit != root->
nodeMap.end(); ++nit) {
539 doTreeNode(os, depth + 2, subtree, subscope, strTab);
558 LineNumberMap lineMap;
561 for (
auto sit = node->
stmtMap.begin(); sit != node->
stmtMap.end(); ++sit) {
565 auto mit = lineMap.find(sinfo->
line_num);
566 if (mit != lineMap.end()) {
577 for (
auto mit = lineMap.begin(); mit != lineMap.end(); ++mit) {
578 long line = mit->first;
585 <<
" v=\"" << vset->
toString() <<
"\"" 599 for (
auto lit = node->
loopList.begin(); lit != node->
loopList.end(); ++lit) {
633 const long max_line = LONG_MAX;
646 for (
auto nit = node->
nodeMap.begin(); nit != node->
nodeMap.end(); ++nit) {
657 for (
auto lit = node->
loopList.begin(); lit != node->
loopList.end(); ++lit) {
668 for (
auto sit = node->
stmtMap.begin(); sit != node->
stmtMap.end(); ++sit) {
685 for (
auto nit = node->
nodeMap.begin(); nit != node->
nodeMap.end(); ++nit) {
694 for (
auto lit = node->
loopList.begin(); lit != node->
loopList.end(); ++lit) {
709 for (
auto sit = node->
stmtMap.begin(); sit != node->
stmtMap.end(); ++sit) {
map< long, TreeNode * > AlienMap
void printProc(ostream *os, ostream *gaps, string gaps_file, FileInfo *finfo, GroupInfo *ginfo, ProcInfo *pinfo, HPC::StringTable &strTab)
map< long, VMAIntervalSet * > LineNumberMap
void printStructFileEnd(ostream *os, ostream *gaps)
long str2index(const std::string &str)
static void doStmtList(ostream *, int, TreeNode *)
void printLoadModuleBegin(ostream *os, string lmName)
#define STRING(label, str)
static void doLoopList(ostream *, int, TreeNode *, HPC::StringTable &)
ScopeInfo(long file, long base, long line=0)
void printVariable(ostream *os, FileInfo *finfo, VariableInfo vinfo)
void printLoadModuleEnd(ostream *os)
void printFileBegin(ostream *os, FileInfo *finfo)
static void doTreeNode(ostream *, int, TreeNode *, ScopeInfo, HPC::StringTable &)
const std::string & index2str(long index)
std::pair< iterator, bool > insert(const VMA beg, const VMA end)
std::string toString() const
void printFileEnd(ostream *os, FileInfo *finfo)
static void doIndent(ostream *os, int depth)
#define NUMBER(label, num)
static void doGaps(ostream *, ostream *, string, FileInfo *, GroupInfo *, ProcInfo *)
void printStructFileBegin(ostream *os, ostream *gaps, string filenm)
string basename(const char *fName)
static void locateTree(TreeNode *, ScopeInfo &, HPC::StringTable &, bool=false)
<!-- ********************************************************************--> n<!-- HPCToolkit Experiment DTD --> n<!-- Version 2.1 --> n<!-- ********************************************************************--> n<!ELEMENT HPCToolkitExperiment(Header,(SecCallPathProfile|SecFlatProfile) *)> n<!ATTLIST HPCToolkitExperiment\n version CDATA #REQUIRED > n n<!-- ******************************************************************--> n n<!-- Info/NV:flexible name-value pairs:(n) ame;(t) ype;(v) alue --> n<!ELEMENT Info(NV *)> n<!ATTLIST Info\n n CDATA #IMPLIED > n<!ELEMENT NV EMPTY > n<!ATTLIST NV\n n CDATA #REQUIRED\n t CDATA #IMPLIED\n v CDATA #REQUIRED > n n<!-- ******************************************************************--> n<!-- Header --> n<!-- ******************************************************************--> n<!ELEMENT Header(Info *)> n<!ATTLIST Header\n n CDATA #REQUIRED > n n<!-- ******************************************************************--> n<!-- Section Header --> n<!-- ******************************************************************--> n<!ELEMENT SecHeader(MetricTable?, MetricDBTable?, TraceDBTable?, LoadModuleTable?, FileTable?, ProcedureTable?, Info *)> n n<!-- MetricTable:--> n<!ELEMENT MetricTable(Metric) * > n n<!-- Metric:(i) d;(n) ame --> n<!--(v) alue-type:transient type of values --> n<!--(t) ype:persistent type of metric --> n<!-- fmt:format;show;--> n<!ELEMENT Metric(MetricFormula *, Info?)> n<!ATTLIST Metric\n i CDATA #REQUIRED\n n CDATA #REQUIRED\n es CDATA #IMPLIED\n em CDATA #IMPLIED\n ep CDATA #IMPLIED\n v(raw|final|derived-incr|derived) \"raw\\ t (inclusive|exclusive|nil) \nil\\ partner CDATA #IMPLIED\ fmt CDATA #IMPLIED\ show (1|0) \1\\ show-percent (1|0) \1> n n<!-- MetricFormula represents derived metrics: (t)ype; (frm): formula --> n<!ELEMENT MetricFormula (Info?)> n<!ATTLIST MetricFormula\ t (combine|finalize) \finalize\\ i CDATA #IMPLIED\ frm CDATA #REQUIRED> n n<!-- Metric data, used in sections: (n)ame [from Metric]; (v)alue --> n<!ELEMENT M EMPTY> n<!ATTLIST M\ n CDATA #REQUIRED\ v CDATA #REQUIRED> n n<!-- MetricDBTable: --> n<!ELEMENT MetricDBTable (MetricDB)*> n n<!-- MetricDB: (i)d; (n)ame --> n<!-- (t)ype: persistent type of metric --> n<!-- db-glob: file glob describing files in metric db --> n<!-- db-id: id within metric db --> n<!-- db-num-metrics: number of metrics in db --> n<!-- db-header-sz: size (in bytes) of a db file header --> n<!ELEMENT MetricDB EMPTY> n<!ATTLIST MetricDB\ i CDATA #REQUIRED\ n CDATA #REQUIRED\ t (inclusive|exclusive|nil) \nil\\ partner CDATA #IMPLIED\ db-glob CDATA #IMPLIED\ db-id CDATA #IMPLIED\ db-num-metrics CDATA #IMPLIED\ db-header-sz CDATA #IMPLIED> n n<!-- TraceDBTable: --> n<!ELEMENT TraceDBTable (TraceDB)> n n<!-- TraceDB: (i)d --> n<!-- db-min-time: min beginning time stamp (global) --> n<!-- db-max-time: max ending time stamp (global) --> n<!ELEMENT TraceDB EMPTY> n<!ATTLIST TraceDB\ i CDATA #REQUIRED\ db-glob CDATA #IMPLIED\ db-min-time CDATA #IMPLIED\ db-max-time CDATA #IMPLIED\ db-header-sz CDATA #IMPLIED> n n<!-- LoadModuleTable assigns a short name to a load module --> n<!ELEMENT LoadModuleTable (LoadModule)*> n n<!ELEMENT LoadModule (Info?)> n<!ATTLIST LoadModule\ i CDATA #REQUIRED\ n CDATA #REQUIRED> n n<!-- FileTable assigns a short name to a file --> n<!ELEMENT FileTable (File)*> n n<!ELEMENT File (Info?)> n<!ATTLIST File\ i CDATA #REQUIRED\ n CDATA #REQUIRED> n n<!-- ProcedureTable assigns a short name to a procedure --> n<!ELEMENT ProcedureTable (Procedure)*> n n<!-- Info/NV: flexible name-value pairs: (n)ame; (t)ype; (v)alue --> n<!-- f: family of the procedure (fake, root, ...)--> n<!ELEMENT Procedure (Info?)> n<!ATTLIST Procedure\ i CDATA #REQUIRED\ n CDATA #REQUIRED\ f CDATA #IMPLIED> n n<!-- ****************************************************************** --> n<!-- Section: Call path profile --> n<!-- ****************************************************************** --> n<!ELEMENT SecCallPathProfile (SecHeader, SecCallPathProfileData)> n<!ATTLIST SecCallPathProfile\ i CDATA #REQUIRED\ n CDATA #REQUIRED> n n<!ELEMENT SecCallPathProfileData (PF|M)*> n<!-- Procedure frame --> n<!-- (i)d: unique identifier for cross referencing --> n<!-- (s)tatic scope id --> n<!-- (n)ame: a string or an id in ProcedureTable --> n<!-- (lm) load module: a string or an id in LoadModuleTable --> n<!-- (f)ile name: a string or an id in LoadModuleTable --> n<!-- (l)ine range: \beg-end\ (inclusive range) --> n<!-- (a)lien: whether frame is alien to enclosing P --> n<!-- (str)uct: hpcstruct node id --> n<!-- (t)ype: hpcrun node type: memory access, variable declaration, ... --> n<!-- (v)ma-range-set: \{[beg-end), [beg-end)...}\ --> n<!ELEMENT PF (PF|Pr|L|C|S|M)*> n<!ATTLIST PF\ i CDATA #IMPLIED\ s CDATA #IMPLIED\ n CDATA #REQUIRED\ lm CDATA #IMPLIED\ f CDATA #IMPLIED\ l CDATA #IMPLIED\ str CDATA #IMPLIED\ v CDATA #IMPLIED> n<!-- Procedure (static): GOAL: replace with 'P' --> n<!ELEMENT Pr (Pr|L|C|S|M)*> n<!ATTLIST Pr\ i CDATA #IMPLIED\ s CDATA #IMPLIED\ n CDATA #REQUIRED\ lm CDATA #IMPLIED\ f CDATA #IMPLIED\ l CDATA #IMPLIED\ a (1|0) \0\\ str CDATA #IMPLIED\ v CDATA #IMPLIED> n<!-- Callsite (a special StatementRange) --> n<!ELEMENT C (PF|M)*> n<!ATTLIST C\ i CDATA #IMPLIED\ s CDATA #IMPLIED\ l CDATA #IMPLIED\ str CDATA #IMPLIED\ v CDATA #IMPLIED> n n<!-- ****************************************************************** --> n<!-- Section: Flat profile --> n<!-- ****************************************************************** --> n<!ELEMENT SecFlatProfile (SecHeader, SecFlatProfileData)> n<!ATTLIST SecFlatProfile\ i CDATA #REQUIRED\ n CDATA #REQUIRED> n n<!ELEMENT SecFlatProfileData (LM|M)*> n<!-- Load module: (i)d; (n)ame; (v)ma-range-set --> n<!ELEMENT LM (F|P|M)*> n<!ATTLIST LM\ i CDATA #IMPLIED\ n CDATA #REQUIRED\ v CDATA #IMPLIED> n<!-- File --> n<!ELEMENT F (P|L|S|M)*> n<!ATTLIST F\ i CDATA #IMPLIED\ n CDATA #REQUIRED> n<!-- Procedure (Note 1) --> n<!ELEMENT P (P|A|L|S|C|M)*> n<!ATTLIST P\ i CDATA #IMPLIED\ n CDATA #REQUIRED\ l CDATA #IMPLIED\ str CDATA #IMPLIED\ v CDATA #IMPLIED> n<!-- Alien (Note 1) --> n<!ELEMENT A (A|L|S|C|M)*> n<!ATTLIST A\ i CDATA #IMPLIED\ f CDATA #IMPLIED\ n CDATA #IMPLIED\ l CDATA #IMPLIED\ str CDATA #IMPLIED\ v CDATA #IMPLIED> n<!-- Loop (Note 1,2) --> n<!ELEMENT L (A|Pr|L|S|C|M)*> n<!ATTLIST L\ i CDATA #IMPLIED\ s CDATA #IMPLIED\ l CDATA #IMPLIED\ f CDATA #IMPLIED\ str CDATA #IMPLIED\ v CDATA #IMPLIED> n<!-- Statement (Note 2) --> n<!-- (it): trace record identifier --> n<!ELEMENT S (S|M)*> n<!ATTLIST S\ i CDATA #IMPLIED\ it CDATA #IMPLIED\ s CDATA #IMPLIED\ l CDATA #IMPLIED\ str CDATA #IMPLIED\ v CDATA #IMPLIED> n<!-- Note 1: Contained Cs may not contain PFs --> n<!-- Note 2: The 's' attribute is not used for flat profiles --> n
static const char * hpcstruct_xml_head