forked from OSchip/llvm-project
Dump Codeview type information correctly.
llvm-svn: 288298
This commit is contained in:
parent
1881a573e9
commit
c5cb737584
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue