Home | History | Annotate | Download | only in llvm-pdbdump
      1 //===- CompilandDumper.cpp - llvm-pdbdump compiland symbol dumper *- C++ *-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 #include "CompilandDumper.h"
     11 #include "LinePrinter.h"
     12 #include "llvm-pdbdump.h"
     13 
     14 #include "llvm/DebugInfo/PDB/IPDBEnumChildren.h"
     15 #include "llvm/DebugInfo/PDB/IPDBLineNumber.h"
     16 #include "llvm/DebugInfo/PDB/IPDBSession.h"
     17 #include "llvm/DebugInfo/PDB/IPDBSourceFile.h"
     18 #include "llvm/DebugInfo/PDB/PDBExtras.h"
     19 #include "llvm/DebugInfo/PDB/PDBSymbol.h"
     20 #include "llvm/DebugInfo/PDB/PDBSymbolCompiland.h"
     21 #include "llvm/DebugInfo/PDB/PDBSymbolData.h"
     22 #include "llvm/DebugInfo/PDB/PDBSymbolFunc.h"
     23 #include "llvm/DebugInfo/PDB/PDBSymbolFuncDebugEnd.h"
     24 #include "llvm/DebugInfo/PDB/PDBSymbolFuncDebugStart.h"
     25 #include "llvm/DebugInfo/PDB/PDBSymbolLabel.h"
     26 #include "llvm/DebugInfo/PDB/PDBSymbolThunk.h"
     27 #include "llvm/DebugInfo/PDB/PDBSymbolTypeFunctionSig.h"
     28 #include "llvm/DebugInfo/PDB/PDBSymbolUnknown.h"
     29 #include "llvm/Support/Format.h"
     30 #include "llvm/Support/Path.h"
     31 #include "llvm/Support/raw_ostream.h"
     32 
     33 #include "FunctionDumper.h"
     34 
     35 #include <utility>
     36 
     37 using namespace llvm;
     38 using namespace llvm::pdb;
     39 
     40 CompilandDumper::CompilandDumper(LinePrinter &P)
     41     : PDBSymDumper(true), Printer(P) {}
     42 
     43 void CompilandDumper::dump(const PDBSymbolCompilandDetails &Symbol) {}
     44 
     45 void CompilandDumper::dump(const PDBSymbolCompilandEnv &Symbol) {}
     46 
     47 void CompilandDumper::start(const PDBSymbolCompiland &Symbol,
     48                             CompilandDumpFlags opts) {
     49   std::string FullName = Symbol.getName();
     50   if (Printer.IsCompilandExcluded(FullName))
     51     return;
     52 
     53   Printer.NewLine();
     54   WithColor(Printer, PDB_ColorItem::Path).get() << FullName;
     55 
     56   if (opts & Flags::Lines) {
     57     const IPDBSession &Session = Symbol.getSession();
     58     auto Files = Session.getSourceFilesForCompiland(Symbol);
     59     Printer.Indent();
     60     while (auto File = Files->getNext()) {
     61       Printer.NewLine();
     62       WithColor(Printer, PDB_ColorItem::Path).get() << File->getFileName();
     63 
     64       auto Lines = Session.findLineNumbers(Symbol, *File);
     65       Printer.Indent();
     66       while (auto Line = Lines->getNext()) {
     67         Printer.NewLine();
     68         uint32_t LineStart = Line->getLineNumber();
     69         uint32_t LineEnd = Line->getLineNumberEnd();
     70 
     71         Printer << "Line ";
     72         PDB_ColorItem StatementColor = Line->isStatement()
     73                                            ? PDB_ColorItem::Keyword
     74                                            : PDB_ColorItem::LiteralValue;
     75         WithColor(Printer, StatementColor).get() << LineStart;
     76         if (LineStart != LineEnd)
     77           WithColor(Printer, StatementColor).get() << " - " << LineEnd;
     78 
     79         Printer << ", Address: ";
     80         if (Line->getLength() > 0) {
     81           uint64_t AddrStart = Line->getVirtualAddress();
     82           uint64_t AddrEnd = AddrStart + Line->getLength() - 1;
     83           WithColor(Printer, PDB_ColorItem::Address).get()
     84               << "[" << format_hex(AddrStart, 10) << " - "
     85               << format_hex(AddrEnd, 10) << "]";
     86           Printer << " (" << Line->getLength() << " bytes)";
     87         } else {
     88           uint64_t AddrStart = Line->getVirtualAddress();
     89           WithColor(Printer, PDB_ColorItem::Address).get()
     90               << "[" << format_hex(AddrStart, 10) << "] ";
     91           Printer << "(0 bytes)";
     92         }
     93       }
     94       Printer.Unindent();
     95     }
     96     Printer.Unindent();
     97   }
     98 
     99   if (opts & Flags::Children) {
    100     auto ChildrenEnum = Symbol.findAllChildren();
    101     Printer.Indent();
    102     while (auto Child = ChildrenEnum->getNext())
    103       Child->dump(*this);
    104     Printer.Unindent();
    105   }
    106 }
    107 
    108 void CompilandDumper::dump(const PDBSymbolData &Symbol) {
    109   if (Printer.IsSymbolExcluded(Symbol.getName()))
    110     return;
    111 
    112   Printer.NewLine();
    113 
    114   switch (auto LocType = Symbol.getLocationType()) {
    115   case PDB_LocType::Static:
    116     Printer << "data: ";
    117     WithColor(Printer, PDB_ColorItem::Address).get()
    118         << "[" << format_hex(Symbol.getVirtualAddress(), 10) << "]";
    119     break;
    120   case PDB_LocType::Constant:
    121     Printer << "constant: ";
    122     WithColor(Printer, PDB_ColorItem::LiteralValue).get()
    123         << "[" << Symbol.getValue() << "]";
    124     break;
    125   default:
    126     Printer << "data(unexpected type=" << LocType << ")";
    127   }
    128 
    129   Printer << " ";
    130   WithColor(Printer, PDB_ColorItem::Identifier).get() << Symbol.getName();
    131 }
    132 
    133 void CompilandDumper::dump(const PDBSymbolFunc &Symbol) {
    134   if (Symbol.getLength() == 0)
    135     return;
    136   if (Printer.IsSymbolExcluded(Symbol.getName()))
    137     return;
    138 
    139   Printer.NewLine();
    140   FunctionDumper Dumper(Printer);
    141   Dumper.start(Symbol, FunctionDumper::PointerType::None);
    142 }
    143 
    144 void CompilandDumper::dump(const PDBSymbolLabel &Symbol) {
    145   if (Printer.IsSymbolExcluded(Symbol.getName()))
    146     return;
    147 
    148   Printer.NewLine();
    149   Printer << "label ";
    150   WithColor(Printer, PDB_ColorItem::Address).get()
    151       << "[" << format_hex(Symbol.getVirtualAddress(), 10) << "] ";
    152   WithColor(Printer, PDB_ColorItem::Identifier).get() << Symbol.getName();
    153 }
    154 
    155 void CompilandDumper::dump(const PDBSymbolThunk &Symbol) {
    156   if (Printer.IsSymbolExcluded(Symbol.getName()))
    157     return;
    158 
    159   Printer.NewLine();
    160   Printer << "thunk ";
    161   codeview::ThunkOrdinal Ordinal = Symbol.getThunkOrdinal();
    162   uint64_t VA = Symbol.getVirtualAddress();
    163   if (Ordinal == codeview::ThunkOrdinal::TrampIncremental) {
    164     uint64_t Target = Symbol.getTargetVirtualAddress();
    165     WithColor(Printer, PDB_ColorItem::Address).get() << format_hex(VA, 10);
    166     Printer << " -> ";
    167     WithColor(Printer, PDB_ColorItem::Address).get() << format_hex(Target, 10);
    168   } else {
    169     WithColor(Printer, PDB_ColorItem::Address).get()
    170         << "[" << format_hex(VA, 10) << " - "
    171         << format_hex(VA + Symbol.getLength(), 10) << "]";
    172   }
    173   Printer << " (";
    174   WithColor(Printer, PDB_ColorItem::Register).get() << Ordinal;
    175   Printer << ") ";
    176   std::string Name = Symbol.getName();
    177   if (!Name.empty())
    178     WithColor(Printer, PDB_ColorItem::Identifier).get() << Name;
    179 }
    180 
    181 void CompilandDumper::dump(const PDBSymbolTypeTypedef &Symbol) {}
    182 
    183 void CompilandDumper::dump(const PDBSymbolUnknown &Symbol) {
    184   Printer.NewLine();
    185   Printer << "unknown (" << Symbol.getSymTag() << ")";
    186 }
    187