[lld] r288298 - Dump Codeview type information correctly.

Rui Ueyama via llvm-commits llvm-commits at lists.llvm.org
Wed Nov 30 17:22:49 PST 2016


Author: ruiu
Date: Wed Nov 30 19:22:48 2016
New Revision: 288298

URL: http://llvm.org/viewvc/llvm-project?rev=288298&view=rev
Log:
Dump Codeview type information correctly.

Modified:
    lld/trunk/COFF/PDB.cpp
    lld/trunk/test/COFF/dumppdb.test

Modified: lld/trunk/COFF/PDB.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/PDB.cpp?rev=288298&r1=288297&r2=288298&view=diff
==============================================================================
--- lld/trunk/COFF/PDB.cpp (original)
+++ lld/trunk/COFF/PDB.cpp Wed Nov 30 19:22:48 2016
@@ -60,32 +60,47 @@ static SectionChunk *findByName(std::vec
   return nullptr;
 }
 
+static void dumpDebugT(ScopedPrinter &W, ObjectFile *File) {
+  SectionChunk *Sec = findByName(File->getDebugChunks(), ".debug$T");
+  if (!Sec)
+    return;
+
+  // First 4 bytes are section magic.
+  ArrayRef<uint8_t> Data = Sec->getContents();
+  if (Data.size() < 4)
+    fatal(".debug$T too short");
+  if (read32le(Data.data()) != COFF::DEBUG_SECTION_MAGIC)
+    fatal(".debug$T has an invalid magic");
+
+  CVTypeDumper TypeDumper(&W, false);
+  if (auto EC = TypeDumper.dump(Data.slice(4)))
+    fatal(EC, "CVTypeDumper::dump failed");
+}
+
+static void dumpDebugS(ScopedPrinter &W, ObjectFile *File) {
+  SectionChunk *Sec = findByName(File->getDebugChunks(), ".debug$S");
+  if (!Sec)
+    return;
+
+  msf::ByteStream Stream(Sec->getContents());
+  CVSymbolArray Symbols;
+  msf::StreamReader Reader(Stream);
+  if (auto EC = Reader.readArray(Symbols, Reader.getLength()))
+    fatal(EC, "StreamReader.readArray<CVSymbolArray> failed");
+
+  CVTypeDumper TypeDumper(&W, false);
+  CVSymbolDumper SymbolDumper(W, TypeDumper, nullptr, false);
+  if (auto EC = SymbolDumper.dump(Symbols))
+    fatal(EC, "CVSymbolDumper::dump failed");
+}
+
 // Dump CodeView debug info. This is for debugging.
 static void dumpCodeView(SymbolTable *Symtab) {
   ScopedPrinter W(outs());
 
   for (ObjectFile *File : Symtab->ObjectFiles) {
-    SectionChunk *DebugT = findByName(File->getDebugChunks(), ".debug$T");
-    if (!DebugT)
-      continue;
-
-    CVTypeDumper TypeDumper(&W, false);
-    if (auto EC = TypeDumper.dump(DebugT->getContents()))
-      fatal(EC, "CVTypeDumper::dump failed");
-
-    SectionChunk *DebugS = findByName(File->getDebugChunks(), ".debug$S");
-    if (!DebugS)
-      continue;
-
-    msf::ByteStream Stream(DebugS->getContents());
-    CVSymbolArray Symbols;
-    msf::StreamReader Reader(Stream);
-    if (auto EC = Reader.readArray(Symbols, Reader.getLength()))
-      fatal(EC, "StreamReader.readArray<CVSymbolArray> failed");
-
-    CVSymbolDumper SymbolDumper(W, TypeDumper, nullptr, false);
-    if (auto EC = SymbolDumper.dump(Symbols))
-      fatal(EC, "CVSymbolDumper::dump failed");
+    dumpDebugT(W, File);
+    dumpDebugS(W, File);
   }
 }
 

Modified: lld/trunk/test/COFF/dumppdb.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/dumppdb.test?rev=288298&r1=288297&r2=288298&view=diff
==============================================================================
--- lld/trunk/test/COFF/dumppdb.test (original)
+++ lld/trunk/test/COFF/dumppdb.test Wed Nov 30 19:22:48 2016
@@ -2,10 +2,75 @@
 # RUN: lld-link /debug /pdb:%t.pdb /dumppdb /dll /out:%t.dll /entry:main \
 # RUN:   /nodefaultlib %t.obj | FileCheck %s
 
-# CHECK:      UnknownLeaf (0x1000) {
-# CHECK-NEXT:   TypeLeafKind: 0x0
-# CHECK-NEXT:   Kind: 0x0
-# CHECK-NEXT:   Length: 2
+# CHECK:      ArgList (0x1000) {
+# CHECK-NEXT:   TypeLeafKind: LF_ARGLIST (0x1201)
+# CHECK-NEXT:   NumArgs: 1
+# CHECK-NEXT:   Arguments [
+# CHECK-NEXT:     ArgType: 0x0
+# CHECK-NEXT:   ]
+# CHECK-NEXT: }
+# CHECK-NEXT: Procedure (0x1001) {
+# CHECK-NEXT:   TypeLeafKind: LF_PROCEDURE (0x1008)
+# CHECK-NEXT:   ReturnType: int (0x74)
+# CHECK-NEXT:   CallingConvention: NearC (0x0)
+# CHECK-NEXT:   FunctionOptions [ (0x0)
+# CHECK-NEXT:   ]
+# CHECK-NEXT:   NumParameters: 0
+# CHECK-NEXT:   ArgListType: (<no type>) (0x1000)
+# CHECK-NEXT: }
+# CHECK-NEXT: FuncId (0x1002) {
+# CHECK-NEXT:   TypeLeafKind: LF_FUNC_ID (0x1601)
+# CHECK-NEXT:   ParentScope: 0x0
+# CHECK-NEXT:   FunctionType: int (<no type>) (0x1001)
+# CHECK-NEXT:   Name: main
+# CHECK-NEXT: }
+# CHECK-NEXT: StringId (0x1003) {
+# CHECK-NEXT:   TypeLeafKind: LF_STRING_ID (0x1605)
+# CHECK-NEXT:   Id: 0x0
+# CHECK-NEXT:   StringData: D:\b
+# CHECK-NEXT: }
+# CHECK-NEXT: StringId (0x1004) {
+# CHECK-NEXT:   TypeLeafKind: LF_STRING_ID (0x1605)
+# CHECK-NEXT:   Id: 0x0
+# CHECK-NEXT:   StringData: C:\vs14\VC\BIN\amd64\cl.exe
+# CHECK-NEXT: }
+# CHECK-NEXT: StringId (0x1005) {
+# CHECK-NEXT:   TypeLeafKind: LF_STRING_ID (0x1605)
+# CHECK-NEXT:   Id: 0x0
+# CHECK-NEXT:   StringData: -Z7 -c -MT -IC:\vs14\VC\INCLUDE -IC:\vs14\VC\ATLMFC\INCLUDE -I"C:\Program Files (x86)\Windows Kits\10\include\10.0.10150.0\ucrt" -I"C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6\include\um" -I"C:\Program Files (x86)\Windows Kits\8.1\include\shared"
+# CHECK-NEXT: }
+# CHECK-NEXT: StringList (0x1006) {
+# CHECK-NEXT:   TypeLeafKind: LF_SUBSTR_LIST (0x1604)
+# CHECK-NEXT:   NumArgs: 1
+# CHECK-NEXT:   Arguments [
+# CHECK-NEXT:     ArgType: -Z7 -c -MT -IC:\vs14\VC\INCLUDE -IC:\vs14\VC\ATLMFC\INCLUDE -I"C:\Program Files (x86)\Windows Kits\10\include\10.0.10150.0\ucrt" -I"C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6\include\um" -I"C:\Program Files (x86)\Windows Kits\8.1\include\shared" (0x1005)
+# CHECK-NEXT:   ]
+# CHECK-NEXT: }
+# CHECK-NEXT: StringId (0x1007) {
+# CHECK-NEXT:   TypeLeafKind: LF_STRING_ID (0x1605)
+# CHECK-NEXT:   Id: (-Z7 -c -MT -IC:\vs14\VC\INCLUDE -IC:\vs14\VC\ATLMFC\INCLUDE -I"C:\Program Files (x86)\Windows Kits\10\include\10.0.10150.0\ucrt" -I"C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6\include\um" -I"C:\Program Files (x86)\Windows Kits\8.1\include\shared") (0x1006)
+# CHECK-NEXT:   StringData:  -I"C:\Program Files (x86)\Windows Kits\8.1\include\um" -I"C:\Program Files (x86)\Windows Kits\8.1\include\winrt" -TC -X
+# CHECK-NEXT: }
+# CHECK-NEXT: StringId (0x1008) {
+# CHECK-NEXT:   TypeLeafKind: LF_STRING_ID (0x1605)
+# CHECK-NEXT:   Id: 0x0
+# CHECK-NEXT:   StringData: ret42.c
+# CHECK-NEXT: }
+# CHECK-NEXT: StringId (0x1009) {
+# CHECK-NEXT:   TypeLeafKind: LF_STRING_ID (0x1605)
+# CHECK-NEXT:   Id: 0x0
+# CHECK-NEXT:   StringData: D:\b\vc140.pdb
+# CHECK-NEXT: }
+# CHECK-NEXT: BuildInfo (0x100A) {
+# CHECK-NEXT:   TypeLeafKind: LF_BUILDINFO (0x1603)
+# CHECK-NEXT:   NumArgs: 5
+# CHECK-NEXT:   Arguments [
+# CHECK-NEXT:     ArgType: D:\b (0x1003)
+# CHECK-NEXT:     ArgType: C:\vs14\VC\BIN\amd64\cl.exe (0x1004)
+# CHECK-NEXT:     ArgType: ret42.c (0x1008)
+# CHECK-NEXT:     ArgType: D:\b\vc140.pdb (0x1009)
+# CHECK-NEXT:     ArgType:  -I"C:\Program Files (x86)\Windows Kits\8.1\include\um" -I"C:\Program Files (x86)\Windows Kits\8.1\include\winrt" -TC -X (0x1007)
+# CHECK-NEXT:   ]
 # CHECK-NEXT: }
 # CHECK-NEXT: UnknownSym {
 # CHECK-NEXT:   Kind: 0x0




More information about the llvm-commits mailing list