Exemple #1
0
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);
  }
}
Exemple #2
0
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";
}