[llvm] r227286 - [llvm-pdbdump] Add basic symbol dumping.

Zachary Turner zturner at google.com
Tue Jan 27 17:22:33 PST 2015


Author: zturner
Date: Tue Jan 27 19:22:33 2015
New Revision: 227286

URL: http://llvm.org/viewvc/llvm-project?rev=227286&view=rev
Log:
[llvm-pdbdump] Add basic symbol dumping.

This adds two command line options:

--symbols dumps a list of all symbols found in the PDB.
--symbol-details dumps the same list, but with detailed information
                 for every symbol such as type, attributes, etc.

Modified:
    llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.cpp

Modified: llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.cpp?rev=227286&r1=227285&r2=227286&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.cpp (original)
+++ llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.cpp Tue Jan 27 19:22:33 2015
@@ -38,12 +38,12 @@ cl::list<std::string> InputFilenames(cl:
                                      cl::OneOrMore);
 
 cl::opt<bool> Streams("streams", cl::desc("Display data stream information"));
-cl::alias StreamsShort("s", cl::desc("Alias for --streams"),
+cl::alias StreamsShort("x", cl::desc("Alias for --streams"),
                        cl::aliasopt(Streams));
 
 cl::opt<bool> StreamData("stream-data",
                          cl::desc("Dumps stream record data as bytes"));
-cl::alias StreamDataShort("S", cl::desc("Alias for --stream-data"),
+cl::alias StreamDataShort("X", cl::desc("Alias for --stream-data"),
                           cl::aliasopt(StreamData));
 
 cl::opt<bool> Tables("tables",
@@ -63,10 +63,19 @@ cl::opt<bool> Compilands("compilands",
                                   "files) and their source file composition"));
 cl::alias CompilandsShort("c", cl::desc("Alias for --compilands"),
                           cl::aliasopt(Compilands));
+
+cl::opt<bool> Symbols("symbols", cl::desc("Display symbols"));
+cl::alias SymbolsShort("s", cl::desc("Alias for --symbols"),
+                       cl::aliasopt(Symbols));
+
+cl::opt<bool> SymbolDetails("symbol-details",
+                            cl::desc("Display symbol details"));
+cl::alias SymbolDetailsShort("S", cl::desc("Alias for --symbol-details"),
+                             cl::aliasopt(SymbolDetails));
 }
 
 template <typename TableType>
-static HRESULT GetDiaTable(IDiaSession *Session, TableType **Table) {
+static HRESULT getDIATable(IDiaSession *Session, TableType **Table) {
   CComPtr<IDiaEnumTables> EnumTables = nullptr;
   HRESULT Error = S_OK;
   if (FAILED(Error = Session->getEnumTables(&EnumTables)))
@@ -194,7 +203,7 @@ static void dumpDebugTables(IDiaSession
 
 static void dumpSourceFiles(IDiaSession *Session) {
   CComPtr<IDiaEnumSourceFiles> EnumSourceFileList;
-  if (FAILED(GetDiaTable(Session, &EnumSourceFileList)))
+  if (FAILED(getDIATable(Session, &EnumSourceFileList)))
     return;
 
   LONG SourceFileCount = 0;
@@ -216,7 +225,7 @@ static void dumpSourceFiles(IDiaSession
 
 static void dumpCompilands(IDiaSession *Session) {
   CComPtr<IDiaEnumSourceFiles> EnumSourceFileList;
-  if (FAILED(GetDiaTable(Session, &EnumSourceFileList)))
+  if (FAILED(getDIATable(Session, &EnumSourceFileList)))
     return;
 
   LONG SourceFileCount = 0;
@@ -280,6 +289,32 @@ static void dumpCompilands(IDiaSession *
   outs().flush();
 }
 
+static void dumpSymbols(IDiaSession *Session) {
+  CComPtr<IDiaEnumSymbols> EnumSymbols;
+  if (FAILED(getDIATable(Session, &EnumSymbols)))
+    return;
+
+  LONG SymbolCount = 0;
+  EnumSymbols->get_Count(&SymbolCount);
+
+  outs() << "Dumping symbols [" << SymbolCount << " symbols]\n";
+  int UnnamedSymbolCount = 0;
+  for (auto Symbol : make_com_enumerator(EnumSymbols)) {
+    DIASymbol SymbolSymbol(Symbol);
+    DIAResult<DIAString> SymbolName = SymbolSymbol.getName();
+    if (!SymbolName.hasValue() || SymbolName.value().empty()) {
+      ++UnnamedSymbolCount;
+      outs() << "  (Unnamed symbol)\n";
+    } else {
+      outs() << "  " << SymbolSymbol.getName().value() << "\n";
+    }
+    if (opts::SymbolDetails)
+      SymbolSymbol.fullDump(4);
+  }
+  outs() << "(Found " << UnnamedSymbolCount << " unnamed symbols)\n";
+  outs().flush();
+}
+
 static void dumpInput(StringRef Path) {
   SmallVector<UTF16, 128> Path16String;
   llvm::convertUTF8ToUTF16String(Path, Path16String);
@@ -312,6 +347,10 @@ static void dumpInput(StringRef Path) {
   if (opts::Compilands) {
     dumpCompilands(Session);
   }
+
+  if (opts::Symbols || opts::SymbolDetails) {
+    dumpSymbols(Session);
+  }
 }
 
 int main(int argc_, const char *argv_[]) {





More information about the llvm-commits mailing list