std::string show(const RegionDesc::Block& b) { std::string ret{"Block "}; folly::toAppend( b.func()->fullName()->data(), '@', b.start().offset(), " length ", b.length(), '\n', &ret ); auto const& tpRange = b.typePreds(); auto tpIter = begin(tpRange); auto skIter = b.start(); for (int i = 0; i < b.length(); ++i) { while (tpIter != end(tpRange) && tpIter->first < skIter) { ++tpIter; } while (tpIter != end(tpRange) && tpIter->first == skIter) { folly::toAppend(" predict: ", show(tpIter->second), "\n", &ret); ++tpIter; } folly::toAppend( " ", skIter.offset(), " ", instrToString(b.unit()->at(skIter.offset()), b.unit()), '\n', &ret ); skIter.advance(b.unit()); } return ret; }
void printInstr(const Unit* unit, PC pc) { std::cout << " " << std::setw(4) << (pc - unit->entry()) << ":" << (isCF(pc) ? "C":" ") << (isTF(pc) ? "T":" ") << (isFF(pc) ? "F":" ") << std::setw(3) << instrLen(pc) << " " << instrToString(pc, unit) << std::endl; }
void printInstr(const Unit* unit, PC pc) { Opcode* op = (Opcode*)pc; std::cout << " " << std::setw(4) << (pc - unit->entry()) << ":" << (isCF(pc) ? "C":" ") << (isTF(pc) ? "T":" ") << (isFF(pc) ? "F":" ") << std::setw(3) << instrLen(op) << " " << instrToString(op, unit) << std::endl; }
void sktrace(SrcKey sk, const char *fmt, ...) { if (!Trace::enabled) return; auto inst = instrToString((Op*)sk.unit()->at(sk.offset())); Trace::trace("%s: %20s ", show(sk).c_str(), inst.c_str()); va_list a; va_start(a, fmt); Trace::vtrace(fmt, a); va_end(a); }
std::string show(const RegionDesc::Block& b) { std::string ret{"Block "}; folly::toAppend(b.id(), ' ', b.func()->fullName()->data(), '@', b.start().offset(), b.start().resumed() ? "r" : "", " length ", b.length(), " initSpOff ", b.initialSpOffset().offset, " inlineLevel ", b.inlineLevel(), '\n', &ret ); auto typePreds = makeMapWalker(b.typePreds()); auto byRefs = makeMapWalker(b.paramByRefs()); auto refPreds = makeMapWalker(b.reffinessPreds()); auto knownFuncs= makeMapWalker(b.knownFuncs()); auto skIter = b.start(); const Func* topFunc = nullptr; for (int i = 0; i < b.length(); ++i) { while (typePreds.hasNext(skIter)) { folly::toAppend(" predict: ", show(typePreds.next()), "\n", &ret); } while (refPreds.hasNext(skIter)) { folly::toAppend(" predict reffiness: ", show(refPreds.next()), "\n", &ret); } std::string knownFunc; if (knownFuncs.hasNext(skIter)) { topFunc = knownFuncs.next(); } if (topFunc) { const char* inlined = ""; if (i == b.length() - 1 && b.inlinedCallee()) { assertx(topFunc == b.inlinedCallee()); inlined = " (call is inlined)"; } knownFunc = folly::format(" (top func: {}{})", topFunc->fullName()->data(), inlined).str(); } else { assertx((i < b.length() - 1 || !b.inlinedCallee()) && "inlined FCall without a known funcd"); } std::string byRef; if (byRefs.hasNext(skIter)) { byRef = folly::format(" (passed by {})", byRefs.next() ? "reference" : "value").str(); } std::string instrString; folly::toAppend(instrToString((Op*)b.unit()->at(skIter.offset()), b.unit()), byRef, &instrString); folly::toAppend( " ", skIter.offset(), " ", knownFunc.empty() ? instrString : folly::format("{:<40}", instrString).str(), knownFunc, "\n", &ret ); skIter.advance(b.unit()); } folly::toAppend(show(b.postConds()), &ret); return ret; }
void Unit::prettyPrint(std::ostream &out, size_t startOffset, size_t stopOffset) const { std::map<Offset,const Func*> funcMap; for (FuncRange fr(funcs()); !fr.empty();) { const Func* f = fr.popFront(); funcMap[f->base()] = f; } for (PreClassPtrVec::const_iterator it = m_preClasses.begin(); it != m_preClasses.end(); ++it) { Func* const* methods = (*it)->methods(); size_t const numMethods = (*it)->numMethods(); for (size_t i = 0; i < numMethods; ++i) { funcMap[methods[i]->base()] = methods[i]; } } std::map<Offset,const Func*>::const_iterator funcIt = funcMap.lower_bound(startOffset); const uchar* it = &m_bc[startOffset]; int prevLineNum = -1; MetaHandle metaHand; while (it < &m_bc[stopOffset]) { ASSERT(funcIt == funcMap.end() || funcIt->first >= offsetOf(it)); if (funcIt != funcMap.end() && funcIt->first == offsetOf(it)) { out.put('\n'); funcIt->second->prettyPrint(out); ++funcIt; } int lineNum = getLineNumber(offsetOf(it)); if (lineNum != prevLineNum) { out << " // line " << lineNum << std::endl; prevLineNum = lineNum; } out << " " << std::setw(4) << (it - m_bc) << ": "; out << instrToString((Opcode*)it, (Unit*)this); if (metaHand.findMeta(this, offsetOf(it))) { out << " #"; Unit::MetaInfo info; while (metaHand.nextArg(info)) { int arg = info.m_arg & ~MetaInfo::VectorArg; const char *argKind = info.m_arg & MetaInfo::VectorArg ? "M" : ""; switch (info.m_kind) { case Unit::MetaInfo::DataType: out << " i" << argKind << arg << ":t=" << (int)info.m_data; break; case Unit::MetaInfo::String: { const StringData* sd = this->lookupLitstrId(info.m_data); out << " i" << argKind << arg << ":s=" << std::string(sd->data(), sd->size()); break; } case Unit::MetaInfo::Class: { const StringData* sd = this->lookupLitstrId(info.m_data); out << " i" << argKind << arg << ":c=" << sd->data(); break; } case Unit::MetaInfo::NopOut: out << " Nop"; break; case Unit::MetaInfo::GuardedThis: out << " GuardedThis"; break; case Unit::MetaInfo::None: ASSERT(false); break; } } } out << std::endl; it += instrLen((Opcode*)it); } }
std::string NormalizedInstruction::toString() const { return instrToString((Op*)pc(), unit()); }
std::string show(const RegionDesc::Block& b) { std::string ret{"Block "}; folly::toAppend(b.id(), ' ', b.func()->fullName()->data(), '@', b.start().offset(), b.start().resumed() ? "r" : "", " length ", b.length(), " initSpOff ", b.initialSpOffset().offset, " profTransID ", b.profTransID(), '\n', &ret ); auto& predictions = b.typePredictions(); auto& preconditions = b.typePreConditions(); auto byRefs = makeMapWalker(b.paramByRefs()); auto& refPreds = b.reffinessPreds(); auto knownFuncs = makeMapWalker(b.knownFuncs()); auto skIter = b.start(); const Func* topFunc = nullptr; for (auto const& p : predictions) { folly::toAppend(" predict: ", show(p), "\n", &ret); } for (auto const& p : preconditions) { folly::toAppend(" precondition: ", show(p), "\n", &ret); } for (auto const& rp : refPreds) { folly::toAppend(" predict reffiness: ", show(rp), "\n", &ret); } for (int i = 0; i < b.length(); ++i) { std::string knownFunc; if (knownFuncs.hasNext(skIter)) { topFunc = knownFuncs.next(); } if (topFunc) { const char* inlined = ""; knownFunc = folly::format(" (top func: {}{})", topFunc->fullName(), inlined).str(); } std::string byRef; if (byRefs.hasNext(skIter)) { byRef = folly::format(" (passed by {})", byRefs.next() ? "reference" : "value").str(); } std::string instrString; folly::toAppend(instrToString(b.unit()->at(skIter.offset()), b.unit()), byRef, &instrString); folly::toAppend( " ", skIter.offset(), " ", knownFunc.empty() ? instrString : folly::format("{:<40}", instrString).str(), knownFunc, "\n", &ret ); skIter.advance(b.unit()); } folly::toAppend(show(b.postConds()), &ret); return ret; }
std::string SrcKey::showInst() const { return instrToString(reinterpret_cast<const Op*>(unit()->at(offset()))); }
std::string SrcKey::showInst() const { auto const u = unit(); return instrToString(u->at(offset()), u); }