#include "ProfiledBinary.h"
#include "ErrorHandling.h"
#include "MissingFrameInferrer.h"
#include "ProfileGenerator.h"
#include "llvm/DebugInfo/Symbolize/SymbolizableModule.h"
#include "llvm/Demangle/Demangle.h"
#include "llvm/IR/DebugInfoMetadata.h"
#include "llvm/MC/TargetRegistry.h"
#include "llvm/Object/COFF.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/Format.h"
#include "llvm/Support/TargetSelect.h"
#include "llvm/TargetParser/Triple.h"
#include <optional>
#define DEBUG_TYPE …
usingnamespacellvm;
usingnamespacesampleprof;
cl::opt<bool> ShowDisassemblyOnly("show-disassembly-only",
cl::desc("Print disassembled code."));
cl::opt<bool> ShowSourceLocations("show-source-locations",
cl::desc("Print source locations."));
static cl::opt<bool>
ShowCanonicalFnName("show-canonical-fname",
cl::desc("Print canonical function name."));
static cl::opt<bool> ShowPseudoProbe(
"show-pseudo-probe",
cl::desc("Print pseudo probe section and disassembled info."));
static cl::opt<bool> UseDwarfCorrelation(
"use-dwarf-correlation",
cl::desc("Use dwarf for profile correlation even when binary contains "
"pseudo probe."));
static cl::opt<std::string>
DWPPath("dwp", cl::init(""),
cl::desc("Path of .dwp file. When not specified, it will be "
"<binary>.dwp in the same directory as the main binary."));
static cl::list<std::string> DisassembleFunctions(
"disassemble-functions", cl::CommaSeparated,
cl::desc("List of functions to print disassembly for. Accept demangled "
"names only. Only work with show-disassembly-only"));
static cl::opt<bool>
KernelBinary("kernel",
cl::desc("Generate the profile for Linux kernel binary."));
extern cl::opt<bool> ShowDetailedWarning;
extern cl::opt<bool> InferMissingFrames;
namespace llvm {
namespace sampleprof {
static const Target *getTarget(const ObjectFile *Obj) { … }
void BinarySizeContextTracker::addInstructionForContext(
const SampleContextFrameVector &Context, uint32_t InstrSize) { … }
uint32_t
BinarySizeContextTracker::getFuncSizeForContext(const ContextTrieNode *Node) { … }
void BinarySizeContextTracker::trackInlineesOptimizedAway(
MCPseudoProbeDecoder &ProbeDecoder) { … }
void BinarySizeContextTracker::trackInlineesOptimizedAway(
MCPseudoProbeDecoder &ProbeDecoder,
const MCDecodedPseudoProbeInlineTree &ProbeNode,
ProbeFrameStack &ProbeContext) { … }
ProfiledBinary::ProfiledBinary(const StringRef ExeBinPath,
const StringRef DebugBinPath)
: … { … }
ProfiledBinary::~ProfiledBinary() { … }
void ProfiledBinary::warnNoFuncEntry() { … }
void ProfiledBinary::load() { … }
bool ProfiledBinary::inlineContextEqual(uint64_t Address1, uint64_t Address2) { … }
SampleContextFrameVector
ProfiledBinary::getExpandedContext(const SmallVectorImpl<uint64_t> &Stack,
bool &WasLeafInlined) { … }
template <class ELFT>
void ProfiledBinary::setPreferredTextSegmentAddresses(const ELFFile<ELFT> &Obj,
StringRef FileName) { … }
void ProfiledBinary::setPreferredTextSegmentAddresses(const COFFObjectFile *Obj,
StringRef FileName) { … }
void ProfiledBinary::setPreferredTextSegmentAddresses(const ObjectFile *Obj) { … }
void ProfiledBinary::checkPseudoProbe(const ELFObjectFileBase *Obj) { … }
void ProfiledBinary::decodePseudoProbe(const ELFObjectFileBase *Obj) { … }
void ProfiledBinary::decodePseudoProbe() { … }
void ProfiledBinary::setIsFuncEntry(FuncRange *FuncRange,
StringRef RangeSymName) { … }
bool ProfiledBinary::dissassembleSymbol(std::size_t SI, ArrayRef<uint8_t> Bytes,
SectionSymbolsTy &Symbols,
const SectionRef &Section) { … }
void ProfiledBinary::setUpDisassembler(const ObjectFile *Obj) { … }
void ProfiledBinary::disassemble(const ObjectFile *Obj) { … }
void ProfiledBinary::checkUseFSDiscriminator(
const ObjectFile *Obj, std::map<SectionRef, SectionSymbolsTy> &AllSymbols) { … }
void ProfiledBinary::populateElfSymbolAddressList(
const ELFObjectFileBase *Obj) { … }
void ProfiledBinary::loadSymbolsFromDWARFUnit(DWARFUnit &CompilationUnit) { … }
void ProfiledBinary::loadSymbolsFromDWARF(ObjectFile &Obj) { … }
void ProfiledBinary::populateSymbolListFromDWARF(
ProfileSymbolList &SymbolList) { … }
symbolize::LLVMSymbolizer::Options ProfiledBinary::getSymbolizerOpts() const { … }
SampleContextFrameVector ProfiledBinary::symbolize(const InstructionPointer &IP,
bool UseCanonicalFnName,
bool UseProbeDiscriminator) { … }
void ProfiledBinary::computeInlinedContextSizeForRange(uint64_t RangeBegin,
uint64_t RangeEnd) { … }
void ProfiledBinary::computeInlinedContextSizeForFunc(
const BinaryFunction *Func) { … }
void ProfiledBinary::inferMissingFrames(
const SmallVectorImpl<uint64_t> &Context,
SmallVectorImpl<uint64_t> &NewContext) { … }
InstructionPointer::InstructionPointer(const ProfiledBinary *Binary,
uint64_t Address, bool RoundToNext)
: … { … }
bool InstructionPointer::advance() { … }
bool InstructionPointer::backward() { … }
void InstructionPointer::update(uint64_t Addr) { … }
}
}