1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-24 03:33:20 +01:00

[llvm-readelf] Fix core note descriptions

Summary:
Core files have different descriptions for note values. llvm-readelf currently prints the generic note type, which is wrong when using it to read a core file.

To verify the constants/strings, see:
Values: https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=blob;f=include/elf/common.h;h=75c4fb7e9d7c0f780d635ac305f579546b7b071b;hb=HEAD#l571
Strings: https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=blob;f=binutils/readelf.c;h=c31a5c1266b7bb62a485895b01b49e1f832ade35;hb=HEAD#l16881

Note: this does not handle printing the note data for NT_FILE, it just fixes the descriptions.

Reviewers: MaskRay

Reviewed By: MaskRay

Subscribers: labath, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D65608

llvm-svn: 367878
This commit is contained in:
Jordan Rupprecht 2019-08-05 15:43:20 +00:00
parent 4d8baa8ffe
commit 5703017478
3 changed files with 175 additions and 2 deletions

View File

@ -1356,6 +1356,67 @@ enum : unsigned {
NT_GNU_BUILD_ATTRIBUTE_FUNC = 0x101,
};
// Core note types
enum : unsigned {
NT_PRSTATUS = 1,
NT_FPREGSET = 2,
NT_PRPSINFO = 3,
NT_TASKSTRUCT = 4,
NT_AUXV = 6,
NT_PSTATUS = 10,
NT_FPREGS = 12,
NT_PSINFO = 13,
NT_LWPSTATUS = 16,
NT_LWPSINFO = 17,
NT_WIN32PSTATUS = 18,
NT_PPC_VMX = 0x100,
NT_PPC_VSX = 0x102,
NT_PPC_TAR = 0x103,
NT_PPC_PPR = 0x104,
NT_PPC_DSCR = 0x105,
NT_PPC_EBB = 0x106,
NT_PPC_PMU = 0x107,
NT_PPC_TM_CGPR = 0x108,
NT_PPC_TM_CFPR = 0x109,
NT_PPC_TM_CVMX = 0x10a,
NT_PPC_TM_CVSX = 0x10b,
NT_PPC_TM_SPR = 0x10c,
NT_PPC_TM_CTAR = 0x10d,
NT_PPC_TM_CPPR = 0x10e,
NT_PPC_TM_CDSCR = 0x10f,
NT_386_TLS = 0x200,
NT_386_IOPERM = 0x201,
NT_X86_XSTATE = 0x202,
NT_S390_HIGH_GPRS = 0x300,
NT_S390_TIMER = 0x301,
NT_S390_TODCMP = 0x302,
NT_S390_TODPREG = 0x303,
NT_S390_CTRS = 0x304,
NT_S390_PREFIX = 0x305,
NT_S390_LAST_BREAK = 0x306,
NT_S390_SYSTEM_CALL = 0x307,
NT_S390_TDB = 0x308,
NT_S390_VXRS_LOW = 0x309,
NT_S390_VXRS_HIGH = 0x30a,
NT_S390_GS_CB = 0x30b,
NT_S390_GS_BC = 0x30c,
NT_ARM_VFP = 0x400,
NT_ARM_TLS = 0x401,
NT_ARM_HW_BREAK = 0x402,
NT_ARM_HW_WATCH = 0x403,
NT_ARM_SVE = 0x405,
NT_ARM_PAC_MASK = 0x406,
NT_FILE = 0x46494c45,
NT_PRXFPREG = 0x46e62b7f,
NT_SIGINFO = 0x53494749,
};
// GNU note types
enum {
NT_GNU_ABI_TAG = 1,
NT_GNU_HWCAP = 2,

View File

@ -0,0 +1,28 @@
## Test that note values are interpreted correctly for core files.
# RUN: yaml2obj %s > %t.o
# RUN: llvm-readelf --notes %t.o 2>&1 | FileCheck %s
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_CORE
Machine: EM_X86_64
Sections:
- Name: .note.foo
Type: SHT_NOTE
# Note: format is 0500000000000000<NT_FOO value>434F524500000000 repeated
Content: 050000000000000001000000434F524500000000050000000000000002000000434F524500000000050000000000000003000000434F524500000000050000000000000004000000434F524500000000050000000000000006000000434F524500000000
ProgramHeaders:
- Type: PT_NOTE
Sections:
- Section: .note.foo
# CHECK: Displaying notes found
# CHECK-NEXT: Owner Data size Description
# CHECK-NEXT: CORE 0x00000000 NT_PRSTATUS (prstatus structure)
# CHECK-NEXT: CORE 0x00000000 NT_FPREGSET (floating point registers)
# CHECK-NEXT: CORE 0x00000000 NT_PRPSINFO (prpsinfo structure)
# CHECK-NEXT: CORE 0x00000000 NT_TASKSTRUCT (task structure)
# CHECK-NEXT: CORE 0x00000000 NT_AUXV (auxiliary vector)

View File

@ -3846,6 +3846,86 @@ static StringRef getGenericNoteTypeName(const uint32_t NT) {
return "";
}
static StringRef getCoreNoteTypeName(const uint32_t NT) {
static const struct {
uint32_t ID;
const char *Name;
} Notes[] = {
{ELF::NT_PRSTATUS, "NT_PRSTATUS (prstatus structure)"},
{ELF::NT_FPREGSET, "NT_FPREGSET (floating point registers)"},
{ELF::NT_PRPSINFO, "NT_PRPSINFO (prpsinfo structure)"},
{ELF::NT_TASKSTRUCT, "NT_TASKSTRUCT (task structure)"},
{ELF::NT_AUXV, "NT_AUXV (auxiliary vector)"},
{ELF::NT_PSTATUS, "NT_PSTATUS (pstatus structure)"},
{ELF::NT_FPREGS, "NT_FPREGS (floating point registers)"},
{ELF::NT_PSINFO, "NT_PSINFO (psinfo structure)"},
{ELF::NT_LWPSTATUS, "NT_LWPSTATUS (lwpstatus_t structure)"},
{ELF::NT_LWPSINFO, "NT_LWPSINFO (lwpsinfo_t structure)"},
{ELF::NT_WIN32PSTATUS, "NT_WIN32PSTATUS (win32_pstatus structure)"},
{ELF::NT_PPC_VMX, "NT_PPC_VMX (ppc Altivec registers)"},
{ELF::NT_PPC_VSX, "NT_PPC_VSX (ppc VSX registers)"},
{ELF::NT_PPC_TAR, "NT_PPC_TAR (ppc TAR register)"},
{ELF::NT_PPC_PPR, "NT_PPC_PPR (ppc PPR register)"},
{ELF::NT_PPC_DSCR, "NT_PPC_DSCR (ppc DSCR register)"},
{ELF::NT_PPC_EBB, "NT_PPC_EBB (ppc EBB registers)"},
{ELF::NT_PPC_PMU, "NT_PPC_PMU (ppc PMU registers)"},
{ELF::NT_PPC_TM_CGPR, "NT_PPC_TM_CGPR (ppc checkpointed GPR registers)"},
{ELF::NT_PPC_TM_CFPR,
"NT_PPC_TM_CFPR (ppc checkpointed floating point registers)"},
{ELF::NT_PPC_TM_CVMX,
"NT_PPC_TM_CVMX (ppc checkpointed Altivec registers)"},
{ELF::NT_PPC_TM_CVSX, "NT_PPC_TM_CVSX (ppc checkpointed VSX registers)"},
{ELF::NT_PPC_TM_SPR, "NT_PPC_TM_SPR (ppc TM special purpose registers)"},
{ELF::NT_PPC_TM_CTAR, "NT_PPC_TM_CTAR (ppc checkpointed TAR register)"},
{ELF::NT_PPC_TM_CPPR, "NT_PPC_TM_CPPR (ppc checkpointed PPR register)"},
{ELF::NT_PPC_TM_CDSCR,
"NT_PPC_TM_CDSCR (ppc checkpointed DSCR register)"},
{ELF::NT_386_TLS, "NT_386_TLS (x86 TLS information)"},
{ELF::NT_386_IOPERM, "NT_386_IOPERM (x86 I/O permissions)"},
{ELF::NT_X86_XSTATE, "NT_X86_XSTATE (x86 XSAVE extended state)"},
{ELF::NT_S390_HIGH_GPRS,
"NT_S390_HIGH_GPRS (s390 upper register halves)"},
{ELF::NT_S390_TIMER, "NT_S390_TIMER (s390 timer register)"},
{ELF::NT_S390_TODCMP, "NT_S390_TODCMP (s390 TOD comparator register)"},
{ELF::NT_S390_TODPREG,
"NT_S390_TODPREG (s390 TOD programmable register)"},
{ELF::NT_S390_CTRS, "NT_S390_CTRS (s390 control registers)"},
{ELF::NT_S390_PREFIX, "NT_S390_PREFIX (s390 prefix register)"},
{ELF::NT_S390_LAST_BREAK,
"NT_S390_LAST_BREAK (s390 last breaking event address)"},
{ELF::NT_S390_SYSTEM_CALL,
"NT_S390_SYSTEM_CALL (s390 system call restart data)"},
{ELF::NT_S390_TDB, "NT_S390_TDB (s390 transaction diagnostic block)"},
{ELF::NT_S390_VXRS_LOW,
"NT_S390_VXRS_LOW (s390 vector registers 0-15 upper half)"},
{ELF::NT_S390_VXRS_HIGH,
"NT_S390_VXRS_HIGH (s390 vector registers 16-31)"},
{ELF::NT_S390_GS_CB, "NT_S390_GS_CB (s390 guarded-storage registers)"},
{ELF::NT_S390_GS_BC,
"NT_S390_GS_BC (s390 guarded-storage broadcast control)"},
{ELF::NT_ARM_VFP, "NT_ARM_VFP (arm VFP registers)"},
{ELF::NT_ARM_TLS, "NT_ARM_TLS (AArch TLS registers)"},
{ELF::NT_ARM_HW_BREAK,
"NT_ARM_HW_BREAK (AArch hardware breakpoint registers)"},
{ELF::NT_ARM_HW_WATCH,
"NT_ARM_HW_WATCH (AArch hardware watchpoint registers)"},
{ELF::NT_FILE, "NT_FILE (mapped files)"},
{ELF::NT_PRXFPREG, "NT_PRXFPREG (user_xfpregs structure)"},
{ELF::NT_SIGINFO, "NT_SIGINFO (siginfo_t data)"},
};
for (const auto &Note : Notes)
if (Note.ID == NT)
return Note.Name;
return "";
}
static std::string getGNUNoteTypeName(const uint32_t NT) {
static const struct {
uint32_t ID;
@ -4236,7 +4316,9 @@ void GNUStyle<ELFT>::printNotes(const ELFFile<ELFT> *Obj) {
if (!N.Type.empty())
OS << " " << N.Type << ":\n " << N.Value << '\n';
} else {
StringRef NoteType = getGenericNoteTypeName(Type);
StringRef NoteType = Obj->getHeader()->e_type == ELF::ET_CORE
? getCoreNoteTypeName(Type)
: getGenericNoteTypeName(Type);
if (!NoteType.empty())
OS << NoteType;
else
@ -5081,7 +5163,9 @@ void LLVMStyle<ELFT>::printNotes(const ELFFile<ELFT> *Obj) {
if (!N.Type.empty())
W.printString(N.Type, N.Value);
} else {
StringRef NoteType = getGenericNoteTypeName(Type);
StringRef NoteType = Obj->getHeader()->e_type == ELF::ET_CORE
? getCoreNoteTypeName(Type)
: getGenericNoteTypeName(Type);
if (!NoteType.empty())
W.printString("Type", NoteType);
else