summaryrefslogtreecommitdiffstats
path: root/llvm/test/tools
diff options
context:
space:
mode:
authorJordan Rupprecht <rupprecht@google.com>2019-08-13 14:38:45 +0000
committerJordan Rupprecht <rupprecht@google.com>2019-08-13 14:38:45 +0000
commit63ac3e5cbe0394ae3cf563f0d13f71ca07b129cf (patch)
treedd3ba5e7f0fd62535bea9fc4278fa6396206a37f /llvm/test/tools
parent941660299ac6d30919af9d943794a2ac516112fc (diff)
downloadbcm5719-llvm-63ac3e5cbe0394ae3cf563f0d13f71ca07b129cf.tar.gz
bcm5719-llvm-63ac3e5cbe0394ae3cf563f0d13f71ca07b129cf.zip
[llvm-readelf] Implement note parsing for NT_FILE and unknown descriptors
Summary: This patch implements two note parsers; one for NT_FILE coredumps, e.g.: ``` CORE 0x00000080 NT_FILE (mapped files) Page size: 4096 Start End Page Offset 0x0000000000001000 0x0000000000002000 0x0000000000003000 /path/to/a.out 0x0000000000004000 0x0000000000005000 0x0000000000006000 /path/to/libc.so 0x0000000000007000 0x0000000000008000 0x0000000000009000 [stack] ``` (A more realistic example can be tested locally by creating a crashing program and running `llvm-readelf -n core`) And also implements a raw hex dump for unknown descriptor data for unhandled descriptor types. Reviewers: MaskRay, jhenderson, grimar, alexshap Reviewed By: MaskRay, grimar Subscribers: emaste, llvm-commits, labath Tags: #llvm Differential Revision: https://reviews.llvm.org/D65832 llvm-svn: 368698
Diffstat (limited to 'llvm/test/tools')
-rw-r--r--llvm/test/tools/llvm-readobj/note-amd.s4
-rw-r--r--llvm/test/tools/llvm-readobj/note-core-ntfile-bad.test146
-rw-r--r--llvm/test/tools/llvm-readobj/note-core-ntfile.test95
-rw-r--r--llvm/test/tools/llvm-readobj/note-freebsd.s29
-rw-r--r--llvm/test/tools/llvm-readobj/note-unknown.s27
5 files changed, 295 insertions, 6 deletions
diff --git a/llvm/test/tools/llvm-readobj/note-amd.s b/llvm/test/tools/llvm-readobj/note-amd.s
index ddf86add346..df82b16b782 100644
--- a/llvm/test/tools/llvm-readobj/note-amd.s
+++ b/llvm/test/tools/llvm-readobj/note-amd.s
@@ -9,21 +9,17 @@
// GNU-NEXT: AMD 0x00000000 NT_AMD_AMDGPU_HSA_METADATA (HSA Metadata)
// GNU-NEXT: HSA Metadata:
// GNU-NEXT: {{^ +$}}
-// GNU-EMPTY:
// GNU-NEXT: AMD 0x00000000 NT_AMD_AMDGPU_ISA (ISA Version)
// GNU-NEXT: ISA Version:
// GNU-NEXT: {{^ +$}}
-// GNU-EMPTY:
// GNU-NEXT: Displaying notes found
// GNU-NEXT: Owner Data size Description
// GNU-NEXT: AMD 0x0000000a NT_AMD_AMDGPU_HSA_METADATA (HSA Metadata)
// GNU-NEXT: HSA Metadata:
// GNU-NEXT: meta_blah
-// GNU-EMPTY:
// GNU-NEXT: AMD 0x00000009 NT_AMD_AMDGPU_ISA (ISA Version)
// GNU-NEXT: ISA Version:
// GNU-NEXT: isa_blah
-// GNU-EMPTY:
// GNU-NEXT: Displaying notes found
// GNU-NEXT: Owner Data size Description
// GNU-NEXT: AMD 0x00000000 NT_AMD_AMDGPU_PAL_METADATA (PAL Metadata)
diff --git a/llvm/test/tools/llvm-readobj/note-core-ntfile-bad.test b/llvm/test/tools/llvm-readobj/note-core-ntfile-bad.test
new file mode 100644
index 00000000000..7759c55a736
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/note-core-ntfile-bad.test
@@ -0,0 +1,146 @@
+## Test that malformed NT_FILE sections in core files are gracefully ignored.
+
+## llvm-mc doesn't support generating ET_CORE files; the 'Content' field in
+## each of the following test cases were generated with the following steps:
+# $ llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu tmp.s -o tmp.o
+# $ bin/llvm-objcopy --dump-section=.note.foo=tmp.txt tmp.o /dev/null
+# $ xxd -p tmp.txt | tr -d '\n'; echo
+# using the assembly shown with each test case.
+
+# RUN: yaml2obj --docnum=1 %s -o %t1.o
+# RUN: llvm-readelf -n %t1.o 2>&1 | FileCheck %s --check-prefix=ERR-HEADER-SHORT
+# ERR-HEADER-SHORT: warning: malformed note: header too short
+
+# .section ".note.foo", "a"
+# .align 4
+# .long 5 /* namesz */
+# .long end - begin /* descsz */
+# .long 0x46494c45 /* type = NT_FILE */
+# .asciz "CORE"
+# .align 4
+# begin:
+# .quad 0 /* no file mappings */
+# end:
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_CORE
+ Machine: EM_X86_64
+Sections:
+ - Name: .note.foo
+ Type: SHT_NOTE
+ Content: 0500000008000000454C4946434F5245000000000000000000000000
+ProgramHeaders:
+ - Type: PT_NOTE
+ Sections:
+ - Section: .note.foo
+
+# RUN: yaml2obj --docnum=2 %s -o %t2.o
+# RUN: llvm-readelf -n %t2.o 2>&1 | FileCheck %s --check-prefix=ERR-NULL-TERM
+# ERR-NULL-TERM: warning: malformed note: not NUL terminated
+
+# .section ".note.foo", "a"
+# .align 4
+# .long 5 /* namesz */
+# .long end - begin /* descsz */
+# .long 0x46494c45 /* type = NT_FILE */
+# .asciz "CORE"
+# .align 4
+# begin:
+# .quad 1 /* 1 file mapping */
+# .quad 4096 /* page size */
+# .quad 0x1000 /* start #1 */
+# .quad 0x2000 /* end #1 */
+# .quad 0x3000 /* offset #1 */
+# .ascii "xxxx"
+# end:
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_CORE
+ Machine: EM_X86_64
+Sections:
+ - Name: .note.foo
+ Type: SHT_NOTE
+ Content: 050000002C000000454C4946434F5245000000000100000000000000001000000000000000100000000000000020000000000000003000000000000078787878
+ProgramHeaders:
+ - Type: PT_NOTE
+ Sections:
+ - Section: .note.foo
+
+# RUN: yaml2obj --docnum=3 %s -o %t3.o
+# RUN: llvm-readelf -n %t3.o 2>&1 | FileCheck %s --check-prefix=ERR-FILE-COUNT
+# ERR-FILE-COUNT: warning: malformed note: too short for number of files
+
+# .section ".note.foo", "a"
+# .align 4
+# .long 5 /* namesz */
+# .long end - begin /* descsz */
+# .long 0x46494c45 /* type = NT_FILE */
+# .asciz "CORE"
+# .align 4
+# begin:
+# .quad 2 /* 2 file mappings */
+# .quad 4096 /* page size */
+# .quad 0x1000 /* start #1 */
+# .quad 0x2000 /* end #1 */
+# .quad 0x3000 /* offset #1 */
+# .asciz "xyz"
+# end:
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_CORE
+ Machine: EM_X86_64
+Sections:
+ - Name: .note.foo
+ Type: SHT_NOTE
+ Content: 050000002C000000454C4946434F5245000000000200000000000000001000000000000000100000000000000020000000000000003000000000000078797A00
+ProgramHeaders:
+ - Type: PT_NOTE
+ Sections:
+ - Section: .note.foo
+
+# RUN: yaml2obj --docnum=4 %s -o %t4.o
+# RUN: llvm-readelf -n %t4.o 2>&1 | FileCheck %s --check-prefix=ERR-FILE-END-EARLY
+# ERR-FILE-END-EARLY: warning: malformed note: too few filenames
+
+# .section ".note.foo", "a"
+# .align 4
+# .long 5 /* namesz */
+# .long end - begin /* descsz */
+# .long 0x46494c45 /* type = NT_FILE */
+# .asciz "CORE"
+# .align 4
+# begin:
+# .quad 2 /* 2 file mappings */
+# .quad 4096 /* page size */
+# .quad 0x1000 /* start #1 */
+# .quad 0x2000 /* end #1 */
+# .quad 0x3000 /* offset #1 */
+# .quad 0x4000 /* start #2 */
+# .quad 0x5000 /* end #2 */
+# .quad 0x6000 /* offset #2 */
+# .asciz "xyz"
+# end:
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_CORE
+ Machine: EM_X86_64
+Sections:
+ - Name: .note.foo
+ Type: SHT_NOTE
+ Content: 0500000044000000454C4946434F5245000000000200000000000000001000000000000000100000000000000020000000000000003000000000000000400000000000000050000000000000006000000000000078797A00
+ProgramHeaders:
+ - Type: PT_NOTE
+ Sections:
+ - Section: .note.foo
diff --git a/llvm/test/tools/llvm-readobj/note-core-ntfile.test b/llvm/test/tools/llvm-readobj/note-core-ntfile.test
new file mode 100644
index 00000000000..b5dc684dc42
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/note-core-ntfile.test
@@ -0,0 +1,95 @@
+## Test that NT_FILE sections in core files are interpreted correctly.
+
+# RUN: yaml2obj %s > %t.o
+# RUN: llvm-readelf --notes %t.o | FileCheck %s --check-prefix=GNU
+# RUN: llvm-readobj --notes %t.o | FileCheck %s --check-prefix=LLVM
+
+## llvm-mc doesn't support generating ET_CORE files; the 'Content' field was
+## generated with the following steps:
+# $ llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu tmp.s -o tmp.o
+# $ bin/llvm-objcopy --dump-section=.note.foo=tmp.txt tmp.o /dev/null
+# $ xxd -p tmp.txt | tr -d '\n'; echo
+## Using the following input:
+# .section ".note.foo", "a"
+# .align 4
+# .long 5 /* namesz */
+# .long end - begin /* descsz */
+# .long 0x46494c45 /* type = NT_FILE */
+# .asciz "CORE"
+# .align 4
+# begin:
+# .quad 3 /* 3 file mappings */
+# .quad 4096 /* page size */
+# .quad 0x1000 /* start #1 */
+# .quad 0x2000 /* end #1 */
+# .quad 0x3000 /* offset #1 */
+# .quad 0x4000 /* start #2 */
+# .quad 0x5000 /* end #2 */
+# .quad 0x6000 /* offset #2 */
+# .quad 0x7000 /* start #3 */
+# .quad 0x8000 /* end #3 */
+# .quad 0x9000 /* offset #3 */
+# .asciz "/path/to/a.out"
+# .asciz "/path/to/libc.so"
+# .asciz "[stack]"
+# .align 4
+# end:
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_CORE
+ Machine: EM_X86_64
+Sections:
+ - Name: .note.foo
+ Type: SHT_NOTE
+ Content: 0500000080000000454C4946434F524500000000030000000000000000100000000000000010000000000000002000000000000000300000000000000040000000000000005000000000000000600000000000000070000000000000008000000000000000900000000000002F706174682F746F2F612E6F7574002F706174682F746F2F6C6962632E736F005B737461636B5D00
+ProgramHeaders:
+ - Type: PT_NOTE
+ Sections:
+ - Section: .note.foo
+
+# GNU: Displaying notes found
+# GNU-NEXT: Owner Data size Description
+# GNU-NEXT: CORE 0x00000080 NT_FILE (mapped files)
+# GNU-NEXT: Page size: 4096
+# GNU-NEXT: Start End Page Offset
+# GNU-NEXT: 0x0000000000001000 0x0000000000002000 0x0000000000003000
+# GNU-NEXT: /path/to/a.out
+# GNU-NEXT: 0x0000000000004000 0x0000000000005000 0x0000000000006000
+# GNU-NEXT: /path/to/libc.so
+# GNU-NEXT: 0x0000000000007000 0x0000000000008000 0x0000000000009000
+# GNU-NEXT: [stack]
+# GNU-NOT: {{.}}
+
+# LLVM: Notes [
+# LLVM-NEXT: NoteSection {
+# LLVM-NEXT: Offset:
+# LLVM-NEXT: Size:
+# LLVM-NEXT: Note {
+# LLVM-NEXT: Owner: CORE
+# LLVM-NEXT: Data size: 0x80
+# LLVM-NEXT: Type: NT_FILE (mapped files)
+# LLVM-NEXT: Page Size: 4096
+# LLVM-NEXT: Mapping [
+# LLVM-NEXT: Start: 0x1000
+# LLVM-NEXT: End: 0x2000
+# LLVM-NEXT: Offset: 0x3000
+# LLVM-NEXT: Filename: /path/to/a.out
+# LLVM-NEXT: ]
+# LLVM-NEXT: Mapping [
+# LLVM-NEXT: Start: 0x4000
+# LLVM-NEXT: End: 0x5000
+# LLVM-NEXT: Offset: 0x6000
+# LLVM-NEXT: Filename: /path/to/libc.so
+# LLVM-NEXT: ]
+# LLVM-NEXT: Mapping [
+# LLVM-NEXT: Start: 0x7000
+# LLVM-NEXT: End: 0x8000
+# LLVM-NEXT: Offset: 0x9000
+# LLVM-NEXT: Filename: [stack]
+# LLVM-NEXT: ]
+# LLVM-NEXT: }
+# LLVM-NEXT: }
+# LLVM-NEXT: ]
diff --git a/llvm/test/tools/llvm-readobj/note-freebsd.s b/llvm/test/tools/llvm-readobj/note-freebsd.s
index 9549ca4256e..fbb7ac147d9 100644
--- a/llvm/test/tools/llvm-readobj/note-freebsd.s
+++ b/llvm/test/tools/llvm-readobj/note-freebsd.s
@@ -7,12 +7,14 @@
// GNU: Displaying notes found
// GNU-NEXT: Owner Data size Description
// GNU-NEXT: FreeBSD 0x00000000 NT_THRMISC (thrmisc structure)
-// GNU-EMPTY:
// GNU-NEXT: FreeBSD 0x00000000 NT_PROCSTAT_PROC (proc data)
-// GNU-EMPTY:
// GNU-NEXT: Displaying notes found
// GNU-NEXT: Owner Data size Description
// GNU-NEXT: FreeBSD 0x00000000 NT_PROCSTAT_FILES (files data)
+// GNU-NEXT: Displaying notes found
+// GNU-NEXT: Owner Data size Description
+// GNU-NEXT: FreeBSD 0x0000001c Unknown note type (0x00000003)
+// GNU-NEXT: description data: 4c 6f 72 65 6d 20 69 70 73 75 6d 20 64 6f 6c 6f 72 20 73 69 74 20 61 6d 65 74 00 00
// LLVM: Notes [
// LLVM-NEXT: NoteSection {
@@ -38,6 +40,19 @@
// LLVM-NEXT: Type: NT_PROCSTAT_FILES (files data)
// LLVM-NEXT: }
// LLVM-NEXT: }
+// LLVM-NEXT: NoteSection {
+// LLVM-NEXT: Offset: 0x7C
+// LLVM-NEXT: Size: 0x30
+// LLVM-NEXT: Note {
+// LLVM-NEXT: Owner: FreeBSD
+// LLVM-NEXT: Data size: 0x1C
+// LLVM-NEXT: Type: Unknown note type (0x00000003)
+// LLVM-NEXT: Description data (
+// LLVM-NEXT: 0000: 4C6F7265 6D206970 73756D20 646F6C6F |Lorem ipsum dolo|
+// LLVM-NEXT: 0010: 72207369 7420616D 65740000 |r sit amet..|
+// LLVM-NEXT: )
+// LLVM-NEXT: }
+// LLVM-NEXT: }
// LLVM-NEXT: ]
.section ".note.foo", "a"
@@ -56,3 +71,13 @@
.long 0 /* descsz */
.long 9 /* type = NT_FREEBSD_FILES */
.asciz "FreeBSD"
+.section ".note.baz", "a"
+ .align 4
+ .long 8 /* namesz */
+ .long end - begin /* descsz */
+ .long 3 /* type */
+ .asciz "FreeBSD"
+begin:
+ .asciz "Lorem ipsum dolor sit amet"
+ .align 4
+end:
diff --git a/llvm/test/tools/llvm-readobj/note-unknown.s b/llvm/test/tools/llvm-readobj/note-unknown.s
index 7b0696a1551..632db2880ea 100644
--- a/llvm/test/tools/llvm-readobj/note-unknown.s
+++ b/llvm/test/tools/llvm-readobj/note-unknown.s
@@ -7,6 +7,10 @@
// GNU: Displaying notes found at file offset 0x00000040 with length 0x00000010:
// GNU-NEXT: Owner Data size Description
// GNU-NEXT: XYZ 0x00000000 Unknown note type: (0x00000003)
+// GNU-NEXT: Displaying notes found at file offset 0x00000050 with length 0x0000002c:
+// GNU-NEXT: Owner Data size Description
+// GNU-NEXT: XYZ 0x0000001c Unknown note type: (0x00000003)
+// GNU-NEXT: description data: 4c 6f 72 65 6d 20 69 70 73 75 6d 20 64 6f 6c 6f 72 20 73 69 74 20 61 6d 65 74 00 00
// LLVM: Notes [
// LLVM-NEXT: NoteSection {
@@ -18,6 +22,19 @@
// LLVM-NEXT: Type: Unknown (0x00000003)
// LLVM-NEXT: }
// LLVM-NEXT: }
+// LLVM-NEXT: NoteSection {
+// LLVM-NEXT: Offset: 0x50
+// LLVM-NEXT: Size: 0x2C
+// LLVM-NEXT: Note {
+// LLVM-NEXT: Owner: XYZ
+// LLVM-NEXT: Data size: 0x1C
+// LLVM-NEXT: Type: Unknown (0x00000003)
+// LLVM-NEXT: Description data (
+// LLVM-NEXT: 0000: 4C6F7265 6D206970 73756D20 646F6C6F |Lorem ipsum dolo|
+// LLVM-NEXT: 0010: 72207369 7420616D 65740000 |r sit amet..|
+// LLVM-NEXT: )
+// LLVM-NEXT: }
+// LLVM-NEXT: }
// LLVM-NEXT: ]
.section ".note.foo", "a"
@@ -26,3 +43,13 @@
.long 0 /* descsz */
.long 3 /* type */
.asciz "XYZ"
+.section ".note.bar", "a"
+ .align 4
+ .long 4 /* namesz */
+ .long end - begin /* descsz */
+ .long 3 /* type */
+ .asciz "XYZ"
+begin:
+ .asciz "Lorem ipsum dolor sit amet"
+ .align 4
+end:
OpenPOWER on IntegriCloud