void printTopBytecodes(const OfflineTransData* tdata, OfflineCode* olCode, const PerfEventsMap<TCA>& samples, PerfEventType etype, ExtOpcode filterBy) { always_assert(etype < NUM_EVENT_TYPES); AddrToTransFragmentMapper mapper(tdata, filterBy); PerfEventsMap<TransFragment> tfragPerfEvents = samples.mapTo(mapper); std::vector<std::pair<uint64_t, TransFragment> > ranking; PerfEventsMap<TransFragment>::const_iterator it; for (it = tfragPerfEvents.begin(); it != tfragPerfEvents.end(); it++) { ranking.push_back(std::make_pair(it->second[etype], it->first)); } sort(ranking.rbegin(), ranking.rend()); for (size_t i = 0; i < ranking.size(); i++) { const TransFragment& tfrag = ranking[i].second; const TransRec* trec = tdata->getTransRec(tfrag.tid); Unit* unit = g_repo->getUnit(trec->md5); always_assert(unit); printf("\n====================\n"); printf("{\n"); printf(" FuncID = %u\n", trec->src.funcID()); printf(" TransID = %u\n", tfrag.tid); tfragPerfEvents.printEventsHeader(tfrag); printf("}\n\n"); printf("----------\n%s: main\n----------\n", olCode->getArchName()); olCode->printDisasm(tfrag.aStart, tfrag.aLen, trec->bcMapping, samples, hostOpcodes); printf("----------\n%s: cold\n----------\n", olCode->getArchName()); olCode->printDisasm(tfrag.acoldStart, tfrag.acoldLen, trec->bcMapping, samples, hostOpcodes); printf("----------\n%s: frozen\n----------\n", olCode->getArchName()); olCode->printDisasm(tfrag.afrozenStart, tfrag.afrozenLen, trec->bcMapping, samples, hostOpcodes); } }
void printBytecodeStats(const OfflineTransData* tdata, const PerfEventsMap<TCA>& events, PerfEventType etype) { if (!g_repo) error("printBytecodeStats: null repo"); if (!tdata) error("printBytecodeStats: null g_transData"); AddrToBcMapper bcMapper(tdata); PerfEventsMap<ExtOpcode> bcPerfEvents = events.mapTo(bcMapper); std::map<ExtOpcode,std::string> opcodeToName; PerfEventsMap<ExtOpcode>::const_iterator it; for (it = bcPerfEvents.begin(); it != bcPerfEvents.end(); it++) { opcodeToName[it->first] = extOpcodeToString(it->first); } bcPerfEvents.printEventsSummary(etype, "Opcode", PerfEventsMap<ExtOpcode>::kAllEntries, verboseStats, helpersMinPercentage, opcodeToName); }