102 #define XML_ATTR_DATA_NODE_ALLOC "d" 103 #define XML_ATTR_DATA_START_MEM "m" 149 : m_root(
NULL), m_metadata(metadata),
150 m_maxDenseId(0), m_nodeidMap(
NULL),
176 bool isPrecondition =
false;
178 &&
typeid(*y_root) ==
typeid(
CCT::Root)) {
180 isPrecondition =
true;
187 isPrecondition =
true;
194 isPrecondition =
true;
197 DIAG_Assert(isPrecondition,
"Prof::CCT::Tree::merge: Merge precondition fails!");
224 DIAG_Assert(!prunedNodes[
m_root->
id()],
"Prof::CCT::Tree::pruneCCTByNodeId(): cannot delete root!");
252 NodeIdToANodeMap::iterator it =
m_nodeidMap->find(nodeId);
260 bool areAllUnique =
true;
268 std::pair<MergeContext::CPIdSet::iterator, bool> ret =
269 cpIdSet.insert(n_dyn->
cpId());
270 bool isInserted = ret.second;
271 areAllUnique = areAllUnique && isInserted;
272 DIAG_MsgIf(!isInserted,
"CCT::Tree::verifyUniqueCPIds: Duplicate CPId: " << n_dyn->
cpId());
322 "Root",
"PF",
"Pr",
"L",
"C",
"S",
"Any" 329 return NodeNames[tp];
336 DIAG_Assert((i >= 0) && (i < TyNUMBER),
"");
354 #define dyn_cast_return(base, derived, expr) \ 355 { base* ptr = expr; \ 359 return dynamic_cast<derived*>(ptr); \ 368 while (s && s->
type() != tp) {
375 #if 0 // is this obsolete? 377 isAncestorOf(
ANode* parent,
ANode* son,
int difference)
380 while (iter && difference > 0 && iter != parent) {
384 if (iter && iter == parent) {
395 if (Parent() ==
NULL) {
446 if ( !(mBegId < mEndId) ) {
461 for (
uint mId = mBegId; mId < mEndId; ++mId) {
464 aggregateMetricsIncl(ivalset);
471 if (ivalset.empty()) {
488 ANode* n_parent =
n->parent();
490 it1 != ivalset.end(); ++it1) {
494 for (
uint mId = mBegId; mId < mEndId; ++mId) {
495 double mVal =
n->demandMetric(mId, mEndId);
508 for (
uint mId = mBegId; mId < mEndId; ++mId) {
511 aggregateMetricsExcl(ivalset);
518 if (ivalset.empty()) {
523 aggregateMetricsExcl(frame, ivalset);
541 bool isFrame = (
typeid(*n) ==
typeid(
ProcFrm));
542 bool isProc = (
typeid(*n) ==
typeid(
Proc));
544 bool isInlineMacro =
false;
545 bool isInlineCall =
false;
548 if (isProc && parent !=
NULL) {
553 if (
typeid(*parent) ==
typeid(
Proc)) {
560 bool isEmptyNameParent = strct->
name().empty();
563 bool isFullyNamed = !myprocname.empty();
565 isInlineCall = isEmptyNameParent && isFullyNamed;
567 isInlineMacro = !isInlineCall && myprocname.compare(
GUARD_NAME) == 0;
570 bool isLogicalProc = isFrame || isInlineCall || isInlineMacro;
571 AProcNode * frameNxt = (isLogicalProc) ? static_cast<AProcNode*>(n) : frame;
577 ANode* x = it.current();
584 if (
typeid(*n) ==
typeid(
CCT::Stmt) || isInlineMacro) {
588 it != ivalset.end(); ++it) {
592 for (
uint mId = mBegId; mId < mEndId; ++mId) {
595 if (frame && frame != n_parent) {
608 if ( !(mBegId < mEndId) ) {
628 for (
uint mId = mBegId; mId < mEndId; ++mId) {
631 if (mm && mm->
expr()) {
635 double val = expr->
eval(*
this);
636 demandMetric(mId, numMetrics) = val;
647 if ( !(mBegId < mEndId) ) {
665 for (
uint mId = mBegId; mId < mEndId; ++mId) {
669 if (mm && mm->
expr()) {
693 uint8_t* prunedNodes)
696 ANode* x = it.current();
704 bool isImportant =
false;
707 it1 != ivalset.end(); ++it1) {
711 for (
uint mId = mBegId; mId < mEndId; ++mId) {
718 double total = root->
metric(mId);
720 double pct = x->
metric(mId) * 100 / total;
721 if (pct >= thresholdPct) {
726 if (isImportant) {
break; }
732 if (isImportant || numIncl == 0) {
733 x->
pruneByMetrics(mMgr, ivalset, root, thresholdPct, prunedNodes);
736 deleteChaff(x, prunedNodes);
748 if (prunedNodes[x->
id()]) {
755 ANode* x_child = it.current();
757 pruneByNodeId(x_child, prunedNodes);
770 ANode* x_child = it.current();
775 if (prunedNodes[x_child->
id()]) {
789 bool x_isLeaf = x->
isLeaf();
792 bool wereAllChildrenDeleted =
true;
794 ANode* x_child = it.current();
797 wereAllChildrenDeleted = (wereAllChildrenDeleted
798 && deleteChaff(x_child, deletedNodes));
801 bool wasDeleted =
false;
802 if (wereAllChildrenDeleted) {
805 if ((x_isLeaf && !mustRetain) || !x_isLeaf) {
809 deletedNodes[x_id] = 1;
847 ANode* y_child = it.current();
849 DIAG_Assert(y_child_dyn,
"ANode::mergeDeep");
856 #define MERGE_ACTION 0 857 #define MERGE_ERROR 0 863 "CCT::ANode::mergeDeep: Adding not permitted:\n " 866 "CCT::ANode::mergeDeep: adding not permitted");
869 "CCT::ANode::mergeDeep: Adding:\n " 881 "CCT::ANode::mergeDeep: Merging x <= y:\n" 885 x_child_dyn->
mergeMe(*y_child_dyn, &mrgCtxt, x_newMetricBegIdx);
887 effctLst->push_back(effct);
890 effctLst1 = x_child_dyn->
mergeDeep(y_child, x_newMetricBegIdx, mrgCtxt,
894 if (effctLst1 && !effctLst1->empty()) {
895 effctLst->splice(effctLst->end(), *effctLst1);
915 ANode* y_child = it.current();
930 uint metricBegIdx,
bool mayConflict)
935 if ( !(x_end <= x->numMetrics()) ) {
936 ensureMetricsSize(x_end);
939 for (
uint x_i = metricBegIdx, y_i = 0; x_i < x_end; ++x_i, ++y_i) {
960 if (hasMergeEffects(*x, *y_dyn)) {
978 DIAG_Assert(mrgCtxt,
"ADynNode::mergeMe: potentially introducing cp-id conflicts; cannot verify without MergeContext!");
986 m_cpId = y_dyn->
cpId();
998 ANode* x = it.current();
1010 if (x_dyn_descendent) {
1011 return x_dyn_descendent;
1031 "CCT:ANode::mergeDeep_fixInsert: Adding:\n " 1043 effctLst->push_back(ret.
effect);
1088 string self = ANodeTyToName(type()) +
" " 1098 string self = ANodeTyToName(type()) +
" " 1099 + procName() +
" @ " 1109 string nm = procName();
1113 nm +=
" <= " + caller->
nameDyn();
1127 std::ostringstream os;
1138 self = ANodeTyToName(node_type);
1147 uint sId = (m_strct) ? m_strct->id() : 0;
1148 if (node_type == TyProcFrm || node_type == TyProc) {
1183 string nm =
"[assoc(" + assocInfo_str() +
") ip(" 1192 const char* pfx)
const 1198 o << p << assocInfo_str()
1199 << hex <<
" [ip " << m_lmIP <<
", " << dec << m_opIdx <<
"] " 1200 << hex << m_lip <<
" [lip " << lip_str() <<
"]" << dec;
1202 o << p <<
" [metrics";
1203 for (
uint i = 0; i < numMetrics(); ++i) {
1263 self +=
" lm" + lm_nm +
" f" + fnm +
" n" + pnm;
1267 if (dbg_level > 2) {
1269 self +=
" v=\"" + vma.
toString() +
"\"";
1276 if (m_hpcrun_type > 0) {
1305 self +=
" lm" + lm_nm +
" f" + fnm +
" n" + pnm;
1308 if (dbg_level > 2) {
1310 self +=
" v=\"" + vma.
toString() +
"\"";
1313 self =
self +
" a=\"1\"";
1332 if (dbg_level > 2) {
1334 self +=
" v=\"" + vma.
toString() +
"\"";
1350 self +=
" n=\"" + nameDyn() +
"\"";
1354 if (dbg_level > 2) {
1356 self +=
" v=\"" + vma.
toString() +
"\"";
1372 if (m_node_alloc !=
NULL) {
1375 if (m_start_address > 0) {
1380 self +=
" n=\"" + nameDyn() +
"\"";
1387 if (dbg_level > 2) {
1389 self +=
" v=\"" + vma.
toString() +
"\"";
1403 uint oFlags,
const char* pfx)
const 1405 string indent =
" ";
1411 bool doPost = writeXML_pre(os, metricMgr, metricBeg, metricEnd, oFlags, pfx);
1412 string prefix = pfx + indent;
1416 n->
writeXML(os, metricMgr, metricBeg, metricEnd, oFlags, prefix.c_str());
1419 writeXML_post(os, oFlags, pfx);
1429 uint oFlags,
const char* pfx)
const 1431 string indent =
" ";
1437 ANode *parent = this->parent();
1439 parent->
writeXML_path(os, metricMgr, metricBeg, metricEnd, oFlags, pfx);
1442 writeXML_pre(os, metricMgr, metricBeg, metricEnd, oFlags, pfx);
1481 uint oFlags,
const char* pfx)
const 1483 bool doTag = (type() != TyRoot);
1485 ? isLeaf() && hasMetrics(metricBeg, metricEnd)
1486 : hasMetrics(metricBeg, metricEnd));
1487 bool isXMLLeaf = isLeaf() && !doMetrics;
1492 os << pfx <<
"<" << toStringMe(oFlags) <<
"/>\n";
1495 os << pfx <<
"<" << toStringMe(oFlags) <<
">\n";
1501 writeMetricsXML(os, metricMgr, metricBeg, metricEnd, oFlags, pfx);
1511 const char* pfx)
const 1518 os << pfx <<
"</" << ANodeTyToName(type()) <<
">\n";
1536 if (x->
isLeaf()) {
return -1; }
1537 else if (y->
isLeaf()) {
return 1; }
std::ostream & writeXML(std::ostream &os, const Metric::Mgr *metricMgr, uint metricBeg=Metric::IData::npos, uint metricEnd=Metric::IData::npos, uint oFlags=0, const char *pfx="") const
Struct::ACodeNode * structure() const
Metric::AExpr * expr() const
void aggregateMetricsIncl(uint mBegId, uint mEndId)
static uint getLoadModuleFromMap(uint lm_id)
virtual MergeEffect mergeMe(const ANode &y, MergeContext *mrgCtxt=NULL, uint metricBegIdx=0, bool mayConflict=true)
void pruneByMetrics(const Metric::Mgr &mMgr, const VMAIntervalSet &ivalset, const ANode *root, double thresholdPct, uint8_t *prunedNodes=NULL)
virtual std::string toStringMe(uint oFlags=0) const
std::list< MergeEffect > * mergeDeep(ANode *y, uint x_numMetrics, MergeContext &mrgCtxt, uint oFlag=0)
static struct perf_mem_metric metric
virtual std::string toStringMe(uint oFlags=0) const
static ANodeTy IntToANodeType(long i)
CCT::ADynNode * findDynChild(const ADynNode &y_dyn)
My_t::const_iterator const_iterator
int find(char s1[], char s2[])
string toStr(const int x, int base)
static bool hpcrun_fmt_doRetainId(uint32_t id)
static uint getProcIdFromMap(uint proc_id)
virtual double evalNF(Metric::IData &mdata) const
std::list< MergeEffect > MergeEffectList
void computeMetricsIncrMe(const Metric::Mgr &mMgr, uint mBegId, uint mEndId, Metric::AExprIncr::FnTy fn)
virtual double combine(Metric::IData &mdata) const =0
SrcFile::ln endLine() const
static bool deleteChaff(ANode *x, uint8_t *deletedNodes=NULL)
static bool isMergable(const ADynNode &x, const ADynNode &y)
ANode * findNode(uint nodeId) const
#define dyn_cast_return(base, derived, expr)
int Diagnostics_GetDiagnosticFilterLevel()
static uint getFileIdFromMap(uint file_id)
std::string nameDyn() const
double metric(size_t mId) const
Call * ancestorCall() const
const StringSet & traceFileNameSet() const
virtual std::string toStringMe(uint oFlags=0) const
bool writeXML_pre(std::ostream &os, const Metric::Mgr *metricMgr, uint metricBeg=Metric::IData::npos, uint metricEnd=Metric::IData::npos, uint oFlags=0, const char *pfx="") const
void ddump(const Metric::Mgr *metricMgr) const
void pruneChildrenByNodeId(const uint8_t *prunedNodes)
bool isPrimarySynthRoot() const
static void pruneByNodeId(ANode *&x, const uint8_t *prunedNodes)
void zeroMetrics(uint mBegId, uint mEndId)
std::string procNameDbg() const
void insertMetricsBefore(size_t numMetrics)
void computeMetrics(const Metric::Mgr &mMgr, uint mBegId, uint mEndId, bool doFinal)
int compare(SrcFile::ln x, SrcFile::ln y)
void writeDyn(std::ostream &os, uint oFlags=0, const char *prefix="") const
const char * lush_assoc_info_sprintf(char *str, lush_assoc_info_t as_info)
Proc * ancestorProc() const
virtual double accumulate(Metric::IData &mdata) const =0
std::string MakeAttrStr(const char *x, int flags=ESC_TRUE)
virtual double finalize(Metric::IData &mdata) const =0
#define DIAG_MsgIf(ifexpr,...)
const char * lush_lip_sprintf(char *str, const lush_lip_t *x)
std::string lip_str() const
static bool hpcrun_fmt_node_type_root(uint16_t type)
static int cmpByStructureInfo(const void *x, const void *y)
uint makeDensePreorderIds(uint nextId)
#define XML_ATTR_DATA_START_MEM
virtual std::string toString(const Metric::Mgr *metricMgr, uint oFlags=0, const char *pfx="") const
std::string assocInfo_str() const
MergeContext::pair ensureUniqueCPId(uint curId)
static uint s_nextUniqueId
virtual std::string codeName() const
#define LUSH_LIP_STR_MIN_LEN
MergeEffectList * merge(const Tree *y, uint x_newMetricBegIdx, uint mrgFlag=0, uint oFlag=0)
void adump(const Metric::Mgr *metricMgr) const
virtual std::string toStringMe(uint oFlags=0) const
void zeroMetricsDeep(uint mBegId, uint mEndId)
std::ostream & dump(const Metric::Mgr *metricMgr, std::ostream &os=std::cerr, uint oFlags=0) const
static const std::string NodeNames[TyNUMBER]
virtual MergeEffect mergeMe(const ANode &y, MergeContext *mrgCtxt=NULL, uint metricBegIdx=0, bool mayConflict=true)
std::ostream & writeXML_path(std::ostream &os, const Metric::Mgr *metricMgr, uint metricBeg=Metric::IData::npos, uint metricEnd=Metric::IData::npos, uint oFlags=0, const char *pfx="") const
std::map< uint, ANode * > NodeIdToANodeMap
void ddump(const Metric::Mgr *metricMgr) const
virtual double eval(const Metric::IData &mdata) const =0
ANode * ancestor(ANodeTy tp) const
void computeMetricsIncr(const Metric::Mgr &mMgr, uint mBegId, uint mEndId, Metric::AExprIncr::FnTy fn)
const CallPath::Profile * m_metadata
virtual const std::string & name() const
int ANodeLineComp(ANode *x, ANode *y)
virtual double initializeSrc(Metric::IData &mdata) const =0
std::ostream & dump(const Metric::Mgr *metricMgr, std::ostream &os=std::cerr, uint oFlags=0, const char *pfx="") const
std::pair< iterator, bool > insert(const VMA beg, const VMA end)
std::string toString() const
ProcFrm * ancestorProcFrm() const
std::string toString(const char *pfx="") const
const char * DIAG_UnexpectedInput
void aggregateMetricsExcl(uint mBegId, uint mEndId)
std::map< uint, uint > m_mapProcIDs
double demandMetric(size_t mId, size_t size=0) const
const CallPath::Profile * metadata() const
uint makeDensePreorderIds()
#define XML_ATTR_DATA_NODE_ALLOC
virtual std::string toStringMe(uint oFlags=0) const
virtual std::string codeName() const
virtual std::string toStringMe(uint oFlags=0) const
Tree(const CallPath::Profile *metadata)
virtual std::string toStringMe(uint oFlags=0) const
std::string MakeAttrNum(int x)
bool doPropagateEffects()
Stmt * ancestorStmt() const
void pruneCCTByNodeId(const uint8_t *prunedNodes)
Metric::ADesc * metric(uint i)
Root * ancestorRoot() const
std::ostream & writeXML(std::ostream &os, const Metric::Mgr *metricMgr, uint metricBeg=Metric::IData::npos, uint metricEnd=Metric::IData::npos, uint oFlags=0) const
void computeMetricsMe(const Metric::Mgr &mMgr, uint mBegId, uint mEndId, bool doFinal)
#define LUSH_ASSOC_INFO_STR_MIN_LEN
SrcFile::ln begLine() const
<!-- ********************************************************************--> 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
MergeContext * m_mergeCtxt
static const std::string & ANodeTyToName(ANodeTy tp)
virtual NonUniformDegreeTreeNode * Current() const
Loop * ancestorLoop() const
MergeEffectList * mergeDeep_fixInsert(int newMetrics, MergeContext &mrgCtxt)
void writeXML_post(std::ostream &os, uint oFlags=0, const char *pfx="") const
Metric::AExprIncr * expr() const
MergeEffect merge(ANode *y)
virtual double initialize(Metric::IData &mdata) const =0
NodeIdToANodeMap * m_nodeidMap
std::map< uint, uint > m_mapFileIDs
#define HPCRUN_FMT_CCTNodeId_NULL
std::map< uint, uint > m_pairFakeLoadModule
virtual NonUniformDegreeTreeNode * Current() const