diff options
author | Rui Ueyama <ruiu@google.com> | 2016-12-01 01:22:48 +0000 |
---|---|---|
committer | Rui Ueyama <ruiu@google.com> | 2016-12-01 01:22:48 +0000 |
commit | c5cb737584e00d0219520b0230de88e719d5240f (patch) | |
tree | fc76ca369c5a3dc78bad6aaa7d5203a635279444 | |
parent | 1881a573e9b81edc307d714a4fc8110b4a2a763a (diff) | |
download | bcm5719-llvm-c5cb737584e00d0219520b0230de88e719d5240f.tar.gz bcm5719-llvm-c5cb737584e00d0219520b0230de88e719d5240f.zip |
Dump Codeview type information correctly.
llvm-svn: 288298
-rw-r--r-- | lld/COFF/PDB.cpp | 57 | ||||
-rw-r--r-- | lld/test/COFF/dumppdb.test | 73 |
2 files changed, 105 insertions, 25 deletions
diff --git a/lld/COFF/PDB.cpp b/lld/COFF/PDB.cpp index 81eea32f689..4bccb145cfc 100644 --- a/lld/COFF/PDB.cpp +++ b/lld/COFF/PDB.cpp @@ -60,32 +60,47 @@ static SectionChunk *findByName(std::vector<SectionChunk *> &Sections, 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); } } diff --git a/lld/test/COFF/dumppdb.test b/lld/test/COFF/dumppdb.test index 2bb2c8cab41..787ee2edbed 100644 --- a/lld/test/COFF/dumppdb.test +++ b/lld/test/COFF/dumppdb.test @@ -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 |