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 OfflineTransData::printTransRec(TransID transId, const PerfEventsMap<TransID>& transStats) { const TransRec* tRec = getTransRec(transId); std::cout << folly::format( "Translation {} {{\n" " src.md5 = {}\n" " src.funcId = {}\n" " src.funcName = {}\n" " src.resumed = {}\n" " src.bcStartOffset = {}\n" " src.guards = {}\n", tRec->id, tRec->md5, tRec->src.funcID(), tRec->funcName, tRec->src.resumed(), tRec->src.offset(), tRec->guards.size()); for (auto& guard : tRec->guards) { std::cout << " " << guard << '\n'; } std::cout << folly::format( " kind = {}\n" " isLLVM = {:d}\n" " hasLoop = {:d}\n" " aStart = {}\n" " aLen = {:#x}\n" " coldStart = {}\n" " coldLen = {:#x}\n" " frozenStart = {}\n" " frozenLen = {:#x}\n", show(tRec->kind), tRec->isLLVM, tRec->hasLoop, tRec->aStart, tRec->aLen, tRec->acoldStart, tRec->acoldLen, tRec->afrozenStart, tRec->afrozenLen); if (transCounters[transId]) { std::cout << folly::format( " prof-counters = {}\n", transCounters[transId]); } transStats.printEventsHeader(transId); std::cout << "}\n\n"; }