void Analysis::CallPath:: noteStaticStructureOnLeaves(Prof::CallPath::Profile& prof) { const Prof::Struct::Root* rootStrct = prof.structure()->root(); Prof::CCT::ANodeIterator it(prof.cct()->root(), NULL/*filter*/, true/*leavesOnly*/, IteratorStack::PreOrder); for (Prof::CCT::ANode* n = NULL; (n = it.current()); ++it) { Prof::CCT::ADynNode* n_dyn = dynamic_cast<Prof::CCT::ADynNode*>(n); if (n_dyn) { Prof::LoadMap::LMId_t lmId = n_dyn->lmId(); // ok if LoadMap::LMId_NULL Prof::LoadMap::LM* loadmap_lm = prof.loadmap()->lm(lmId); const string& lm_nm = loadmap_lm->name(); const Prof::Struct::LM* lmStrct = rootStrct->findLM(lm_nm); DIAG_Assert(lmStrct, "failed to find Struct::LM: " << lm_nm); VMA lm_ip = n_dyn->lmIP(); const Prof::Struct::ACodeNode* strct = lmStrct->findByVMA(lm_ip); DIAG_Assert(strct, "Analysis::CallPath::noteStaticStructureOnLeaves: failed to find structure for: " << n_dyn->toStringMe(Prof::CCT::Tree::OFlg_DebugAll)); n->structure(strct); } } }
void Analysis::CallPath::pruneStructTree(Prof::CallPath::Profile& prof) { // ------------------------------------------------------- // Prune Struct::Tree based on CallPath::Profile::StructMetricIdFlg // // Defer this until the end so that we keep the minimal // Struct::Tree. Note that this should almost certainly come after // all uses of noteStaticStructureOnLeaves(). // ------------------------------------------------------- noteStaticStructure(prof); Prof::Struct::Root* rootStrct = prof.structure()->root(); rootStrct->aggregateMetrics(Prof::CallPath::Profile::StructMetricIdFlg); rootStrct->pruneByMetrics(); }
void Analysis::CallPath:: overlayStaticStructureMain(Prof::CallPath::Profile& prof, string agent, bool doNormalizeTy) { const Prof::LoadMap* loadmap = prof.loadmap(); Prof::Struct::Root* rootStrct = prof.structure()->root(); std::string errors; // ------------------------------------------------------- // Overlay static structure. N.B. To process spurious samples, // iteration includes LoadMap::LMId_NULL // ------------------------------------------------------- for (Prof::LoadMap::LMId_t i = Prof::LoadMap::LMId_NULL; i <= loadmap->size(); ++i) { Prof::LoadMap::LM* lm = loadmap->lm(i); if (lm->isUsed()) { try { const string& lm_nm = lm->name(); Prof::Struct::LM* lmStrct = Prof::Struct::LM::demand(rootStrct, lm_nm); Analysis::CallPath::overlayStaticStructureMain(prof, lm, lmStrct); } catch (const Diagnostics::Exception& x) { errors += " " + x.what() + "\n"; } } } if (!errors.empty()) { DIAG_EMsg("Cannot fully process samples because of errors reading load modules:\n" << errors); } // ------------------------------------------------------- // Basic normalization // ------------------------------------------------------- if (doNormalizeTy) { coalesceStmts(prof); } applyThreadMetricAgents(prof, agent); }