mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
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 llvm-svn: 229730
This commit is contained in:
parent
74f0557556
commit
68f80deaba
@ -664,16 +664,16 @@ namespace COFF {
|
||||
}
|
||||
};
|
||||
|
||||
enum CodeViewLineTableIdentifiers {
|
||||
DEBUG_SECTION_MAGIC = 0x4,
|
||||
DEBUG_SYMBOL_SUBSECTION = 0xF1,
|
||||
DEBUG_LINE_TABLE_SUBSECTION = 0xF2,
|
||||
enum CodeViewIdentifiers {
|
||||
DEBUG_SECTION_MAGIC = 0x4,
|
||||
DEBUG_SYMBOL_SUBSECTION = 0xF1,
|
||||
DEBUG_LINE_TABLE_SUBSECTION = 0xF2,
|
||||
DEBUG_STRING_TABLE_SUBSECTION = 0xF3,
|
||||
DEBUG_INDEX_SUBSECTION = 0xF4,
|
||||
DEBUG_INDEX_SUBSECTION = 0xF4,
|
||||
|
||||
// Symbol subsections are split into records of different types.
|
||||
DEBUG_SYMBOL_TYPE_PROC_START = 0x1147,
|
||||
DEBUG_SYMBOL_TYPE_PROC_END = 0x114F
|
||||
DEBUG_SYMBOL_TYPE_PROC_END = 0x114F
|
||||
};
|
||||
|
||||
inline bool isReservedSectionNumber(int32_t SectionNumber) {
|
||||
|
@ -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 -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 -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:
|
||||
; D:\asm.c:
|
||||
|
@ -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:
|
||||
; D:\src.cpp:
|
||||
|
@ -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 -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 -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:
|
||||
; D:\input.c:
|
||||
|
@ -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 -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 -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:
|
||||
; D:\source.c:
|
||||
|
@ -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 -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 -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:
|
||||
; D:\test.c:
|
||||
|
@ -18,16 +18,16 @@
|
||||
; z();
|
||||
; }
|
||||
; 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: 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: 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: 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
|
||||
|
||||
MFUN32: CodeViewLineTables [
|
||||
MFUN32: CodeViewDebugInfo [
|
||||
MFUN32-NEXT: Magic: 0x4
|
||||
MFUN32-NEXT: Subsection [
|
||||
MFUN32-NEXT: Type: 0xF1
|
||||
@ -136,7 +136,7 @@ MFUN32-NEXT: ]
|
||||
MFUN32-NEXT: ]
|
||||
MFUN32-NEXT: ]
|
||||
|
||||
MFUN64: CodeViewLineTables [
|
||||
MFUN64: CodeViewDebugInfo [
|
||||
MFUN64-NEXT: Magic: 0x4
|
||||
MFUN64-NEXT: Subsection [
|
||||
MFUN64-NEXT: Type: 0xF1
|
||||
@ -248,16 +248,16 @@ MFUN64-NEXT: ]
|
||||
; g();
|
||||
; }
|
||||
; 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: 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: 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: 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
|
||||
|
||||
MFILE32: CodeViewLineTables [
|
||||
MFILE32: CodeViewDebugInfo [
|
||||
MFILE32-NEXT: Magic: 0x4
|
||||
MFILE32-NEXT: Subsection [
|
||||
MFILE32-NEXT: Type: 0xF1
|
||||
@ -317,7 +317,7 @@ MFILE32-NEXT: ]
|
||||
MFILE32-NEXT: ]
|
||||
MFILE32-NEXT: ]
|
||||
|
||||
MFILE64: CodeViewLineTables [
|
||||
MFILE64: CodeViewDebugInfo [
|
||||
MFILE64-NEXT: Magic: 0x4
|
||||
MFILE64-NEXT: Subsection [
|
||||
MFILE64-NEXT: Type: 0xF1
|
||||
@ -387,9 +387,9 @@ MFILE64-NEXT: ]
|
||||
; return 0;
|
||||
; }
|
||||
; 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: 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
|
||||
|
||||
MCOMDAT: ProcStart {
|
||||
|
@ -71,7 +71,7 @@ private:
|
||||
void printBaseOfDataField(const pe32_header *Hdr);
|
||||
void printBaseOfDataField(const pe32plus_header *Hdr);
|
||||
|
||||
void printCodeViewLineTables(const SectionRef &Section);
|
||||
void printCodeViewDebugInfo(const SectionRef &Section);
|
||||
|
||||
void printCodeViewSymbolsSubsection(StringRef Subsection,
|
||||
const SectionRef &Section,
|
||||
@ -469,7 +469,7 @@ void COFFDumper::printBaseOfDataField(const pe32_header *Hdr) {
|
||||
|
||||
void COFFDumper::printBaseOfDataField(const pe32plus_header *) {}
|
||||
|
||||
void COFFDumper::printCodeViewLineTables(const SectionRef &Section) {
|
||||
void COFFDumper::printCodeViewDebugInfo(const SectionRef &Section) {
|
||||
StringRef Data;
|
||||
if (error(Section.getContents(Data)))
|
||||
return;
|
||||
@ -477,7 +477,7 @@ void COFFDumper::printCodeViewLineTables(const SectionRef &Section) {
|
||||
SmallVector<StringRef, 10> FunctionNames;
|
||||
StringMap<StringRef> FunctionLineTables;
|
||||
|
||||
ListScope D(W, "CodeViewLineTables");
|
||||
ListScope D(W, "CodeViewDebugInfo");
|
||||
{
|
||||
// FIXME: Add more offset correctness checks.
|
||||
DataExtractor DE(Data, true, 4);
|
||||
@ -503,14 +503,17 @@ void COFFDumper::printCodeViewLineTables(const SectionRef &Section) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Print the raw contents to simplify debugging if anything goes wrong
|
||||
// afterwards.
|
||||
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) {
|
||||
case COFF::DEBUG_SYMBOL_SUBSECTION:
|
||||
printCodeViewSymbolsSubsection(Contents, Section, Offset);
|
||||
if (opts::SectionSymbols)
|
||||
printCodeViewSymbolsSubsection(Contents, Section, Offset);
|
||||
break;
|
||||
case COFF::DEBUG_LINE_TABLE_SUBSECTION: {
|
||||
// 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;
|
||||
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;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (InFunctionScope)
|
||||
@ -747,8 +760,8 @@ void COFFDumper::printSections() {
|
||||
}
|
||||
}
|
||||
|
||||
if (Name == ".debug$S" && opts::CodeViewLineTables)
|
||||
printCodeViewLineTables(Sec);
|
||||
if (Name == ".debug$S" && opts::CodeView)
|
||||
printCodeViewDebugInfo(Sec);
|
||||
|
||||
if (opts::SectionData &&
|
||||
!(Section->Characteristics & COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA)) {
|
||||
|
@ -127,9 +127,14 @@ namespace opts {
|
||||
cl::opt<bool> ExpandRelocs("expand-relocs",
|
||||
cl::desc("Expand each shown relocation to multiple lines"));
|
||||
|
||||
// -codeview-linetables
|
||||
cl::opt<bool> CodeViewLineTables("codeview-linetables",
|
||||
cl::desc("Display CodeView line table information"));
|
||||
// -codeview
|
||||
cl::opt<bool> CodeView("codeview",
|
||||
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
|
||||
cl::opt<bool> ARMAttributes("arm-attributes",
|
||||
|
@ -36,7 +36,8 @@ namespace opts {
|
||||
extern llvm::cl::opt<bool> DynamicSymbols;
|
||||
extern llvm::cl::opt<bool> UnwindInfo;
|
||||
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> MipsPLTGOT;
|
||||
} // namespace opts
|
||||
|
Loading…
Reference in New Issue
Block a user