Modify llvm-readobj to dump symbol record bytes.

This will help us study the format of individual symbol
records more closely.

Differential Revision: http://reviews.llvm.org/D7664
Reviewed by: Timur Iskhodzhanov

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@229730 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Zachary Turner
2015-02-18 19:32:05 +00:00
parent bc20f6088d
commit 23719010db
10 changed files with 62 additions and 43 deletions

View File

@ -664,16 +664,16 @@ namespace COFF {
} }
}; };
enum CodeViewLineTableIdentifiers { enum CodeViewIdentifiers {
DEBUG_SECTION_MAGIC = 0x4, DEBUG_SECTION_MAGIC = 0x4,
DEBUG_SYMBOL_SUBSECTION = 0xF1, DEBUG_SYMBOL_SUBSECTION = 0xF1,
DEBUG_LINE_TABLE_SUBSECTION = 0xF2, DEBUG_LINE_TABLE_SUBSECTION = 0xF2,
DEBUG_STRING_TABLE_SUBSECTION = 0xF3, DEBUG_STRING_TABLE_SUBSECTION = 0xF3,
DEBUG_INDEX_SUBSECTION = 0xF4, DEBUG_INDEX_SUBSECTION = 0xF4,
// Symbol subsections are split into records of different types. // Symbol subsections are split into records of different types.
DEBUG_SYMBOL_TYPE_PROC_START = 0x1147, DEBUG_SYMBOL_TYPE_PROC_START = 0x1147,
DEBUG_SYMBOL_TYPE_PROC_END = 0x114F DEBUG_SYMBOL_TYPE_PROC_END = 0x114F
}; };
inline bool isReservedSectionNumber(int32_t SectionNumber) { inline bool isReservedSectionNumber(int32_t SectionNumber) {

View File

@ -1,7 +1,7 @@
; RUN: llc -mcpu=core2 -mtriple=i686-pc-win32 -O0 < %s | FileCheck --check-prefix=X86 %s ; RUN: llc -mcpu=core2 -mtriple=i686-pc-win32 -O0 < %s | FileCheck --check-prefix=X86 %s
; RUN: llc -mcpu=core2 -mtriple=i686-pc-win32 -o - -O0 < %s | llvm-mc -triple=i686-pc-win32 -filetype=obj | llvm-readobj -s -sr -codeview-linetables | FileCheck --check-prefix=OBJ32 %s ; RUN: llc -mcpu=core2 -mtriple=i686-pc-win32 -o - -O0 < %s | llvm-mc -triple=i686-pc-win32 -filetype=obj | llvm-readobj -s -sr -codeview -section-symbols | FileCheck --check-prefix=OBJ32 %s
; RUN: llc -mcpu=core2 -mtriple=x86_64-pc-win32 -O0 < %s | FileCheck --check-prefix=X64 %s ; RUN: llc -mcpu=core2 -mtriple=x86_64-pc-win32 -O0 < %s | FileCheck --check-prefix=X64 %s
; RUN: llc -mcpu=core2 -mtriple=x86_64-pc-win32 -o - -O0 < %s | llvm-mc -triple=x86_64-pc-win32 -filetype=obj | llvm-readobj -s -sr -codeview-linetables | FileCheck --check-prefix=OBJ64 %s ; RUN: llc -mcpu=core2 -mtriple=x86_64-pc-win32 -o - -O0 < %s | llvm-mc -triple=x86_64-pc-win32 -filetype=obj | llvm-readobj -s -sr -codeview -section-symbols | FileCheck --check-prefix=OBJ64 %s
; This LL file was generated by running clang on the following code: ; This LL file was generated by running clang on the following code:
; D:\asm.c: ; D:\asm.c:

View File

@ -1,4 +1,4 @@
; RUN: llc -mcpu=core2 -mtriple=i686-pc-win32 -o - -O0 < %s | llvm-mc -triple=i686-pc-win32 -filetype=obj | llvm-readobj -s -sr -codeview-linetables | FileCheck %s ; RUN: llc -mcpu=core2 -mtriple=i686-pc-win32 -o - -O0 < %s | llvm-mc -triple=i686-pc-win32 -filetype=obj | llvm-readobj -s -sr -codeview -section-symbols | FileCheck %s
; This LL file was generated by running clang on the following code: ; This LL file was generated by running clang on the following code:
; D:\src.cpp: ; D:\src.cpp:

View File

@ -1,7 +1,7 @@
; RUN: llc -mcpu=core2 -mtriple=i686-pc-win32 -O0 < %s | FileCheck --check-prefix=X86 %s ; RUN: llc -mcpu=core2 -mtriple=i686-pc-win32 -O0 < %s | FileCheck --check-prefix=X86 %s
; RUN: llc -mcpu=core2 -mtriple=i686-pc-win32 -o - -O0 < %s | llvm-mc -triple=i686-pc-win32 -filetype=obj | llvm-readobj -s -sr -codeview-linetables | FileCheck --check-prefix=OBJ32 %s ; RUN: llc -mcpu=core2 -mtriple=i686-pc-win32 -o - -O0 < %s | llvm-mc -triple=i686-pc-win32 -filetype=obj | llvm-readobj -s -sr -codeview -section-symbols | FileCheck --check-prefix=OBJ32 %s
; RUN: llc -mcpu=core2 -mtriple=x86_64-pc-win32 -O0 < %s | FileCheck --check-prefix=X64 %s ; RUN: llc -mcpu=core2 -mtriple=x86_64-pc-win32 -O0 < %s | FileCheck --check-prefix=X64 %s
; RUN: llc -mcpu=core2 -mtriple=x86_64-pc-win32 -o - -O0 < %s | llvm-mc -triple=x86_64-pc-win32 -filetype=obj | llvm-readobj -s -sr -codeview-linetables | FileCheck --check-prefix=OBJ64 %s ; RUN: llc -mcpu=core2 -mtriple=x86_64-pc-win32 -o - -O0 < %s | llvm-mc -triple=x86_64-pc-win32 -filetype=obj | llvm-readobj -s -sr -codeview -section-symbols | FileCheck --check-prefix=OBJ64 %s
; This LL file was generated by running clang on the following code: ; This LL file was generated by running clang on the following code:
; D:\input.c: ; D:\input.c:

View File

@ -1,7 +1,7 @@
; RUN: llc -mcpu=core2 -mtriple=i686-pc-win32 -O0 < %s | FileCheck --check-prefix=X86 %s ; RUN: llc -mcpu=core2 -mtriple=i686-pc-win32 -O0 < %s | FileCheck --check-prefix=X86 %s
; RUN: llc -mcpu=core2 -mtriple=i686-pc-win32 -o - -O0 < %s | llvm-mc -triple=i686-pc-win32 -filetype=obj | llvm-readobj -s -sr -codeview-linetables | FileCheck --check-prefix=OBJ32 %s ; RUN: llc -mcpu=core2 -mtriple=i686-pc-win32 -o - -O0 < %s | llvm-mc -triple=i686-pc-win32 -filetype=obj | llvm-readobj -s -sr -codeview -section-symbols | FileCheck --check-prefix=OBJ32 %s
; RUN: llc -mcpu=core2 -mtriple=x86_64-pc-win32 -O0 < %s | FileCheck --check-prefix=X64 %s ; RUN: llc -mcpu=core2 -mtriple=x86_64-pc-win32 -O0 < %s | FileCheck --check-prefix=X64 %s
; RUN: llc -mcpu=core2 -mtriple=x86_64-pc-win32 -o - -O0 < %s | llvm-mc -triple=x86_64-pc-win32 -filetype=obj | llvm-readobj -s -sr -codeview-linetables | FileCheck --check-prefix=OBJ64 %s ; RUN: llc -mcpu=core2 -mtriple=x86_64-pc-win32 -o - -O0 < %s | llvm-mc -triple=x86_64-pc-win32 -filetype=obj | llvm-readobj -s -sr -codeview -section-symbols | FileCheck --check-prefix=OBJ64 %s
; This LL file was generated by running clang on the following code: ; This LL file was generated by running clang on the following code:
; D:\source.c: ; D:\source.c:

View File

@ -1,7 +1,7 @@
; RUN: llc -mcpu=core2 -mtriple=i686-pc-win32 -O0 < %s | FileCheck --check-prefix=X86 %s ; RUN: llc -mcpu=core2 -mtriple=i686-pc-win32 -O0 < %s | FileCheck --check-prefix=X86 %s
; RUN: llc -mcpu=core2 -mtriple=i686-pc-win32 -o - -O0 < %s | llvm-mc -triple=i686-pc-win32 -filetype=obj | llvm-readobj -s -sr -codeview-linetables | FileCheck --check-prefix=OBJ32 %s ; RUN: llc -mcpu=core2 -mtriple=i686-pc-win32 -o - -O0 < %s | llvm-mc -triple=i686-pc-win32 -filetype=obj | llvm-readobj -s -sr -codeview -section-symbols | FileCheck --check-prefix=OBJ32 %s
; RUN: llc -mcpu=core2 -mtriple=x86_64-pc-win32 -O0 < %s | FileCheck --check-prefix=X64 %s ; RUN: llc -mcpu=core2 -mtriple=x86_64-pc-win32 -O0 < %s | FileCheck --check-prefix=X64 %s
; RUN: llc -mcpu=core2 -mtriple=x86_64-pc-win32 -o - -O0 < %s | llvm-mc -triple=x86_64-pc-win32 -filetype=obj | llvm-readobj -s -sr -codeview-linetables | FileCheck --check-prefix=OBJ64 %s ; RUN: llc -mcpu=core2 -mtriple=x86_64-pc-win32 -o - -O0 < %s | llvm-mc -triple=x86_64-pc-win32 -filetype=obj | llvm-readobj -s -sr -codeview -section-symbols | FileCheck --check-prefix=OBJ64 %s
; This LL file was generated by running clang on the following code: ; This LL file was generated by running clang on the following code:
; D:\test.c: ; D:\test.c:

View File

@ -18,16 +18,16 @@
; z(); ; z();
; } ; }
; using 32-/64-bit versions of CL v17.00.61030 and v18.00.21005.1 respectively. ; using 32-/64-bit versions of CL v17.00.61030 and v18.00.21005.1 respectively.
RUN: llvm-readobj -s -codeview-linetables %p/Inputs/multifunction-linetables.obj.coff-2012-i368 \ RUN: llvm-readobj -s -codeview -section-symbols %p/Inputs/multifunction-linetables.obj.coff-2012-i368 \
RUN: | FileCheck %s -check-prefix MFUN32 RUN: | FileCheck %s -check-prefix MFUN32
RUN: llvm-readobj -s -codeview-linetables %p/Inputs/multifunction-linetables.obj.coff-2013-i368 \ RUN: llvm-readobj -s -codeview -section-symbols %p/Inputs/multifunction-linetables.obj.coff-2013-i368 \
RUN: | FileCheck %s -check-prefix MFUN32 RUN: | FileCheck %s -check-prefix MFUN32
RUN: llvm-readobj -s -codeview-linetables %p/Inputs/multifunction-linetables.obj.coff-2012-x86_64 \ RUN: llvm-readobj -s -codeview -section-symbols %p/Inputs/multifunction-linetables.obj.coff-2012-x86_64 \
RUN: | FileCheck %s -check-prefix MFUN64 RUN: | FileCheck %s -check-prefix MFUN64
RUN: llvm-readobj -s -codeview-linetables %p/Inputs/multifunction-linetables.obj.coff-2013-x86_64 \ RUN: llvm-readobj -s -codeview -section-symbols %p/Inputs/multifunction-linetables.obj.coff-2013-x86_64 \
RUN: | FileCheck %s -check-prefix MFUN64 RUN: | FileCheck %s -check-prefix MFUN64
MFUN32: CodeViewLineTables [ MFUN32: CodeViewDebugInfo [
MFUN32-NEXT: Magic: 0x4 MFUN32-NEXT: Magic: 0x4
MFUN32-NEXT: Subsection [ MFUN32-NEXT: Subsection [
MFUN32-NEXT: Type: 0xF1 MFUN32-NEXT: Type: 0xF1
@ -136,7 +136,7 @@ MFUN32-NEXT: ]
MFUN32-NEXT: ] MFUN32-NEXT: ]
MFUN32-NEXT: ] MFUN32-NEXT: ]
MFUN64: CodeViewLineTables [ MFUN64: CodeViewDebugInfo [
MFUN64-NEXT: Magic: 0x4 MFUN64-NEXT: Magic: 0x4
MFUN64-NEXT: Subsection [ MFUN64-NEXT: Subsection [
MFUN64-NEXT: Type: 0xF1 MFUN64-NEXT: Type: 0xF1
@ -248,16 +248,16 @@ MFUN64-NEXT: ]
; g(); ; g();
; } ; }
; using 32-/64-bit versions of CL v17.00.61030 and v18.00.21005.1 respectively. ; using 32-/64-bit versions of CL v17.00.61030 and v18.00.21005.1 respectively.
RUN: llvm-readobj -s -codeview-linetables %p/Inputs/multifile-linetables.obj.coff-2012-i368 \ RUN: llvm-readobj -s -codeview -section-symbols %p/Inputs/multifile-linetables.obj.coff-2012-i368 \
RUN: | FileCheck %s -check-prefix MFILE32 RUN: | FileCheck %s -check-prefix MFILE32
RUN: llvm-readobj -s -codeview-linetables %p/Inputs/multifile-linetables.obj.coff-2013-i368 \ RUN: llvm-readobj -s -codeview -section-symbols %p/Inputs/multifile-linetables.obj.coff-2013-i368 \
RUN: | FileCheck %s -check-prefix MFILE32 RUN: | FileCheck %s -check-prefix MFILE32
RUN: llvm-readobj -s -codeview-linetables %p/Inputs/multifile-linetables.obj.coff-2012-x86_64 \ RUN: llvm-readobj -s -codeview -section-symbols %p/Inputs/multifile-linetables.obj.coff-2012-x86_64 \
RUN: | FileCheck %s -check-prefix MFILE64 RUN: | FileCheck %s -check-prefix MFILE64
RUN: llvm-readobj -s -codeview-linetables %p/Inputs/multifile-linetables.obj.coff-2013-x86_64 \ RUN: llvm-readobj -s -codeview -section-symbols %p/Inputs/multifile-linetables.obj.coff-2013-x86_64 \
RUN: | FileCheck %s -check-prefix MFILE64 RUN: | FileCheck %s -check-prefix MFILE64
MFILE32: CodeViewLineTables [ MFILE32: CodeViewDebugInfo [
MFILE32-NEXT: Magic: 0x4 MFILE32-NEXT: Magic: 0x4
MFILE32-NEXT: Subsection [ MFILE32-NEXT: Subsection [
MFILE32-NEXT: Type: 0xF1 MFILE32-NEXT: Type: 0xF1
@ -317,7 +317,7 @@ MFILE32-NEXT: ]
MFILE32-NEXT: ] MFILE32-NEXT: ]
MFILE32-NEXT: ] MFILE32-NEXT: ]
MFILE64: CodeViewLineTables [ MFILE64: CodeViewDebugInfo [
MFILE64-NEXT: Magic: 0x4 MFILE64-NEXT: Magic: 0x4
MFILE64-NEXT: Subsection [ MFILE64-NEXT: Subsection [
MFILE64-NEXT: Type: 0xF1 MFILE64-NEXT: Type: 0xF1
@ -387,9 +387,9 @@ MFILE64-NEXT: ]
; return 0; ; return 0;
; } ; }
; using 32-version of CL v17.00.61030 and v18.00.21005.1 respectively. ; using 32-version of CL v17.00.61030 and v18.00.21005.1 respectively.
RUN: llvm-readobj -s -codeview-linetables %p/Inputs/comdat-function-linetables.obj.coff-2012-i386 \ RUN: llvm-readobj -s -codeview -section-symbols %p/Inputs/comdat-function-linetables.obj.coff-2012-i386 \
RUN: | FileCheck %s -check-prefix MCOMDAT RUN: | FileCheck %s -check-prefix MCOMDAT
RUN: llvm-readobj -s -codeview-linetables %p/Inputs/comdat-function-linetables.obj.coff-2013-i386 \ RUN: llvm-readobj -s -codeview -section-symbols %p/Inputs/comdat-function-linetables.obj.coff-2013-i386 \
RUN: | FileCheck %s -check-prefix MCOMDAT RUN: | FileCheck %s -check-prefix MCOMDAT
MCOMDAT: ProcStart { MCOMDAT: ProcStart {

View File

@ -71,7 +71,7 @@ private:
void printBaseOfDataField(const pe32_header *Hdr); void printBaseOfDataField(const pe32_header *Hdr);
void printBaseOfDataField(const pe32plus_header *Hdr); void printBaseOfDataField(const pe32plus_header *Hdr);
void printCodeViewLineTables(const SectionRef &Section); void printCodeViewDebugInfo(const SectionRef &Section);
void printCodeViewSymbolsSubsection(StringRef Subsection, void printCodeViewSymbolsSubsection(StringRef Subsection,
const SectionRef &Section, const SectionRef &Section,
@ -469,7 +469,7 @@ void COFFDumper::printBaseOfDataField(const pe32_header *Hdr) {
void COFFDumper::printBaseOfDataField(const pe32plus_header *) {} void COFFDumper::printBaseOfDataField(const pe32plus_header *) {}
void COFFDumper::printCodeViewLineTables(const SectionRef &Section) { void COFFDumper::printCodeViewDebugInfo(const SectionRef &Section) {
StringRef Data; StringRef Data;
if (error(Section.getContents(Data))) if (error(Section.getContents(Data)))
return; return;
@ -477,7 +477,7 @@ void COFFDumper::printCodeViewLineTables(const SectionRef &Section) {
SmallVector<StringRef, 10> FunctionNames; SmallVector<StringRef, 10> FunctionNames;
StringMap<StringRef> FunctionLineTables; StringMap<StringRef> FunctionLineTables;
ListScope D(W, "CodeViewLineTables"); ListScope D(W, "CodeViewDebugInfo");
{ {
// FIXME: Add more offset correctness checks. // FIXME: Add more offset correctness checks.
DataExtractor DE(Data, true, 4); DataExtractor DE(Data, true, 4);
@ -503,14 +503,17 @@ void COFFDumper::printCodeViewLineTables(const SectionRef &Section) {
return; return;
} }
// Print the raw contents to simplify debugging if anything goes wrong
// afterwards.
StringRef Contents = Data.substr(Offset, PayloadSize); StringRef Contents = Data.substr(Offset, PayloadSize);
W.printBinaryBlock("Contents", Contents); if (opts::CodeViewSubsectionBytes) {
// Print the raw contents to simplify debugging if anything goes wrong
// afterwards.
W.printBinaryBlock("Contents", Contents);
}
switch (SubSectionType) { switch (SubSectionType) {
case COFF::DEBUG_SYMBOL_SUBSECTION: case COFF::DEBUG_SYMBOL_SUBSECTION:
printCodeViewSymbolsSubsection(Contents, Section, Offset); if (opts::SectionSymbols)
printCodeViewSymbolsSubsection(Contents, Section, Offset);
break; break;
case COFF::DEBUG_LINE_TABLE_SUBSECTION: { case COFF::DEBUG_LINE_TABLE_SUBSECTION: {
// Holds a PC to file:line table. Some data to parse this subsection is // Holds a PC to file:line table. Some data to parse this subsection is
@ -695,10 +698,20 @@ void COFFDumper::printCodeViewSymbolsSubsection(StringRef Subsection,
InFunctionScope = false; InFunctionScope = false;
break; break;
} }
default: default: {
if (opts::CodeViewSubsectionBytes) {
ListScope S(W, "Record");
W.printHex("Size", Size);
W.printHex("Type", Type);
StringRef Contents = DE.getData().substr(Offset, Size);
W.printBinaryBlock("Contents", Contents);
}
Offset += Size; Offset += Size;
break; break;
} }
}
} }
if (InFunctionScope) if (InFunctionScope)
@ -747,8 +760,8 @@ void COFFDumper::printSections() {
} }
} }
if (Name == ".debug$S" && opts::CodeViewLineTables) if (Name == ".debug$S" && opts::CodeView)
printCodeViewLineTables(Sec); printCodeViewDebugInfo(Sec);
if (opts::SectionData && if (opts::SectionData &&
!(Section->Characteristics & COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA)) { !(Section->Characteristics & COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA)) {

View File

@ -127,9 +127,14 @@ namespace opts {
cl::opt<bool> ExpandRelocs("expand-relocs", cl::opt<bool> ExpandRelocs("expand-relocs",
cl::desc("Expand each shown relocation to multiple lines")); cl::desc("Expand each shown relocation to multiple lines"));
// -codeview-linetables // -codeview
cl::opt<bool> CodeViewLineTables("codeview-linetables", cl::opt<bool> CodeView("codeview",
cl::desc("Display CodeView line table information")); cl::desc("Display CodeView debug information"));
// -codeview-subsection-bytes
cl::opt<bool> CodeViewSubsectionBytes(
"codeview-subsection-bytes",
cl::desc("Dump raw contents of codeview debug sections and records"));
// -arm-attributes, -a // -arm-attributes, -a
cl::opt<bool> ARMAttributes("arm-attributes", cl::opt<bool> ARMAttributes("arm-attributes",

View File

@ -36,7 +36,8 @@ namespace opts {
extern llvm::cl::opt<bool> DynamicSymbols; extern llvm::cl::opt<bool> DynamicSymbols;
extern llvm::cl::opt<bool> UnwindInfo; extern llvm::cl::opt<bool> UnwindInfo;
extern llvm::cl::opt<bool> ExpandRelocs; extern llvm::cl::opt<bool> ExpandRelocs;
extern llvm::cl::opt<bool> CodeViewLineTables; extern llvm::cl::opt<bool> CodeView;
extern llvm::cl::opt<bool> CodeViewSubsectionBytes;
extern llvm::cl::opt<bool> ARMAttributes; extern llvm::cl::opt<bool> ARMAttributes;
extern llvm::cl::opt<bool> MipsPLTGOT; extern llvm::cl::opt<bool> MipsPLTGOT;
} // namespace opts } // namespace opts