43#define DEBUG_TYPE "CodeViewReader" 
   47#define SYMBOL_RECORD(EnumName, EnumVal, Name)                                 \ 
   50#include "llvm/DebugInfo/CodeView/CodeViewSymbols.def" 
 
   59#define RETURN_CASE(Enum, X, Ret)                                              \ 
   65#define CV_REGISTERS_ARM 
   66#define CV_REGISTER(name, val) RETURN_CASE(RegisterId, name, #name) 
   67#include "llvm/DebugInfo/CodeView/CodeViewRegisters.def" 
   69#undef CV_REGISTERS_ARM 
   76#define CV_REGISTERS_ARM64 
   77#define CV_REGISTER(name, val) RETURN_CASE(RegisterId, name, #name) 
   78#include "llvm/DebugInfo/CodeView/CodeViewRegisters.def" 
   80#undef CV_REGISTERS_ARM64 
   87#define CV_REGISTERS_X86 
   88#define CV_REGISTER(name, val) RETURN_CASE(RegisterId, name, #name) 
   89#include "llvm/DebugInfo/CodeView/CodeViewRegisters.def" 
   91#undef CV_REGISTERS_X86 
   97  return "formatUnknownEnum(Id)";
 
 
  106  StringRef &Symbol = RelocSym ? *RelocSym : SymStorage;
 
  107  if (!resolveSymbolName(CoffSection, RelocOffset, Symbol))
 
  117  StringRef &Symbol = RelocSym ? *RelocSym : SymStorage;
 
  118  if (resolveSymbolName(CoffSection, RelocOffset, Symbol))
 
 
  123LVCodeViewReader::getFileNameForFileOffset(
uint32_t FileOffset,
 
  135  if (!CVFileChecksumTable.
valid() || !CVStringTable.
valid())
 
  139      CVFileChecksumTable.
getArray().
at(FileOffset);
 
  142  if (Iter == CVFileChecksumTable.
end())
 
  151Error LVCodeViewReader::printFileNameForOffset(StringRef 
Label,
 
  153                                               const SymbolGroup *SG) {
 
  154  Expected<StringRef> NameOrErr = getFileNameForFileOffset(FileOffset, SG);
 
  157  W.printHex(
Label, *NameOrErr, FileOffset);
 
  161void LVCodeViewReader::cacheRelocations() {
 
  162  for (
const SectionRef &Section : getObj().
sections()) {
 
  163    const coff_section *CoffSection = getObj().getCOFFSection(Section);
 
  165    auto &
RM = RelocMap[CoffSection];
 
  169    llvm::sort(RM, [](RelocationRef L, RelocationRef R) {
 
  170      return L.getOffset() < 
R.getOffset();
 
  177Error LVCodeViewReader::resolveSymbol(
const coff_section *CoffSection,
 
  178                                      uint64_t 
Offset, SymbolRef &Sym) {
 
  179  const auto &Relocations = RelocMap[CoffSection];
 
  181  for (
const RelocationRef &Relocation : Relocations) {
 
  182    uint64_t RelocationOffset = Relocation.getOffset();
 
  184    if (RelocationOffset == 
Offset) {
 
  185      SymI = Relocation.getSymbol();
 
  189  if (SymI == getObj().symbol_end())
 
  192  return ErrorSuccess();
 
  197Error LVCodeViewReader::resolveSymbolName(
const coff_section *CoffSection,
 
  200  if (
Error E = resolveSymbol(CoffSection, 
Offset, Symbol))
 
  202  Expected<StringRef> NameOrErr = 
Symbol.getName();
 
  206  return ErrorSuccess();
 
  216  auto Starts = [=](
const char *
Pattern) -> 
bool {
 
  219  auto CheckExclude = [&]() -> 
bool {
 
  220    if (Starts(
"__") || Starts(
"_PMD") || Starts(
"_PMFN"))
 
  224    if (
Find(
"_CatchableType") || 
Find(
"_TypeDescriptor"))
 
  226    if (
Find(
"Intermediate\\vctools"))
 
  228    if (
Find(
"$initializer$") || 
Find(
"dynamic initializer"))
 
  230    if (
Find(
"`vftable'") || 
Find(
"_GLOBAL__sub"))
 
  234  bool Excluded = CheckExclude();
 
  236    Element->setIsSystem();
 
 
  241Error LVCodeViewReader::collectInlineeInfo(
 
  250      if (
Error Err = printFileNameForOffset(
"FileID", FileOffset, SG))
 
  254      if (
Lines.hasExtraFiles()) {
 
  258          if (
Error Err = printFileNameForOffset(
"FileID", FID, SG))
 
  264      return NameOrErr.takeError();
 
  271Error LVCodeViewReader::traverseInlineeLines(StringRef Subsection) {
 
  273  DebugInlineeLinesSubsectionRef Lines;
 
  274  if (
Error E = Lines.initialize(SR))
 
  277  return collectInlineeInfo(Lines);
 
  280Error LVCodeViewReader::createLines(
 
  282    uint32_t Segment, uint32_t Begin, uint32_t 
Size, uint32_t NameIndex,
 
  283    const SymbolGroup *SG) {
 
  285    uint32_t End = Begin + 
Size;
 
  286    W.getOStream() << 
formatv(
"{0:x-4}:{1:x-8}-{2:x-8}\n", Segment, Begin, End);
 
  293    LineInfo LI(
Line.Flags);
 
  297          "{0} {1:x-8}\n", 
utostr(LI.getStartLine()),
 
  304    LVLineDebug *LineDebug = createLineDebug();
 
  307    LineDebug->setAddress(
Address + Addendum);
 
  309    if (LI.isAlwaysStepInto())
 
  310      LineDebug->setIsAlwaysStepInto();
 
  311    else if (LI.isNeverStepInto())
 
  312      LineDebug->setIsNeverStepInto();
 
  314      LineDebug->setLineNumber(LI.getStartLine());
 
  316    if (LI.isStatement())
 
  317      LineDebug->setIsNewStatement();
 
  319    Expected<StringRef> NameOrErr = getFileNameForFileOffset(NameIndex, SG);
 
  322    LineDebug->setFilename(*NameOrErr);
 
  328Error LVCodeViewReader::initializeFileAndStringTables(
 
  329    BinaryStreamReader &Reader) {
 
  331         (!CVFileChecksumTable.valid() || !CVStringTable.valid())) {
 
  334    uint32_t SubType, SubSectionSize;
 
  347    case DebugSubsectionKind::FileChecksums:
 
  348      if (
Error E = CVFileChecksumTable.initialize(ST))
 
  351    case DebugSubsectionKind::StringTable:
 
  352      if (
Error E = CVStringTable.initialize(ST))
 
  359    uint32_t PaddedSize = 
alignTo(SubSectionSize, 4);
 
  360    if (
Error E = Reader.
skip(PaddedSize - SubSectionSize))
 
  370    W.printNumber(
"Age", TS.
getAge());
 
  371    W.printString(
"Name", TS.
getName());
 
  374  SmallString<128> ServerName(TS.
getName());
 
  376  if (BuffOrErr.getError()) {
 
  381    if (BuffOrErr.getError()) {
 
  384                               "File '%s' does not exist.",
 
  388  MemBuffer = std::move(BuffOrErr.get());
 
  392         "Invalid PDB file.");
 
  398  PdbSession.reset(
static_cast<NativeSession *
>(Session.release()));
 
  399  PDBFile &
Pdb = PdbSession->getPDBFile();
 
  404  Expected<InfoStream &> expectedInfo = 
Pdb.getPDBInfoStream();
 
  405  if (!expectedInfo || expectedInfo->getGuid() != TS.
getGuid())
 
  411  TypeServer = std::make_shared<InputFile>(&
Pdb);
 
  412  LogicalVisitor.setInput(TypeServer);
 
  414  LazyRandomTypeCollection &Types = types();
 
  415  LazyRandomTypeCollection &Ids = ids();
 
  416  if (
Error Err = traverseTypes(
Pdb, Types, Ids))
 
  432  if (BuffOrErr.getError()) {
 
  435    if (BuffOrErr.getError()) {
 
  438                               "File '%s' does not exist.",
 
  442  MemBuffer = std::move(BuffOrErr.get());
 
  444  Expected<std::unique_ptr<Binary>> BinOrErr = 
createBinary(*MemBuffer);
 
  447                             "Binary object format in '%s' is not supported.",
 
  455  Builder = std::make_unique<AppendingTypeTableBuilder>(BuilderAllocator);
 
  460  for (
const SectionRef &Section : Obj.
sections()) {
 
  461    Expected<StringRef> SectionNameOrErr = 
Section.getName();
 
  462    if (!SectionNameOrErr)
 
  464    if (*SectionNameOrErr == 
".debug$P") {
 
  465      Expected<StringRef> DataOrErr = 
Section.getContents();
 
  474      ReaderPrecomp = std::make_unique<BinaryStreamReader>(
 
  477          ReaderPrecomp->readArray(CVTypesPrecomp, ReaderPrecomp->getLength()));
 
  482        ArrayRef<uint8_t> TypeData = 
Type.data();
 
  483        if (
Type.kind() == LF_ENDPRECOMP) {
 
  484          EndPrecompRecord EndPrecomp = 
cantFail(
 
  490        Builder->insertRecordBytes(TypeData);
 
  500    ArrayRef<uint8_t> TypeData = 
Type.
data();
 
  501    if (
Type.kind() != LF_PRECOMP)
 
  502      Builder->insertRecordBytes(TypeData);
 
  506  Builder->ForEachRecord(
 
  507      [&](TypeIndex TI, 
const CVType &
Type) { TypeArray.push_back(
Type); });
 
  511  ItemStream->setItems(TypeArray);
 
  512  TypeStream.setUnderlyingStream(*ItemStream);
 
  515      std::make_shared<LazyRandomTypeCollection>(TypeStream, TypeArray.size());
 
  518  LogicalVisitor.setInput(PrecompHeader);
 
  520  LazyRandomTypeCollection &Types = types();
 
  521  LazyRandomTypeCollection &Ids = ids();
 
  523                    LogicalVisitor.getShared());
 
  527Error LVCodeViewReader::traverseTypeSection(StringRef SectionName,
 
  528                                            const SectionRef &Section) {
 
  530    ListScope 
D(
W, 
"CodeViewTypes");
 
  531    W.printNumber(
"Section", SectionName, getObj().
getSectionID(Section));
 
  534  Expected<StringRef> DataOrErr = 
Section.getContents();
 
  536    return DataOrErr.takeError();
 
  551  if (FirstType->kind() == LF_TYPESERVER2) {
 
  554    return loadTypeServer(TS);
 
  559  if (FirstType->kind() == LF_PRECOMP) {
 
  562    return loadPrecompiledObject(Precomp, CVTypes);
 
  565  LazyRandomTypeCollection &Types = types();
 
  566  LazyRandomTypeCollection &Ids = ids();
 
  567  Types.reset(*DataOrErr, 100);
 
  569                    LogicalVisitor.getShared());
 
  573Error LVCodeViewReader::traverseTypes(PDBFile &
Pdb,
 
  577  auto VisitTypes = [&](LazyRandomTypeCollection &Types,
 
  578                        LazyRandomTypeCollection &Ids,
 
  581                      LogicalVisitor.getShared());
 
  585  Expected<TpiStream &> StreamTpiOrErr = 
Pdb.getPDBTpiStream();
 
  588  TpiStream &StreamTpi = *StreamTpiOrErr;
 
  591    W.getOStream() << 
formatv(
"Showing {0:N} TPI records\n",
 
  597  Expected<TpiStream &> StreamIpiOrErr = 
Pdb.getPDBIpiStream();
 
  600  TpiStream &StreamIpi = *StreamIpiOrErr;
 
  603    W.getOStream() << 
formatv(
"Showing {0:N} IPI records\n",
 
  609Error LVCodeViewReader::traverseSymbolsSubsection(StringRef Subsection,
 
  610                                                  const SectionRef &Section,
 
  611                                                  StringRef SectionContents) {
 
  612  ArrayRef<uint8_t> BinaryData(Subsection.
bytes_begin(),
 
  621  LazyRandomTypeCollection &Types = types();
 
  622  LazyRandomTypeCollection &Ids = ids();
 
  623  SymbolVisitorCallbackPipeline Pipeline;
 
  624  SymbolDeserializer Deserializer(&VisitorDelegate,
 
  625                                  CodeViewContainer::ObjectFile);
 
  629                            &VisitorDelegate, LogicalVisitor.getShared());
 
  633  CVSymbolVisitor Visitor(Pipeline);
 
  634  return Visitor.visitSymbolStream(Symbols);
 
  637Error LVCodeViewReader::traverseSymbolSection(StringRef SectionName,
 
  638                                              const SectionRef &Section) {
 
  640    ListScope 
D(
W, 
"CodeViewDebugInfo");
 
  641    W.printNumber(
"Section", SectionName, getObj().
getSectionID(Section));
 
  644  Expected<StringRef> SectionOrErr = 
Section.getContents();
 
  646    return SectionOrErr.takeError();
 
  647  StringRef SectionContents = *SectionOrErr;
 
  648  StringRef 
Data = SectionContents;
 
  651  StringMap<StringRef> FunctionLineTables;
 
  661  if (
Error Err = initializeFileAndStringTables(FSReader))
 
  664  while (!
Data.empty()) {
 
  667    uint32_t SubType, SubSectionSize;
 
  674    SubType &= ~SubsectionIgnoreFlag;
 
  677    if (SubSectionSize > 
Data.size())
 
  679    StringRef Contents = 
Data.substr(0, SubSectionSize);
 
  683    size_t SectionOffset = 
Data.data() - SectionContents.
data();
 
  684    size_t NextOffset = SectionOffset + SubSectionSize;
 
  685    NextOffset = 
alignTo(NextOffset, 4);
 
  686    if (NextOffset > SectionContents.
size())
 
  691    case DebugSubsectionKind::Symbols:
 
  693              traverseSymbolsSubsection(Contents, Section, SectionContents))
 
  697    case DebugSubsectionKind::InlineeLines:
 
  698      if (
Error Err = traverseInlineeLines(Contents))
 
  702    case DebugSubsectionKind::Lines:
 
  708      if (
options().getGeneralCollectRanges()) {
 
  710        if (SubSectionSize < 12) {
 
  717        if (
Error Err = resolveSymbolName(getObj().getCOFFSection(Section),
 
  718                                          SectionOffset, SymbolName))
 
  722        LLVM_DEBUG({ 
W.printString(
"Symbol Name", SymbolName); });
 
  723        if (!FunctionLineTables.
try_emplace(SymbolName, Contents).second) {
 
  741  for (StringRef SymbolName : SymbolNames) {
 
  743      ListScope S(
W, 
"FunctionLineTable");
 
  744      W.printString(
"Symbol Name", SymbolName);
 
  747    BinaryStreamReader Reader(FunctionLineTables[SymbolName],
 
  750    DebugLinesSubsectionRef Lines;
 
  751    if (
Error E = Lines.initialize(Reader))
 
  769    ScopesWithRanges->
clear();
 
  770    Function->getRanges(*ScopesWithRanges);
 
  771    ScopesWithRanges->
sort();
 
  773    uint16_t Segment = Lines.header()->RelocSegment;
 
  774    uint32_t Begin = Lines.header()->RelocOffset;
 
  775    uint32_t 
Size = Lines.header()->CodeSize;
 
  776    for (
const LineColumnEntry &
Block : Lines)
 
  777      if (
Error Err = createLines(
Block.LineNumbers, Addendum, Segment, Begin,
 
  799void LVCodeViewReader::mapRangeAddress(
const ObjectFile &Obj,
 
  807  for (
const SymbolRef &Sym : Object->symbols()) {
 
  808    if (!Section.containsSymbol(Sym))
 
  818      W.
startLine() << 
"Invalid symbol name: " << Symbol.getSectionNumber()
 
  823    SymbolName = *SymNameOrErr;
 
  827          Object->getSection(Symbol.getSectionNumber());
 
  829        W.
startLine() << 
"Invalid section number: " << Symbol.getSectionNumber()
 
  846  if (
Error Err = loadTargetInfo(Obj))
 
  856  for (
const SectionRef &Section : Obj.
sections()) {
 
  857    Expected<StringRef> SectionNameOrErr = 
Section.getName();
 
  858    if (!SectionNameOrErr)
 
  862    if (*SectionNameOrErr == 
".debug$T" || *SectionNameOrErr == 
".debug$P")
 
  863      if (
Error Err = traverseTypeSection(*SectionNameOrErr, Section))
 
  868  LogicalVisitor.processNamespaces();
 
  870  for (
const SectionRef &Section : Obj.
sections()) {
 
  871    Expected<StringRef> SectionNameOrErr = 
Section.getName();
 
  872    if (!SectionNameOrErr)
 
  874    if (*SectionNameOrErr == 
".debug$S")
 
  875      if (
Error Err = traverseSymbolSection(*SectionNameOrErr, Section))
 
  880  LogicalVisitor.closeScope();
 
  883  LogicalVisitor.processFiles();
 
  886  LogicalVisitor.processLines();
 
  889  Root->transformScopedName();
 
  894  if (
Error Err = loadTargetInfo(
Pdb))
 
  897  if (!
Pdb.hasPDBTpiStream() || !
Pdb.hasPDBDbiStream())
 
  902  if (!ExePath.empty()) {
 
  903    ErrorOr<std::unique_ptr<MemoryBuffer>> BuffOrErr =
 
  905    if (BuffOrErr.getError()) {
 
  907                               "File '%s' does not exist.", ExePath.c_str());
 
  909    BinaryBuffer = std::move(BuffOrErr.get());
 
  914           "Invalid PECOFF executable file.");
 
  916    Expected<std::unique_ptr<Binary>> BinOrErr =
 
  920                               "Binary object format in '%s' is not supported.",
 
  923    BinaryExecutable = std::move(*BinOrErr);
 
  924    if (COFFObjectFile *COFFObject =
 
  946  LazyRandomTypeCollection &Types = types();
 
  947  LazyRandomTypeCollection &Ids = ids();
 
  948  if (
Error Err = traverseTypes(
Pdb, Types, Ids))
 
  952  LogicalVisitor.processNamespaces();
 
  954  LLVM_DEBUG({ 
W.getOStream() << 
"Traversing inlined lines\n"; });
 
  956  auto VisitInlineeLines = [&](int32_t Modi, 
const SymbolGroup &SG,
 
  957                               DebugInlineeLinesSubsectionRef &Lines) -> 
Error {
 
  958    return collectInlineeInfo(Lines, &SG);
 
  961  FilterOptions Filters = {};
 
  963  const PrintScope HeaderScope(
Printer, 2);
 
  965          Input, HeaderScope, VisitInlineeLines))
 
  969  LLVM_DEBUG({ 
W.getOStream() << 
"Traversing global symbols\n"; });
 
  970  if (
Pdb.hasPDBGlobalsStream()) {
 
  971    Expected<GlobalsStream &> GlobalsOrErr = 
Pdb.getPDBGlobalsStream();
 
  974    GlobalsStream &Globals = *GlobalsOrErr;
 
  976    Expected<SymbolStream &> ExpectedSyms = 
Pdb.getPDBSymbolStream();
 
  979      SymbolVisitorCallbackPipeline Pipeline;
 
  980      SymbolDeserializer Deserializer(
nullptr, CodeViewContainer::Pdb);
 
  982                                LogicalVisitor.getShared());
 
  986      RecordPrefix 
Prefix(SymbolKind::S_COMPILE3);
 
  989      if (
Error Err = Traverser.visitSymbolBegin(Symbol, 
Offset))
 
 1000        CVSymbolVisitor Visitor(Pipeline);
 
 1002        BinaryStreamRef SymStream =
 
 1003            ExpectedSyms->getSymbolArray().getUnderlyingStream();
 
 1004        for (uint32_t PubSymOff : Table) {
 
 1007            if (
Error Err = Visitor.visitSymbolRecord(*Sym, PubSymOff))
 
 1016      LogicalVisitor.closeScope();
 
 1023  LLVM_DEBUG({ 
W.getOStream() << 
"Traversing symbol groups\n"; });
 
 1025  auto VisitSymbolGroup = [&](uint32_t Modi, 
const SymbolGroup &SG) -> 
Error {
 
 1026    Expected<ModuleDebugStreamRef> ExpectedModS =
 
 1029      ModuleDebugStreamRef &ModS = *ExpectedModS;
 
 1032        W.getOStream() << 
formatv(
"Traversing Group: Mod {0:4}\n", Modi);
 
 1035      SymbolVisitorCallbackPipeline Pipeline;
 
 1036      SymbolDeserializer Deserializer(
nullptr, CodeViewContainer::Pdb);
 
 1038                                LogicalVisitor.getShared());
 
 1040      Pipeline.addCallbackToPipeline(Deserializer);
 
 1041      Pipeline.addCallbackToPipeline(Traverser);
 
 1042      CVSymbolVisitor Visitor(Pipeline);
 
 1064  LLVM_DEBUG({ 
W.getOStream() << 
"Traversing lines\n"; });
 
 1069  auto VisitDebugLines = [
this](int32_t Modi, 
const SymbolGroup &SG,
 
 1070                                DebugLinesSubsectionRef &Lines) -> 
Error {
 
 1071    if (!
options().getPrintLines())
 
 1074    uint16_t Segment = Lines.header()->RelocSegment;
 
 1075    uint32_t Begin = Lines.header()->RelocOffset;
 
 1076    uint32_t 
Size = Lines.header()->CodeSize;
 
 1083    if (CurrentModule != Modi) {
 
 1084      if (
Error Err = processModule())
 
 1087      CurrentModule = Modi;
 
 1090    for (
const LineColumnEntry &
Block : Lines)
 
 1091      if (
Error Err = createLines(
Block.LineNumbers, 0, Segment,
 
 1099          Input, HeaderScope, VisitDebugLines))
 
 1103  LogicalVisitor.closeScope();
 
 1106  LogicalVisitor.processLines();
 
 1109  Root->transformScopedName();
 
 1113Error LVCodeViewReader::processModule() {
 
 1127    ScopesWithRanges->
clear();
 
 1129    if (!ScopesWithRanges->
empty())
 
 1132    ScopesWithRanges->
sort();
 
 1155    W.startLine() << 
"\n";
 
 1156    W.printString(
"File", getFileName().str());
 
 1157    W.printString(
"Exe", ExePath);
 
 1164  LogicalVisitor.setRoot(
Root);
 
 
 1192  FeaturesValue = *Features;
 
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
 
bbsections Prepares for basic block sections
 
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
 
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
 
static Expected< StringRef > getFileName(const DebugStringTableSubsectionRef &Strings, const DebugChecksumsSubsectionRef &Checksums, uint32_t FileID)
 
dxil pretty DXIL Metadata Pretty Printer
 
static const T * Find(StringRef S, ArrayRef< T > A)
Find KV in array using binary search.
 
static unsigned getSectionID(const ObjectFile &O, SectionRef Sec)
 
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
 
uint64_t getLength() const
 
Error readInteger(T &Dest)
Read an integer of the specified endianness into Dest and update the stream's offset.
 
uint64_t bytesRemaining() const
 
LLVM_ABI Error readFixedString(StringRef &Dest, uint32_t Length)
Read a Length byte string into Dest.
 
Error readArray(ArrayRef< T > &Array, uint32_t NumElements)
Get a reference to a NumElements element array of objects of type T from the underlying stream as if ...
 
LLVM_ABI Error skip(uint64_t Amount)
Advance the stream's offset by Amount bytes.
 
Lightweight error class with error context and mandatory checking.
 
static ErrorSuccess success()
Create a success value.
 
Tagged union holding either a T or a Error.
 
Error takeError()
Take ownership of the stored error.
 
reference get()
Returns a reference to the stored T value.
 
static ErrorOr< std::unique_ptr< MemoryBuffer > > getFileOrSTDIN(const Twine &Filename, bool IsText=false, bool RequiresNullTerminator=true, std::optional< Align > Alignment=std::nullopt)
Open the specified file as a MemoryBuffer, or open stdin if the Filename is "-".
 
static ErrorOr< std::unique_ptr< MemoryBuffer > > getFile(const Twine &Filename, bool IsText=false, bool RequiresNullTerminator=true, bool IsVolatile=false, std::optional< Align > Alignment=std::nullopt)
Open the specified file as a MemoryBuffer, returning a new MemoryBuffer if successful,...
 
virtual void printString(StringRef Value)
 
virtual raw_ostream & startLine()
 
virtual void printNumber(StringRef Label, char Value)
 
void printHex(StringRef Label, T Value)
 
void printSymbolOffset(StringRef Label, StringRef Symbol, T Value)
 
void push_back(const T &Elt)
 
std::pair< iterator, bool > try_emplace(StringRef Key, ArgsTy &&...Args)
Emplace a new element for the specified key into the map if the key isn't already in the map.
 
StringRef - Represent a constant reference to a string, i.e.
 
std::string str() const
str - Get the contents as an std::string.
 
const unsigned char * bytes_end() const
 
StringRef drop_front(size_t N=1) const
Return a StringRef equal to 'this' but with the first N elements dropped.
 
constexpr size_t size() const
size - Get the string size.
 
constexpr const char * data() const
data - Get a pointer to the start of the string (which may not be null terminated).
 
const unsigned char * bytes_begin() const
 
Manages the enabling and disabling of subtarget specific features.
 
LLVM_ABI std::string getString() const
Returns features as a string.
 
Triple - Helper class for working with autoconf configuration names.
 
Iterator at(uint32_t Offset) const
given an offset into the array's underlying stream, return an iterator to the record at that offset.
 
Iterator begin(bool *HadError=nullptr) const
 
VarStreamArrayIterator< ValueType, Extractor > Iterator
 
const FileChecksumArray & getArray() const
 
LLVM_ABI Expected< StringRef > getString(uint32_t Offset) const
 
uint32_t getSignature() const
 
Provides amortized O(1) random access to a CodeView type stream.
 
uint32_t getSignature() const
 
StringRef getPrecompFilePath() const
 
uint32_t getTypesCount() const
 
void addCallbackToPipeline(SymbolVisitorCallbacks &Callbacks)
 
static Error deserializeAs(CVType &CVT, T &Record)
 
StringRef getName() const
 
const GUID & getGuid() const
 
const LVSymbolTableEntry & getSymbolTableEntry(StringRef Name)
 
void includeInlineeLines(LVSectionIndex SectionIndex, LVScope *Function)
 
Error loadGenericTargetInfo(StringRef TheTriple, StringRef TheFeatures, StringRef TheCPU)
 
LVAddress linearAddress(uint16_t Segment, uint32_t Offset, LVAddress Addendum=0)
 
void addToSymbolTable(StringRef Name, LVScope *Function, LVSectionIndex SectionIndex=0)
 
void processLines(LVLines *DebugLines, LVSectionIndex SectionIndex)
 
void mapVirtualAddress(const object::ObjectFile &Obj)
 
Error createInstructions()
 
void getLinkageName(const llvm::object::coff_section *CoffSection, uint32_t RelocOffset, uint32_t Offset, StringRef *RelocSym)
 
void print(raw_ostream &OS) const
 
static std::string formatRegisterId(RegisterId Register, CPUType CPU)
 
std::string getRegisterName(LVSmall Opcode, ArrayRef< uint64_t > Operands) override
 
friend class LVTypeVisitor
 
LVScope * getScopeForModule(uint32_t Modi)
 
Error createScopes() override
 
static StringRef getSymbolKindName(SymbolKind Kind)
 
friend class LVSymbolVisitor
 
friend class LVSymbolVisitorDelegate
 
bool isSystemEntry(LVElement *Element, StringRef Name) const override
 
void sortScopes() override
 
StringRef getName() const override
 
void addInlineeInfo(TypeIndex TI, uint32_t LineNumber, StringRef Filename)
 
void printTypeIndex(StringRef FieldName, TypeIndex TI, uint32_t StreamIdx)
 
LVAddress getLower() const
 
LVAddress getUpper() const
 
LVRange * getSectionRanges(LVSectionIndex SectionIndex)
 
std::string FileFormatName
 
codeview::CPUType getCompileUnitCPUType()
 
std::string createAlternativePath(StringRef From)
 
LVScopeCompileUnit * CompileUnit
 
LVSectionIndex DotTextSectionIndex
 
virtual Error createScopes()
 
virtual Expected< SubtargetFeatures > getFeatures() const =0
 
section_iterator_range sections() const
 
virtual Triple::ArchType getArch() const =0
 
virtual std::optional< StringRef > tryGetCPUName() const
 
This is a value type class that represents a single section in the list of sections in the object fil...
 
This is a value type class that represents a single symbol in the list of symbols in the object file.
 
const GSIHashTable & getGlobalsTable() const
 
LLVM_ABI BinarySubstreamRef getSymbolsSubstream() const
 
const codeview::CVSymbolArray & getSymbolArray() const
 
LLVM_ABI Expected< StringRef > getNameFromChecksums(uint32_t Offset) const
 
LLVM_ABI void buildHashMap()
 
LLVM_ABI uint32_t getNumTypeRecords() const
 
This class implements an extremely fast bulk output stream that can only output to a stream.
 
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
 
constexpr char SymbolName[]
Key for Kernel::Metadata::mSymbolName.
 
@ IMAGE_SYM_DTYPE_FUNCTION
A function that returns a base type.
 
CVRecord< TypeLeafKind > CVType
 
VarStreamArray< CVSymbol > CVSymbolArray
 
CPUType
These values correspond to the CV_CPU_TYPE_e enumeration, and are documented here: https://msdn....
 
VarStreamArray< CVType > CVTypeArray
 
CVRecord< SymbolKind > CVSymbol
 
LLVM_ABI Error visitTypeStream(const CVTypeArray &Types, TypeVisitorCallbacks &Callbacks, VisitorDataSource Source=VDS_BytesPresent)
 
SymbolKind
Duplicate copy of the above enum, but using the official CV names.
 
LLVM_ABI Expected< CVSymbol > readSymbolFromStream(BinaryStreamRef Stream, uint32_t Offset)
 
Scope
Defines the scope in which this symbol should be visible: Default – Visible in the public interface o...
 
static const char Magic[]
 
content_iterator< BasicSymbolRef > basic_symbol_iterator
 
LLVM_ABI Expected< std::unique_ptr< Binary > > createBinary(MemoryBufferRef Source, LLVMContext *Context=nullptr, bool InitContent=true)
Create a Binary from Source, autodetecting the file type.
 
LLVM_ABI Expected< ModuleDebugStreamRef > getModuleDebugStream(PDBFile &File, StringRef &ModuleName, uint32_t Index)
 
Error iterateModuleSubsections(InputFile &File, const PrintScope &HeaderScope, llvm::function_ref< Error(uint32_t, const SymbolGroup &, SubsectionT &)> Callback)
 
LLVM_ABI Error loadDataForPDB(PDB_ReaderType Type, StringRef Path, std::unique_ptr< IPDBSession > &Session)
 
Error iterateSymbolGroups(InputFile &Input, const PrintScope &HeaderScope, CallbackT Callback)
 
detail::packed_endian_specific_integral< uint32_t, llvm::endianness::little, unaligned > ulittle32_t
 
This is an optimization pass for GlobalISel generic memory operations.
 
LLVM_ABI file_magic identify_magic(StringRef magic)
Identify the type of a binary file based on how magical it is.
 
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
 
LLVM_ABI std::error_code inconvertibleErrorCode()
The value returned by this function can be returned from convertToErrorCode for Error values where no...
 
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
 
std::string utostr(uint64_t X, bool isNeg=false)
 
Error createStringError(std::error_code EC, char const *Fmt, const Ts &... Vals)
Create formatted StringError object.
 
auto formatv(bool Validate, const char *Fmt, Ts &&...Vals)
 
void sort(IteratorTy Start, IteratorTy End)
 
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
 
LLVM_ABI raw_ostream & nulls()
This returns a reference to a raw_ostream which simply discards output.
 
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
 
Error make_error(ArgTs &&... Args)
Make a Error instance representing failure using the given error info type.
 
void cantFail(Error Err, const char *Msg=nullptr)
Report a fatal error if Err is a failure value.
 
FunctionAddr VTableAddr uintptr_t uintptr_t Data
 
uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
 
support::detail::AlignAdapter< T > fmt_align(T &&Item, AlignStyle Where, size_t Amount, char Fill=' ')
 
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
 
LLVM_ABI Error errorCodeToError(std::error_code EC)
Helper for converting an std::error_code to a Error.
 
LLVM_ABI std::error_code errorToErrorCode(Error Err)
Helper for converting an ECError to a std::error_code.
 
void consumeError(Error Err)
Consume a Error without doing anything.
 
@ pdb
Windows PDB debug info file.
 
@ pecoff_executable
PECOFF executable file.
 
LVSectionIndex SectionIndex