summaryrefslogtreecommitdiffstats
path: root/llvm/test/tools/llvm-readobj/ELF
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/test/tools/llvm-readobj/ELF')
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/AArch64/aarch64-note-gnu-property.s38
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/AArch64/dwarf-cfi.s25
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/AArch64/lit.local.cfg2
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/ARM/attribute-0.s241
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/ARM/attribute-1.s227
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/ARM/attribute-10.s24
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/ARM/attribute-11.s24
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/ARM/attribute-12.s24
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/ARM/attribute-13.s10
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/ARM/attribute-136.s10
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/ARM/attribute-14.s10
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/ARM/attribute-15.s10
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/ARM/attribute-2.s178
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/ARM/attribute-3.s108
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/ARM/attribute-4.s66
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/ARM/attribute-5.s52
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/ARM/attribute-6.s52
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/ARM/attribute-7.s38
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/ARM/attribute-8.s31
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/ARM/attribute-9.s24
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/ARM/attribute-A.s10
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/ARM/attribute-M.s10
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/ARM/attribute-R.s10
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/ARM/attribute-S.s10
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/ARM/attribute-conformance-1.s10
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/ARM/attribute-conformance-2.s10
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/ARM/dwarf-cfi.s27
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/ARM/lit.local.cfg2
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/ARM/unwind.s329
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/Inputs/abiflags.obj.elf-mipsbin0 -> 920 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/Inputs/abiflags.obj.elf-mipselbin0 -> 1320 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/Inputs/compression.zlib.style.elf-x86-64bin0 -> 10384 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/Inputs/dynamic-table-exe.mipsbin0 -> 6333 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/Inputs/dynamic-table-so.mipsbin0 -> 5395 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/Inputs/dynamic-table-so.x86bin0 -> 8256 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/Inputs/dynamic-table.c14
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/Inputs/elf-dynamic-tags-machine-specific.yaml276
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/Inputs/elf-packed-relocs1.s37
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/Inputs/elf-packed-relocs2.s15
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/Inputs/elf-packed-relocs3.s31
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/Inputs/elf-relr-relocs1.s5
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/Inputs/elf-relr-relocs2.s5
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/Inputs/gnuhash.so.elf-i386bin0 -> 1080 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/Inputs/gnuhash.so.elf-ppcbin0 -> 1204 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/Inputs/gnuhash.so.elf-ppc64bin0 -> 1784 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/Inputs/gnuhash.so.elf-x86_64bin0 -> 1616 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/Inputs/got-empty.exe.mipselbin0 -> 9400 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/Inputs/got-over.exe.elf-mipsbin0 -> 1648 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/Inputs/got-plt.exe.elf-mipselbin0 -> 6209 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/Inputs/got-static.exe.mipsbin0 -> 1168 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/Inputs/got-tls.so.elf-mips64elbin0 -> 7398 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/Inputs/mips-options.elf-mips64elbin0 -> 9288 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/Inputs/mips-rld-map-rel.elf-mipselbin0 -> 2484 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/Inputs/options.obj.elf-mipselbin0 -> 1720 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/Inputs/phdrs-elf.exe-i386bin0 -> 7512 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/Inputs/phdrs-elf.exe-x86_64bin0 -> 9030 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/Inputs/ppc64.exebin0 -> 69520 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/Inputs/reginfo.obj.elf-mipselbin0 -> 490 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/Inputs/relocs.obj.elf-x86_64bin0 -> 1984 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/Inputs/rpath.exe.elf-x86_64bin0 -> 5632 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/Inputs/st-other.obj.elf-mipsbin0 -> 334 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/Inputs/st-other.obj.elf-mips16bin0 -> 334 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/Inputs/symbols-proc-specific.elf-hexagonbin0 -> 600 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/Inputs/trivial.ll21
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/Inputs/trivial.obj.elf-amdhsa-gfx803bin0 -> 2208 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/Inputs/trivial.obj.elf-i386bin0 -> 896 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/Inputs/trivial.obj.elf-mipselbin0 -> 629 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/Inputs/trivial.obj.elf-x86-64bin0 -> 1256 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/addrsig.test84
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/all.test115
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/amdgpu-elf-definitions.test11
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/broken-dynamic-reloc-name.test51
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/broken-dynsym-link.test68
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/broken-group.test80
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/check-output-order.test46
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/demangle.test227
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/dependent-libraries.test74
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/dyn-symbols.test286
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/dynamic-empty.test29
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/dynamic-malformed.test247
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/dynamic-no-pt-dynamic.test38
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/dynamic-not-in-pt-dynamic.test159
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/dynamic-table-dtnull.s87
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/dynamic-tags-machine-specific.test196
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/dynamic-tags.test287
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/file-headers.test139
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/file-name.test42
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/file-types.test154
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/gnu-file-headers.test81
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/gnu-note-size.test32
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/gnu-notes.test194
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/gnu-phdrs.test97
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/gnu-section-mapping-no-phdrs.test5
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/gnu-section-mapping-no-shdrs.test15
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/gnu-sections.test115
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/gnu-symbols.test57
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/gnuhash.test63
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/groups.test82
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/hash-histogram.test70
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/hash-symbols.test417
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/headers.test5
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/hex-dump-multi.s21
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/hidden-versym.test42
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/invalid-shstrndx.test26
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/linker-options.test59
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/loadname.test50
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/machine-specific-section-types.test95
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/malformed-pt-dynamic.test47
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/many-sections.s57
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/many-sections2.s24
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/merged.test13
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/mips-abiflags.test71
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/mips-got-overlapped.test45
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/mips-got.test486
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/mips-options-sec.test12
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/mips-options.test22
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/mips-plt.test64
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/mips-reginfo.test10
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/mips-rld-map-rel.test24
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/mips-st-other.test25
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/no-action.test50
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/no-phdrs.test24
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/no-relocs.test46
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/no-shdrs.test33
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/non-dynamic-in-pt-dynamic.test172
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/note-amd.s104
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/note-amdgpu.test85
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/note-core-ntfile-bad.test146
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/note-core-ntfile.test95
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/note-core.test61
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/note-freebsd.s83
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/note-generic.s85
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/note-gnu-property.s157
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/note-gnu-property2.s37
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/note-unknown.s55
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/packed-relocs-empty.s12
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/packed-relocs-error1.s7
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/packed-relocs-error2.s7
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/packed-relocs-error3.s9
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/packed-relocs-error4.s13
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/packed-relocs-error5.s13
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/packed-relocs.test141
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/ppc64-glink.test11
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/program-headers.test170
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/pt-gnu-property.test17
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/readelf-s-alias.test49
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/reloc-negative-addend-no-sym.test73
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/reloc-no-sym.test26
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/reloc-symbol-with-versioning.test108
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-aarch64.test392
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-arm.test419
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-i386.test237
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-lanai.test46
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-mips.test180
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-mips64.test282
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-ppc64.test293
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-x64.test232
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/reloc-zero-name-or-value.test109
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/relr-relocs.test174
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/rpath.test4
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/sec-compressed.test9
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/sec-flags.test67
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/section-symbols.test85
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/section-types.test245
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/stack-sizes.test666
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/string-dump-multi.s21
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/string-dump.test75
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/symbol-64bit.test23
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/symbol-binding.test59
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/symbol-shndx.test187
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/symbol-types.test120
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/symbol-visibility.test87
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/thin-archive-paths.test33
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/types.test116
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/unwind.test217
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/verdef-invalid.test310
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/verneed-flags.yaml107
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/verneed-invalid.test606
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/versioninfo.test297
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/versym-invalid.test220
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/wrong-shstrtab-type.test45
181 files changed, 14714 insertions, 0 deletions
diff --git a/llvm/test/tools/llvm-readobj/ELF/AArch64/aarch64-note-gnu-property.s b/llvm/test/tools/llvm-readobj/ELF/AArch64/aarch64-note-gnu-property.s
new file mode 100644
index 00000000000..693b6c93f35
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/AArch64/aarch64-note-gnu-property.s
@@ -0,0 +1,38 @@
+// RUN: llvm-mc -filetype=obj -triple aarch64-linux-gnu %s -o %t
+// RUN: llvm-readelf --notes %t | FileCheck %s --check-prefix=GNU
+// RUN: llvm-readobj --notes %t | FileCheck %s --check-prefix=LLVM
+
+// GNU: Displaying notes found at file offset 0x00000040 with length 0x00000020:
+// GNU-NEXT: Owner Data size Description
+// GNU-NEXT: GNU 0x00000010 NT_GNU_PROPERTY_TYPE_0 (property note)
+// GNU-NEXT: Properties: aarch64 feature: BTI, PAC
+
+// LLVM: Notes [
+// LLVM-NEXT: NoteSection {
+// LLVM-NEXT: Offset: 0x40
+// LLVM-NEXT: Size: 0x20
+// LLVM-NEXT: Note {
+// LLVM-NEXT: Owner: GNU
+// LLVM-NEXT: Data size: 0x10
+// LLVM-NEXT: Type: NT_GNU_PROPERTY_TYPE_0 (property note)
+// LLVM-NEXT: Property [
+// LLVM-NEXT: aarch64 feature: BTI, PAC
+// LLVM-NEXT: ]
+// LLVM-NEXT: }
+// LLVM-NEXT: }
+// LLVM-NEXT: ]
+
+.section ".note.gnu.property", "a"
+.align 4
+ .long 4 /* Name length is always 4 ("GNU") */
+ .long end - begin /* Data length */
+ .long 5 /* Type: NT_GNU_PROPERTY_TYPE_0 */
+ .asciz "GNU" /* Name */
+ .p2align 3
+begin:
+ /* BTI and PAC property note */
+ .long 0xc0000000 /* Type: GNU_PROPERTY_AARCH64_FEATURE_1_AND */
+ .long 4 /* Data size */
+ .long 3 /* BTI and PAC */
+ .p2align 3 /* Align to 8 byte for 64 bit */
+end:
diff --git a/llvm/test/tools/llvm-readobj/ELF/AArch64/dwarf-cfi.s b/llvm/test/tools/llvm-readobj/ELF/AArch64/dwarf-cfi.s
new file mode 100644
index 00000000000..f1295467876
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/AArch64/dwarf-cfi.s
@@ -0,0 +1,25 @@
+# RUN: llvm-mc -triple arm64-linux -filetype obj -o - %s | llvm-readobj -u | FileCheck %s
+
+# CHECK: [0x0] CIE length=16
+# CHECK-NEXT: version: 1
+# CHECK-NEXT: augmentation: zR
+# CHECK-NEXT: code_alignment_factor: 1
+# CHECK-NEXT: data_alignment_factor: -4
+# CHECK-NEXT: return_address_register: 30
+
+# CHECK: Program:
+# CHECK-NEXT: DW_CFA_def_cfa: reg31 +0
+
+# CHECK: [0x14] FDE length=16 cie=[0x0]
+# CHECK-NEXT: initial_location: 0x0
+# CHECK-NEXT: address_range: 0x4 (end : 0x4)
+
+# CHECK: Program:
+# CHECK-NEXT: DW_CFA_nop:
+# CHECK-NEXT: DW_CFA_nop:
+# CHECK-NEXT: DW_CFA_nop:
+
+foo:
+.cfi_startproc
+ret
+.cfi_endproc
diff --git a/llvm/test/tools/llvm-readobj/ELF/AArch64/lit.local.cfg b/llvm/test/tools/llvm-readobj/ELF/AArch64/lit.local.cfg
new file mode 100644
index 00000000000..7184443994b
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/AArch64/lit.local.cfg
@@ -0,0 +1,2 @@
+if not 'AArch64' in config.root.targets:
+ config.unsupported = True
diff --git a/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-0.s b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-0.s
new file mode 100644
index 00000000000..dfee5411256
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-0.s
@@ -0,0 +1,241 @@
+@ RUN: llvm-mc -triple armv7-elf -filetype asm -o - %s | FileCheck %s
+@ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s \
+@ RUN: | llvm-readobj --arch-specific - | FileCheck %s --check-prefix=CHECK-OBJ
+.eabi_attribute Tag_CPU_arch, 0
+@CHECK: .eabi_attribute 6, 0
+@CHECK-OBJ: Tag: 6
+@CHECK-OBJ-NEXT: Value: 0
+@CHECK-OBJ-NEXT: TagName: CPU_arch
+@CHECK-OBJ-NEXT: Description: Pre-v4
+
+.eabi_attribute Tag_CPU_arch_profile, 0
+@CHECK: .eabi_attribute 7, 0
+@CHECK-OBJ: Tag: 7
+@CHECK-OBJ-NEXT: Value: 0
+@CHECK-OBJ-NEXT: TagName: CPU_arch_profile
+@CHECK-OBJ-NEXT: Description: None
+
+.eabi_attribute Tag_ARM_ISA_use, 0
+@CHECK: .eabi_attribute 8, 0
+@CHECK-OBJ: Tag: 8
+@CHECK-OBJ-NEXT: Value: 0
+@CHECK-OBJ-NEXT: TagName: ARM_ISA_use
+@CHECK-OBJ-NEXT: Description: Not Permitted
+
+.eabi_attribute Tag_THUMB_ISA_use, 0
+@CHECK: .eabi_attribute 9, 0
+@CHECK-OBJ: Tag: 9
+@CHECK-OBJ-NEXT: Value: 0
+@CHECK-OBJ-NEXT: TagName: THUMB_ISA_use
+@CHECK-OBJ-NEXT: Description: Not Permitted
+
+.eabi_attribute Tag_FP_arch, 0
+@CHECK: .eabi_attribute 10, 0
+@CHECK-OBJ: Tag: 10
+@CHECK-OBJ-NEXT: Value: 0
+@CHECK-OBJ-NEXT: TagName: FP_arch
+@CHECK-OBJ-NEXT: Description: Not Permitted
+
+.eabi_attribute Tag_WMMX_arch, 0
+@CHECK: .eabi_attribute 11, 0
+@CHECK-OBJ: Tag: 11
+@CHECK-OBJ-NEXT: Value: 0
+@CHECK-OBJ-NEXT: TagName: WMMX_arch
+@CHECK-OBJ-NEXT: Description: Not Permitted
+
+.eabi_attribute Tag_Advanced_SIMD_arch, 0
+@CHECK: .eabi_attribute 12, 0
+@CHECK-OBJ: Tag: 12
+@CHECK-OBJ-NEXT: Value: 0
+@CHECK-OBJ-NEXT: TagName: Advanced_SIMD_arch
+@CHECK-OBJ-NEXT: Description: Not Permitted
+
+.eabi_attribute Tag_PCS_config, 0
+@CHECK: .eabi_attribute 13, 0
+@CHECK-OBJ: Tag: 13
+@CHECK-OBJ-NEXT: Value: 0
+@CHECK-OBJ-NEXT: TagName: PCS_config
+@CHECK-OBJ-NEXT: Description: None
+
+.eabi_attribute Tag_ABI_PCS_R9_use, 0
+@CHECK: .eabi_attribute 14, 0
+@CHECK-OBJ: Tag: 14
+@CHECK-OBJ-NEXT: Value: 0
+@CHECK-OBJ-NEXT: TagName: ABI_PCS_R9_use
+@CHECK-OBJ-NEXT: Description: v6
+
+.eabi_attribute Tag_ABI_PCS_RW_data, 0
+@CHECK: .eabi_attribute 15, 0
+@CHECK-OBJ: Tag: 15
+@CHECK-OBJ-NEXT: Value: 0
+@CHECK-OBJ-NEXT: TagName: ABI_PCS_RW_data
+@CHECK-OBJ-NEXT: Description: Absolute
+
+.eabi_attribute Tag_ABI_PCS_RO_data, 0
+@CHECK: .eabi_attribute 16, 0
+@CHECK-OBJ: Tag: 16
+@CHECK-OBJ-NEXT: Value: 0
+@CHECK-OBJ-NEXT: TagName: ABI_PCS_RO_data
+@CHECK-OBJ-NEXT: Description: Absolute
+
+.eabi_attribute Tag_ABI_PCS_GOT_use, 0
+@CHECK: .eabi_attribute 17, 0
+@CHECK-OBJ: Tag: 17
+@CHECK-OBJ-NEXT: Value: 0
+@CHECK-OBJ-NEXT: TagName: ABI_PCS_GOT_use
+@CHECK-OBJ-NEXT: Description: Not Permitted
+
+.eabi_attribute Tag_ABI_PCS_wchar_t, 0
+@CHECK: .eabi_attribute 18, 0
+@CHECK-OBJ: Tag: 18
+@CHECK-OBJ-NEXT: Value: 0
+@CHECK-OBJ-NEXT: TagName: ABI_PCS_wchar_t
+@CHECK-OBJ-NEXT: Description: Not Permitted
+
+.eabi_attribute Tag_ABI_FP_rounding, 0
+@CHECK: .eabi_attribute 19, 0
+@CHECK-OBJ: Tag: 19
+@CHECK-OBJ-NEXT: Value: 0
+@CHECK-OBJ-NEXT: TagName: ABI_FP_rounding
+@CHECK-OBJ-NEXT: Description: IEEE-754
+
+.eabi_attribute Tag_ABI_FP_denormal, 0
+@CHECK: .eabi_attribute 20, 0
+@CHECK-OBJ: Tag: 20
+@CHECK-OBJ-NEXT: Value: 0
+@CHECK-OBJ-NEXT: TagName: ABI_FP_denormal
+@CHECK-OBJ-NEXT: Description: Unsupported
+
+.eabi_attribute Tag_ABI_FP_exceptions, 0
+@CHECK: .eabi_attribute 21, 0
+@CHECK-OBJ: Tag: 21
+@CHECK-OBJ-NEXT: Value: 0
+@CHECK-OBJ-NEXT: TagName: ABI_FP_exceptions
+@CHECK-OBJ-NEXT: Description: Not Permitted
+
+.eabi_attribute Tag_ABI_FP_user_exceptions, 0
+@CHECK: .eabi_attribute 22, 0
+@CHECK-OBJ: Tag: 22
+@CHECK-OBJ-NEXT: Value: 0
+@CHECK-OBJ-NEXT: TagName: ABI_FP_user_exceptions
+@CHECK-OBJ-NEXT: Description: Not Permitted
+
+.eabi_attribute Tag_ABI_FP_number_model, 0
+@CHECK: .eabi_attribute 23, 0
+@CHECK-OBJ: Tag: 23
+@CHECK-OBJ-NEXT: Value: 0
+@CHECK-OBJ-NEXT: TagName: ABI_FP_number_model
+@CHECK-OBJ-NEXT: Description: Not Permitted
+
+.eabi_attribute Tag_ABI_align_needed, 0
+@CHECK: .eabi_attribute 24, 0
+@CHECK-OBJ: Tag: 24
+@CHECK-OBJ-NEXT: Value: 0
+@CHECK-OBJ-NEXT: TagName: ABI_align_needed
+@CHECK-OBJ-NEXT: Description: Not Permitted
+
+.eabi_attribute Tag_ABI_align_preserved, 0
+@CHECK: .eabi_attribute 25, 0
+@CHECK-OBJ: Tag: 25
+@CHECK-OBJ-NEXT: Value: 0
+@CHECK-OBJ-NEXT: TagName: ABI_align_preserved
+@CHECK-OBJ-NEXT: Description: Not Required
+
+.eabi_attribute Tag_ABI_enum_size, 0
+@CHECK: .eabi_attribute 26, 0
+@CHECK-OBJ: Tag: 26
+@CHECK-OBJ-NEXT: Value: 0
+@CHECK-OBJ-NEXT: TagName: ABI_enum_size
+@CHECK-OBJ-NEXT: Description: Not Permitted
+
+.eabi_attribute Tag_ABI_HardFP_use, 0
+@CHECK: .eabi_attribute 27, 0
+@CHECK-OBJ: Tag: 27
+@CHECK-OBJ-NEXT: Value: 0
+@CHECK-OBJ-NEXT: TagName: ABI_HardFP_use
+@CHECK-OBJ-NEXT: Description: Tag_FP_arch
+
+.eabi_attribute Tag_ABI_VFP_args, 0
+@CHECK: .eabi_attribute 28, 0
+@CHECK-OBJ: Tag: 28
+@CHECK-OBJ-NEXT: Value: 0
+@CHECK-OBJ-NEXT: TagName: ABI_VFP_args
+@CHECK-OBJ-NEXT: Description: AAPCS
+
+.eabi_attribute Tag_ABI_WMMX_args, 0
+@CHECK: .eabi_attribute 29, 0
+@CHECK-OBJ: Tag: 29
+@CHECK-OBJ-NEXT: Value: 0
+@CHECK-OBJ-NEXT: TagName: ABI_WMMX_args
+@CHECK-OBJ-NEXT: Description: AAPCS
+
+.eabi_attribute Tag_ABI_optimization_goals, 0
+@CHECK: .eabi_attribute 30, 0
+@CHECK-OBJ: Tag: 30
+@CHECK-OBJ-NEXT: Value: 0
+@CHECK-OBJ-NEXT: TagName: ABI_optimization_goals
+@CHECK-OBJ-NEXT: Description: None
+
+.eabi_attribute Tag_ABI_FP_optimization_goals, 0
+@CHECK: .eabi_attribute 31, 0
+@CHECK-OBJ: Tag: 31
+@CHECK-OBJ-NEXT: Value: 0
+@CHECK-OBJ-NEXT: TagName: ABI_FP_optimization_goals
+@CHECK-OBJ-NEXT: Description: None
+
+.eabi_attribute Tag_compatibility, 0, "ARM"
+@CHECK: .eabi_attribute 32, 0
+@CHECK-OBJ: Tag: 32
+@CHECK-OBJ-NEXT: Value: 0, ARM
+@CHECK-OBJ-NEXT: TagName: compatibility
+@CHECK-OBJ-NEXT: Description: No Specific Requirements
+
+.eabi_attribute Tag_CPU_unaligned_access, 0
+@CHECK: .eabi_attribute 34, 0
+@CHECK-OBJ: Tag: 34
+@CHECK-OBJ-NEXT: Value: 0
+@CHECK-OBJ-NEXT: TagName: CPU_unaligned_access
+@CHECK-OBJ-NEXT: Description: Not Permitted
+
+.eabi_attribute Tag_FP_HP_extension, 0
+@CHECK: .eabi_attribute 36, 0
+@CHECK-OBJ: Tag: 36
+@CHECK-OBJ-NEXT: Value: 0
+@CHECK-OBJ-NEXT: TagName: FP_HP_extension
+@CHECK-OBJ-NEXT: Description: If Available
+
+.eabi_attribute Tag_ABI_FP_16bit_format, 0
+@CHECK: .eabi_attribute 38, 0
+@CHECK-OBJ: Tag: 38
+@CHECK-OBJ-NEXT: Value: 0
+@CHECK-OBJ-NEXT: TagName: ABI_FP_16bit_format
+@CHECK-OBJ-NEXT: Description: Not Permitted
+
+.eabi_attribute Tag_MPextension_use, 0
+@CHECK: .eabi_attribute 42, 0
+@CHECK-OBJ: Tag: 42
+@CHECK-OBJ-NEXT: Value: 0
+@CHECK-OBJ-NEXT: TagName: MPextension_use
+@CHECK-OBJ-NEXT: Description: Not Permitted
+
+.eabi_attribute Tag_DIV_use, 0
+@CHECK: .eabi_attribute 44, 0
+@CHECK-OBJ: Tag: 44
+@CHECK-OBJ-NEXT: Value: 0
+@CHECK-OBJ-NEXT: TagName: DIV_use
+@CHECK-OBJ-NEXT: Description: If Available
+
+.eabi_attribute Tag_DSP_extension, 0
+@CHECK: .eabi_attribute 46, 0
+@CHECK-OBJ: Tag: 46
+@CHECK-OBJ-NEXT: Value: 0
+@CHECK-OBJ-NEXT: TagName: DSP_extension
+@CHECK-OBJ-NEXT: Description: Not Permitted
+
+.eabi_attribute Tag_Virtualization_use, 0
+@CHECK: .eabi_attribute 68, 0
+@CHECK-OBJ: Tag: 68
+@CHECK-OBJ-NEXT: Value: 0
+@CHECK-OBJ-NEXT: TagName: Virtualization_use
+@CHECK-OBJ-NEXT: Description: Not Permitted
+
diff --git a/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-1.s b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-1.s
new file mode 100644
index 00000000000..d7cc1aaf120
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-1.s
@@ -0,0 +1,227 @@
+@ RUN: llvm-mc -triple armv7-elf -filetype asm -o - %s | FileCheck %s
+@ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s \
+@ RUN: | llvm-readobj --arch-specific - | FileCheck %s --check-prefix=CHECK-OBJ
+.eabi_attribute Tag_CPU_arch, 1
+@CHECK: .eabi_attribute 6, 1
+@CHECK-OBJ: Tag: 6
+@CHECK-OBJ-NEXT: Value: 1
+@CHECK-OBJ-NEXT: TagName: CPU_arch
+@CHECK-OBJ-NEXT: Description: ARM v4
+
+.eabi_attribute Tag_ARM_ISA_use, 1
+@CHECK: .eabi_attribute 8, 1
+@CHECK-OBJ: Tag: 8
+@CHECK-OBJ-NEXT: Value: 1
+@CHECK-OBJ-NEXT: TagName: ARM_ISA_use
+@CHECK-OBJ-NEXT: Description: Permitted
+
+.eabi_attribute Tag_THUMB_ISA_use, 1
+@CHECK: .eabi_attribute 9, 1
+@CHECK-OBJ: Tag: 9
+@CHECK-OBJ-NEXT: Value: 1
+@CHECK-OBJ-NEXT: TagName: THUMB_ISA_use
+@CHECK-OBJ-NEXT: Description: Thumb-1
+
+.eabi_attribute Tag_FP_arch, 1
+@CHECK: .eabi_attribute 10, 1
+@CHECK-OBJ: Tag: 10
+@CHECK-OBJ-NEXT: Value: 1
+@CHECK-OBJ-NEXT: TagName: FP_arch
+@CHECK-OBJ-NEXT: Description: VFPv1
+
+.eabi_attribute Tag_WMMX_arch, 1
+@CHECK: .eabi_attribute 11, 1
+@CHECK-OBJ: Tag: 11
+@CHECK-OBJ-NEXT: Value: 1
+@CHECK-OBJ-NEXT: TagName: WMMX_arch
+@CHECK-OBJ-NEXT: Description: WMMXv1
+
+.eabi_attribute Tag_Advanced_SIMD_arch, 1
+@CHECK: .eabi_attribute 12, 1
+@CHECK-OBJ: Tag: 12
+@CHECK-OBJ-NEXT: Value: 1
+@CHECK-OBJ-NEXT: TagName: Advanced_SIMD_arch
+@CHECK-OBJ-NEXT: Description: NEONv1
+
+.eabi_attribute Tag_PCS_config, 1
+@CHECK: .eabi_attribute 13, 1
+@CHECK-OBJ: Tag: 13
+@CHECK-OBJ-NEXT: Value: 1
+@CHECK-OBJ-NEXT: TagName: PCS_config
+@CHECK-OBJ-NEXT: Description: Bare Platform
+
+.eabi_attribute Tag_ABI_PCS_R9_use, 1
+@CHECK: .eabi_attribute 14, 1
+@CHECK-OBJ: Tag: 14
+@CHECK-OBJ-NEXT: Value: 1
+@CHECK-OBJ-NEXT: TagName: ABI_PCS_R9_use
+@CHECK-OBJ-NEXT: Description: Static Base
+
+.eabi_attribute Tag_ABI_PCS_RW_data, 1
+@CHECK: .eabi_attribute 15, 1
+@CHECK-OBJ: Tag: 15
+@CHECK-OBJ-NEXT: Value: 1
+@CHECK-OBJ-NEXT: TagName: ABI_PCS_RW_data
+@CHECK-OBJ-NEXT: Description: PC-relative
+
+.eabi_attribute Tag_ABI_PCS_RO_data, 1
+@CHECK: .eabi_attribute 16, 1
+@CHECK-OBJ: Tag: 16
+@CHECK-OBJ-NEXT: Value: 1
+@CHECK-OBJ-NEXT: TagName: ABI_PCS_RO_data
+@CHECK-OBJ-NEXT: Description: PC-relative
+
+.eabi_attribute Tag_ABI_PCS_GOT_use, 1
+@CHECK: .eabi_attribute 17, 1
+@CHECK-OBJ: Tag: 17
+@CHECK-OBJ-NEXT: Value: 1
+@CHECK-OBJ-NEXT: TagName: ABI_PCS_GOT_use
+@CHECK-OBJ-NEXT: Description: Direct
+
+.eabi_attribute Tag_ABI_FP_rounding, 1
+@CHECK: .eabi_attribute 19, 1
+@CHECK-OBJ: Tag: 19
+@CHECK-OBJ-NEXT: Value: 1
+@CHECK-OBJ-NEXT: TagName: ABI_FP_rounding
+@CHECK-OBJ-NEXT: Description: Runtime
+
+.eabi_attribute Tag_ABI_FP_denormal, 1
+@CHECK: .eabi_attribute 20, 1
+@CHECK-OBJ: Tag: 20
+@CHECK-OBJ-NEXT: Value: 1
+@CHECK-OBJ-NEXT: TagName: ABI_FP_denormal
+@CHECK-OBJ-NEXT: Description: IEEE-754
+
+.eabi_attribute Tag_ABI_FP_exceptions, 1
+@CHECK: .eabi_attribute 21, 1
+@CHECK-OBJ: Tag: 21
+@CHECK-OBJ-NEXT: Value: 1
+@CHECK-OBJ-NEXT: TagName: ABI_FP_exceptions
+@CHECK-OBJ-NEXT: Description: IEEE-754
+
+.eabi_attribute Tag_ABI_FP_user_exceptions, 1
+@CHECK: .eabi_attribute 22, 1
+@CHECK-OBJ: Tag: 22
+@CHECK-OBJ-NEXT: Value: 1
+@CHECK-OBJ-NEXT: TagName: ABI_FP_user_exceptions
+@CHECK-OBJ-NEXT: Description: IEEE-754
+
+.eabi_attribute Tag_ABI_FP_number_model, 1
+@CHECK: .eabi_attribute 23, 1
+@CHECK-OBJ: Tag: 23
+@CHECK-OBJ-NEXT: Value: 1
+@CHECK-OBJ-NEXT: TagName: ABI_FP_number_model
+@CHECK-OBJ-NEXT: Description: Finite Only
+
+.eabi_attribute Tag_ABI_align_needed, 1
+@CHECK: .eabi_attribute 24, 1
+@CHECK-OBJ: Tag: 24
+@CHECK-OBJ-NEXT: Value: 1
+@CHECK-OBJ-NEXT: TagName: ABI_align_needed
+@CHECK-OBJ-NEXT: Description: 8-byte alignment
+
+.eabi_attribute Tag_ABI_align_preserved, 1
+@CHECK: .eabi_attribute 25, 1
+@CHECK-OBJ: Tag: 25
+@CHECK-OBJ-NEXT: Value: 1
+@CHECK-OBJ-NEXT: TagName: ABI_align_preserved
+@CHECK-OBJ-NEXT: Description: 8-byte data alignment
+
+.eabi_attribute Tag_ABI_enum_size, 1
+@CHECK: .eabi_attribute 26, 1
+@CHECK-OBJ: Tag: 26
+@CHECK-OBJ-NEXT: Value: 1
+@CHECK-OBJ-NEXT: TagName: ABI_enum_size
+@CHECK-OBJ-NEXT: Description: Packed
+
+.eabi_attribute Tag_ABI_HardFP_use, 1
+@CHECK: .eabi_attribute 27, 1
+@CHECK-OBJ: Tag: 27
+@CHECK-OBJ-NEXT: Value: 1
+@CHECK-OBJ-NEXT: TagName: ABI_HardFP_use
+@CHECK-OBJ-NEXT: Description: Single-Precision
+
+.eabi_attribute Tag_ABI_VFP_args, 1
+@CHECK: .eabi_attribute 28, 1
+@CHECK-OBJ: Tag: 28
+@CHECK-OBJ-NEXT: Value: 1
+@CHECK-OBJ-NEXT: TagName: ABI_VFP_args
+@CHECK-OBJ-NEXT: Description: AAPCS VFP
+
+.eabi_attribute Tag_ABI_WMMX_args, 1
+@CHECK: .eabi_attribute 29, 1
+@CHECK-OBJ: Tag: 29
+@CHECK-OBJ-NEXT: Value: 1
+@CHECK-OBJ-NEXT: TagName: ABI_WMMX_args
+@CHECK-OBJ-NEXT: Description: iWMMX
+
+.eabi_attribute Tag_ABI_optimization_goals, 1
+@CHECK: .eabi_attribute 30, 1
+@CHECK-OBJ: Tag: 30
+@CHECK-OBJ-NEXT: Value: 1
+@CHECK-OBJ-NEXT: TagName: ABI_optimization_goals
+@CHECK-OBJ-NEXT: Description: Speed
+
+.eabi_attribute Tag_ABI_FP_optimization_goals, 1
+@CHECK: .eabi_attribute 31, 1
+@CHECK-OBJ: Tag: 31
+@CHECK-OBJ-NEXT: Value: 1
+@CHECK-OBJ-NEXT: TagName: ABI_FP_optimization_goals
+@CHECK-OBJ-NEXT: Description: Speed
+
+.eabi_attribute Tag_compatibility, 1, ""
+@CHECK: .eabi_attribute 32, 1
+@CHECK-OBJ: Tag: 32
+@CHECK-OBJ-NEXT: Value: 1,
+@CHECK-OBJ-NEXT: TagName: compatibility
+@CHECK-OBJ-NEXT: Description: AEABI Conformant
+
+.eabi_attribute Tag_CPU_unaligned_access, 1
+@CHECK: .eabi_attribute 34, 1
+@CHECK-OBJ: Tag: 34
+@CHECK-OBJ-NEXT: Value: 1
+@CHECK-OBJ-NEXT: TagName: CPU_unaligned_access
+@CHECK-OBJ-NEXT: Description: v6-style
+
+.eabi_attribute Tag_FP_HP_extension, 1
+@CHECK: .eabi_attribute 36, 1
+@CHECK-OBJ: Tag: 36
+@CHECK-OBJ-NEXT: Value: 1
+@CHECK-OBJ-NEXT: TagName: FP_HP_extension
+@CHECK-OBJ-NEXT: Description: Permitted
+
+.eabi_attribute Tag_ABI_FP_16bit_format, 1
+@CHECK: .eabi_attribute 38, 1
+@CHECK-OBJ: Tag: 38
+@CHECK-OBJ-NEXT: Value: 1
+@CHECK-OBJ-NEXT: TagName: ABI_FP_16bit_format
+@CHECK-OBJ-NEXT: Description: IEEE-754
+
+.eabi_attribute Tag_MPextension_use, 1
+@CHECK: .eabi_attribute 42, 1
+@CHECK-OBJ: Tag: 42
+@CHECK-OBJ-NEXT: Value: 1
+@CHECK-OBJ-NEXT: TagName: MPextension_use
+@CHECK-OBJ-NEXT: Description: Permitted
+
+.eabi_attribute Tag_DIV_use, 1
+@CHECK: .eabi_attribute 44, 1
+@CHECK-OBJ: Tag: 44
+@CHECK-OBJ-NEXT: Value: 1
+@CHECK-OBJ-NEXT: TagName: DIV_use
+@CHECK-OBJ-NEXT: Description: Not Permitted
+
+.eabi_attribute Tag_DSP_extension, 1
+@CHECK: .eabi_attribute 46, 1
+@CHECK-OBJ: Tag: 46
+@CHECK-OBJ-NEXT: Value: 1
+@CHECK-OBJ-NEXT: TagName: DSP_extension
+@CHECK-OBJ-NEXT: Description: Permitted
+
+.eabi_attribute Tag_Virtualization_use, 1
+@CHECK: .eabi_attribute 68, 1
+@CHECK-OBJ: Tag: 68
+@CHECK-OBJ-NEXT: Value: 1
+@CHECK-OBJ-NEXT: TagName: Virtualization_use
+@CHECK-OBJ-NEXT: Description: TrustZone
+
diff --git a/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-10.s b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-10.s
new file mode 100644
index 00000000000..1c62fee75ad
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-10.s
@@ -0,0 +1,24 @@
+@ RUN: llvm-mc -triple armv7-elf -filetype asm -o - %s | FileCheck %s
+@ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s \
+@ RUN: | llvm-readobj --arch-specific - | FileCheck %s --check-prefix=CHECK-OBJ
+.eabi_attribute Tag_CPU_arch, 10
+@CHECK: .eabi_attribute 6, 10
+@CHECK-OBJ: Tag: 6
+@CHECK-OBJ-NEXT: Value: 10
+@CHECK-OBJ-NEXT: TagName: CPU_arch
+@CHECK-OBJ-NEXT: Description: ARM v7
+
+.eabi_attribute Tag_ABI_align_needed, 10
+@CHECK: .eabi_attribute 24, 10
+@CHECK-OBJ: Tag: 24
+@CHECK-OBJ-NEXT: Value: 10
+@CHECK-OBJ-NEXT: TagName: ABI_align_needed
+@CHECK-OBJ-NEXT: Description: 8-byte alignment, 1024-byte extended alignment
+
+.eabi_attribute Tag_ABI_align_preserved, 10
+@CHECK: .eabi_attribute 25, 10
+@CHECK-OBJ: Tag: 25
+@CHECK-OBJ-NEXT: Value: 10
+@CHECK-OBJ-NEXT: TagName: ABI_align_preserved
+@CHECK-OBJ-NEXT: Description: 8-byte stack alignment, 1024-byte data alignment
+
diff --git a/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-11.s b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-11.s
new file mode 100644
index 00000000000..04a2e41065d
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-11.s
@@ -0,0 +1,24 @@
+@ RUN: llvm-mc -triple armv7-elf -filetype asm -o - %s | FileCheck %s
+@ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s \
+@ RUN: | llvm-readobj --arch-specific - | FileCheck %s --check-prefix=CHECK-OBJ
+.eabi_attribute Tag_CPU_arch, 11
+@CHECK: .eabi_attribute 6, 11
+@CHECK-OBJ: Tag: 6
+@CHECK-OBJ-NEXT: Value: 11
+@CHECK-OBJ-NEXT: TagName: CPU_arch
+@CHECK-OBJ-NEXT: Description: ARM v6-M
+
+.eabi_attribute Tag_ABI_align_needed, 11
+@CHECK: .eabi_attribute 24, 11
+@CHECK-OBJ: Tag: 24
+@CHECK-OBJ-NEXT: Value: 11
+@CHECK-OBJ-NEXT: TagName: ABI_align_needed
+@CHECK-OBJ-NEXT: Description: 8-byte alignment, 2048-byte extended alignment
+
+.eabi_attribute Tag_ABI_align_preserved, 11
+@CHECK: .eabi_attribute 25, 11
+@CHECK-OBJ: Tag: 25
+@CHECK-OBJ-NEXT: Value: 11
+@CHECK-OBJ-NEXT: TagName: ABI_align_preserved
+@CHECK-OBJ-NEXT: Description: 8-byte stack alignment, 2048-byte data alignment
+
diff --git a/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-12.s b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-12.s
new file mode 100644
index 00000000000..e36ed9b6521
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-12.s
@@ -0,0 +1,24 @@
+@ RUN: llvm-mc -triple armv7-elf -filetype asm -o - %s | FileCheck %s
+@ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s \
+@ RUN: | llvm-readobj --arch-specific - | FileCheck %s --check-prefix=CHECK-OBJ
+.eabi_attribute Tag_CPU_arch, 12
+@CHECK: .eabi_attribute 6, 12
+@CHECK-OBJ: Tag: 6
+@CHECK-OBJ-NEXT: Value: 12
+@CHECK-OBJ-NEXT: TagName: CPU_arch
+@CHECK-OBJ-NEXT: Description: ARM v6S-M
+
+.eabi_attribute Tag_ABI_align_needed, 12
+@CHECK: .eabi_attribute 24, 12
+@CHECK-OBJ: Tag: 24
+@CHECK-OBJ-NEXT: Value: 12
+@CHECK-OBJ-NEXT: TagName: ABI_align_needed
+@CHECK-OBJ-NEXT: Description: 8-byte alignment, 4096-byte extended alignment
+
+.eabi_attribute Tag_ABI_align_preserved, 12
+@CHECK: .eabi_attribute 25, 12
+@CHECK-OBJ: Tag: 25
+@CHECK-OBJ-NEXT: Value: 12
+@CHECK-OBJ-NEXT: TagName: ABI_align_preserved
+@CHECK-OBJ-NEXT: Description: 8-byte stack alignment, 4096-byte data alignment
+
diff --git a/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-13.s b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-13.s
new file mode 100644
index 00000000000..407995c01a5
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-13.s
@@ -0,0 +1,10 @@
+@ RUN: llvm-mc -triple armv7-elf -filetype asm -o - %s | FileCheck %s
+@ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s \
+@ RUN: | llvm-readobj --arch-specific - | FileCheck %s --check-prefix=CHECK-OBJ
+.eabi_attribute Tag_CPU_arch, 13
+@CHECK: .eabi_attribute 6, 13
+@CHECK-OBJ: Tag: 6
+@CHECK-OBJ-NEXT: Value: 13
+@CHECK-OBJ-NEXT: TagName: CPU_arch
+@CHECK-OBJ-NEXT: Description: ARM v7E-M
+
diff --git a/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-136.s b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-136.s
new file mode 100644
index 00000000000..674970a654e
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-136.s
@@ -0,0 +1,10 @@
+@ RUN: llvm-mc -triple armv7-elf -filetype asm -o - %s | FileCheck %s
+@ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s \
+@ RUN: | llvm-readobj --arch-specific - | FileCheck %s --check-prefix=CHECK-OBJ
+.eabi_attribute Tag_compatibility, 136, "Foo Corp"
+@CHECK: .eabi_attribute 32, 136
+@CHECK-OBJ: Tag: 32
+@CHECK-OBJ-NEXT: Value: 136, Foo Corp
+@CHECK-OBJ-NEXT: TagName: compatibility
+@CHECK-OBJ-NEXT: Description: AEABI Non-Conformant
+
diff --git a/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-14.s b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-14.s
new file mode 100644
index 00000000000..c15a5cd535f
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-14.s
@@ -0,0 +1,10 @@
+@ RUN: llvm-mc -triple armv7-elf -filetype asm -o - %s | FileCheck %s
+@ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s \
+@ RUN: | llvm-readobj --arch-specific - | FileCheck %s --check-prefix=CHECK-OBJ
+.eabi_attribute Tag_CPU_arch, 14
+@CHECK: .eabi_attribute 6, 14
+@CHECK-OBJ: Tag: 6
+@CHECK-OBJ-NEXT: Value: 14
+@CHECK-OBJ-NEXT: TagName: CPU_arch
+@CHECK-OBJ-NEXT: Description: ARM v8
+
diff --git a/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-15.s b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-15.s
new file mode 100644
index 00000000000..1fd1869c9c7
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-15.s
@@ -0,0 +1,10 @@
+@ RUN: llvm-mc -triple armv7-elf -filetype asm -o - %s | FileCheck %s
+@ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s \
+@ RUN: | llvm-readobj --arch-specific - | FileCheck %s --check-prefix=CHECK-OBJ
+.eabi_attribute Tag_compatibility, 15, "Longer Corporation NaMe"
+@CHECK: .eabi_attribute 32, 15
+@CHECK-OBJ: Tag: 32
+@CHECK-OBJ-NEXT: Value: 15, Longer Corporation NaMe
+@CHECK-OBJ-NEXT: TagName: compatibility
+@CHECK-OBJ-NEXT: Description: AEABI Non-Conformant
+
diff --git a/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-2.s b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-2.s
new file mode 100644
index 00000000000..33aeca8a1a7
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-2.s
@@ -0,0 +1,178 @@
+@ RUN: llvm-mc -triple armv7-elf -filetype asm -o - %s | FileCheck %s
+@ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s \
+@ RUN: | llvm-readobj --arch-specific - | FileCheck %s --check-prefix=CHECK-OBJ
+.eabi_attribute Tag_CPU_arch, 2
+@CHECK: .eabi_attribute 6, 2
+@CHECK-OBJ: Tag: 6
+@CHECK-OBJ-NEXT: Value: 2
+@CHECK-OBJ-NEXT: TagName: CPU_arch
+@CHECK-OBJ-NEXT: Description: ARM v4T
+
+.eabi_attribute Tag_THUMB_ISA_use, 2
+@CHECK: .eabi_attribute 9, 2
+@CHECK-OBJ: Tag: 9
+@CHECK-OBJ-NEXT: Value: 2
+@CHECK-OBJ-NEXT: TagName: THUMB_ISA_use
+@CHECK-OBJ-NEXT: Description: Thumb-2
+
+.eabi_attribute Tag_FP_arch, 2
+@CHECK: .eabi_attribute 10, 2
+@CHECK-OBJ: Tag: 10
+@CHECK-OBJ-NEXT: Value: 2
+@CHECK-OBJ-NEXT: TagName: FP_arch
+@CHECK-OBJ-NEXT: Description: VFPv2
+
+.eabi_attribute Tag_WMMX_arch, 2
+@CHECK: .eabi_attribute 11, 2
+@CHECK-OBJ: Tag: 11
+@CHECK-OBJ-NEXT: Value: 2
+@CHECK-OBJ-NEXT: TagName: WMMX_arch
+@CHECK-OBJ-NEXT: Description: WMMXv2
+
+.eabi_attribute Tag_Advanced_SIMD_arch, 2
+@CHECK: .eabi_attribute 12, 2
+@CHECK-OBJ: Tag: 12
+@CHECK-OBJ-NEXT: Value: 2
+@CHECK-OBJ-NEXT: TagName: Advanced_SIMD_arch
+@CHECK-OBJ-NEXT: Description: NEONv2+FMA
+
+.eabi_attribute Tag_PCS_config, 2
+@CHECK: .eabi_attribute 13, 2
+@CHECK-OBJ: Tag: 13
+@CHECK-OBJ-NEXT: Value: 2
+@CHECK-OBJ-NEXT: TagName: PCS_config
+@CHECK-OBJ-NEXT: Description: Linux Application
+
+.eabi_attribute Tag_ABI_PCS_R9_use, 2
+@CHECK: .eabi_attribute 14, 2
+@CHECK-OBJ: Tag: 14
+@CHECK-OBJ-NEXT: Value: 2
+@CHECK-OBJ-NEXT: TagName: ABI_PCS_R9_use
+@CHECK-OBJ-NEXT: Description: TLS
+
+.eabi_attribute Tag_ABI_PCS_RW_data, 2
+@CHECK: .eabi_attribute 15, 2
+@CHECK-OBJ: Tag: 15
+@CHECK-OBJ-NEXT: Value: 2
+@CHECK-OBJ-NEXT: TagName: ABI_PCS_RW_data
+@CHECK-OBJ-NEXT: Description: SB-relative
+
+.eabi_attribute Tag_ABI_PCS_RO_data, 2
+@CHECK: .eabi_attribute 16, 2
+@CHECK-OBJ: Tag: 16
+@CHECK-OBJ-NEXT: Value: 2
+@CHECK-OBJ-NEXT: TagName: ABI_PCS_RO_data
+@CHECK-OBJ-NEXT: Description: Not Permitted
+
+.eabi_attribute Tag_ABI_PCS_GOT_use, 2
+@CHECK: .eabi_attribute 17, 2
+@CHECK-OBJ: Tag: 17
+@CHECK-OBJ-NEXT: Value: 2
+@CHECK-OBJ-NEXT: TagName: ABI_PCS_GOT_use
+@CHECK-OBJ-NEXT: Description: GOT-Indirect
+
+.eabi_attribute Tag_ABI_PCS_wchar_t, 2
+@CHECK: .eabi_attribute 18, 2
+@CHECK-OBJ: Tag: 18
+@CHECK-OBJ-NEXT: Value: 2
+@CHECK-OBJ-NEXT: TagName: ABI_PCS_wchar_t
+@CHECK-OBJ-NEXT: Description: 2-byte
+
+.eabi_attribute Tag_ABI_FP_denormal, 2
+@CHECK: .eabi_attribute 20, 2
+@CHECK-OBJ: Tag: 20
+@CHECK-OBJ-NEXT: Value: 2
+@CHECK-OBJ-NEXT: TagName: ABI_FP_denormal
+@CHECK-OBJ-NEXT: Description: Sign Only
+
+.eabi_attribute Tag_ABI_FP_number_model, 2
+@CHECK: .eabi_attribute 23, 2
+@CHECK-OBJ: Tag: 23
+@CHECK-OBJ-NEXT: Value: 2
+@CHECK-OBJ-NEXT: TagName: ABI_FP_number_model
+@CHECK-OBJ-NEXT: Description: RTABI
+
+.eabi_attribute Tag_ABI_align_needed, 2
+@CHECK: .eabi_attribute 24, 2
+@CHECK-OBJ: Tag: 24
+@CHECK-OBJ-NEXT: Value: 2
+@CHECK-OBJ-NEXT: TagName: ABI_align_needed
+@CHECK-OBJ-NEXT: Description: 4-byte alignment
+
+.eabi_attribute Tag_ABI_align_preserved, 2
+@CHECK: .eabi_attribute 25, 2
+@CHECK-OBJ: Tag: 25
+@CHECK-OBJ-NEXT: Value: 2
+@CHECK-OBJ-NEXT: TagName: ABI_align_preserved
+@CHECK-OBJ-NEXT: Description: 8-byte data and code alignment
+
+.eabi_attribute Tag_ABI_enum_size, 2
+@CHECK: .eabi_attribute 26, 2
+@CHECK-OBJ: Tag: 26
+@CHECK-OBJ-NEXT: Value: 2
+@CHECK-OBJ-NEXT: TagName: ABI_enum_size
+@CHECK-OBJ-NEXT: Description: Int32
+
+.eabi_attribute Tag_ABI_HardFP_use, 2
+@CHECK: .eabi_attribute 27, 2
+@CHECK-OBJ: Tag: 27
+@CHECK-OBJ-NEXT: Value: 2
+@CHECK-OBJ-NEXT: TagName: ABI_HardFP_use
+@CHECK-OBJ-NEXT: Description: Reserved
+
+.eabi_attribute Tag_ABI_VFP_args, 2
+@CHECK: .eabi_attribute 28, 2
+@CHECK-OBJ: Tag: 28
+@CHECK-OBJ-NEXT: Value: 2
+@CHECK-OBJ-NEXT: TagName: ABI_VFP_args
+@CHECK-OBJ-NEXT: Description: Custom
+
+.eabi_attribute Tag_ABI_WMMX_args, 2
+@CHECK: .eabi_attribute 29, 2
+@CHECK-OBJ: Tag: 29
+@CHECK-OBJ-NEXT: Value: 2
+@CHECK-OBJ-NEXT: TagName: ABI_WMMX_args
+@CHECK-OBJ-NEXT: Description: Custom
+
+.eabi_attribute Tag_ABI_optimization_goals, 2
+@CHECK: .eabi_attribute 30, 2
+@CHECK-OBJ: Tag: 30
+@CHECK-OBJ-NEXT: Value: 2
+@CHECK-OBJ-NEXT: TagName: ABI_optimization_goals
+@CHECK-OBJ-NEXT: Description: Aggressive Speed
+
+.eabi_attribute Tag_ABI_FP_optimization_goals, 2
+@CHECK: .eabi_attribute 31, 2
+@CHECK-OBJ: Tag: 31
+@CHECK-OBJ-NEXT: Value: 2
+@CHECK-OBJ-NEXT: TagName: ABI_FP_optimization_goals
+@CHECK-OBJ-NEXT: Description: Aggressive Speed
+
+.eabi_attribute Tag_compatibility, 2, ""
+@CHECK: .eabi_attribute 32, 2
+@CHECK-OBJ: Tag: 32
+@CHECK-OBJ-NEXT: Value: 2,
+@CHECK-OBJ-NEXT: TagName: compatibility
+@CHECK-OBJ-NEXT: Description: AEABI Non-Conformant
+
+.eabi_attribute Tag_ABI_FP_16bit_format, 2
+@CHECK: .eabi_attribute 38, 2
+@CHECK-OBJ: Tag: 38
+@CHECK-OBJ-NEXT: Value: 2
+@CHECK-OBJ-NEXT: TagName: ABI_FP_16bit_format
+@CHECK-OBJ-NEXT: Description: VFPv3
+
+.eabi_attribute Tag_DIV_use, 2
+@CHECK: .eabi_attribute 44, 2
+@CHECK-OBJ: Tag: 44
+@CHECK-OBJ-NEXT: Value: 2
+@CHECK-OBJ-NEXT: TagName: DIV_use
+@CHECK-OBJ-NEXT: Description: Permitted
+
+.eabi_attribute Tag_Virtualization_use, 2
+@CHECK: .eabi_attribute 68, 2
+@CHECK-OBJ: Tag: 68
+@CHECK-OBJ-NEXT: Value: 2
+@CHECK-OBJ-NEXT: TagName: Virtualization_use
+@CHECK-OBJ-NEXT: Description: Virtualization Extensions
+
diff --git a/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-3.s b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-3.s
new file mode 100644
index 00000000000..284e6ed8295
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-3.s
@@ -0,0 +1,108 @@
+@ RUN: llvm-mc -triple armv7-elf -filetype asm -o - %s | FileCheck %s
+@ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s \
+@ RUN: | llvm-readobj --arch-specific - | FileCheck %s --check-prefix=CHECK-OBJ
+.eabi_attribute Tag_CPU_arch, 3
+@CHECK: .eabi_attribute 6, 3
+@CHECK-OBJ: Tag: 6
+@CHECK-OBJ-NEXT: Value: 3
+@CHECK-OBJ-NEXT: TagName: CPU_arch
+@CHECK-OBJ-NEXT: Description: ARM v5T
+
+.eabi_attribute Tag_FP_arch, 3
+@CHECK: .eabi_attribute 10, 3
+@CHECK-OBJ: Tag: 10
+@CHECK-OBJ-NEXT: Value: 3
+@CHECK-OBJ-NEXT: TagName: FP_arch
+@CHECK-OBJ-NEXT: Description: VFPv3
+
+.eabi_attribute Tag_Advanced_SIMD_arch, 3
+@CHECK: .eabi_attribute 12, 3
+@CHECK-OBJ: Tag: 12
+@CHECK-OBJ-NEXT: Value: 3
+@CHECK-OBJ-NEXT: TagName: Advanced_SIMD_arch
+@CHECK-OBJ-NEXT: Description: ARMv8-a NEON
+
+.eabi_attribute Tag_PCS_config, 3
+@CHECK: .eabi_attribute 13, 3
+@CHECK-OBJ: Tag: 13
+@CHECK-OBJ-NEXT: Value: 3
+@CHECK-OBJ-NEXT: TagName: PCS_config
+@CHECK-OBJ-NEXT: Description: Linux DSO
+
+.eabi_attribute Tag_ABI_PCS_R9_use, 3
+@CHECK: .eabi_attribute 14, 3
+@CHECK-OBJ: Tag: 14
+@CHECK-OBJ-NEXT: Value: 3
+@CHECK-OBJ-NEXT: TagName: ABI_PCS_R9_use
+@CHECK-OBJ-NEXT: Description: Unused
+
+.eabi_attribute Tag_ABI_PCS_RW_data, 3
+@CHECK: .eabi_attribute 15, 3
+@CHECK-OBJ: Tag: 15
+@CHECK-OBJ-NEXT: Value: 3
+@CHECK-OBJ-NEXT: TagName: ABI_PCS_RW_data
+@CHECK-OBJ-NEXT: Description: Not Permitted
+
+.eabi_attribute Tag_ABI_FP_number_model, 3
+@CHECK: .eabi_attribute 23, 3
+@CHECK-OBJ: Tag: 23
+@CHECK-OBJ-NEXT: Value: 3
+@CHECK-OBJ-NEXT: TagName: ABI_FP_number_model
+@CHECK-OBJ-NEXT: Description: IEEE-754
+
+.eabi_attribute Tag_ABI_align_needed, 3
+@CHECK: .eabi_attribute 24, 3
+@CHECK-OBJ: Tag: 24
+@CHECK-OBJ-NEXT: Value: 3
+@CHECK-OBJ-NEXT: TagName: ABI_align_needed
+@CHECK-OBJ-NEXT: Description: Reserved
+
+.eabi_attribute Tag_ABI_align_preserved, 3
+@CHECK: .eabi_attribute 25, 3
+@CHECK-OBJ: Tag: 25
+@CHECK-OBJ-NEXT: Value: 3
+@CHECK-OBJ-NEXT: TagName: ABI_align_preserved
+@CHECK-OBJ-NEXT: Description: Reserved
+
+.eabi_attribute Tag_ABI_enum_size, 3
+@CHECK: .eabi_attribute 26, 3
+@CHECK-OBJ: Tag: 26
+@CHECK-OBJ-NEXT: Value: 3
+@CHECK-OBJ-NEXT: TagName: ABI_enum_size
+@CHECK-OBJ-NEXT: Description: External Int32
+
+.eabi_attribute Tag_ABI_HardFP_use, 3
+@CHECK: .eabi_attribute 27, 3
+@CHECK-OBJ: Tag: 27
+@CHECK-OBJ-NEXT: Value: 3
+@CHECK-OBJ-NEXT: TagName: ABI_HardFP_use
+@CHECK-OBJ-NEXT: Description: Tag_FP_arch (deprecated)
+
+.eabi_attribute Tag_ABI_VFP_args, 3
+@CHECK: .eabi_attribute 28, 3
+@CHECK-OBJ: Tag: 28
+@CHECK-OBJ-NEXT: Value: 3
+@CHECK-OBJ-NEXT: TagName: ABI_VFP_args
+@CHECK-OBJ-NEXT: Description: Not Permitted
+
+.eabi_attribute Tag_ABI_optimization_goals, 3
+@CHECK: .eabi_attribute 30, 3
+@CHECK-OBJ: Tag: 30
+@CHECK-OBJ-NEXT: Value: 3
+@CHECK-OBJ-NEXT: TagName: ABI_optimization_goals
+@CHECK-OBJ-NEXT: Description: Size
+
+.eabi_attribute Tag_ABI_FP_optimization_goals, 3
+@CHECK: .eabi_attribute 31, 3
+@CHECK-OBJ: Tag: 31
+@CHECK-OBJ-NEXT: Value: 3
+@CHECK-OBJ-NEXT: TagName: ABI_FP_optimization_goals
+@CHECK-OBJ-NEXT: Description: Size
+
+.eabi_attribute Tag_Virtualization_use, 3
+@CHECK: .eabi_attribute 68, 3
+@CHECK-OBJ: Tag: 68
+@CHECK-OBJ-NEXT: Value: 3
+@CHECK-OBJ-NEXT: TagName: Virtualization_use
+@CHECK-OBJ-NEXT: Description: TrustZone + Virtualization Extensions
+
diff --git a/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-4.s b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-4.s
new file mode 100644
index 00000000000..5f5f2b9e9d6
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-4.s
@@ -0,0 +1,66 @@
+@ RUN: llvm-mc -triple armv7-elf -filetype asm -o - %s | FileCheck %s
+@ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s \
+@ RUN: | llvm-readobj --arch-specific - | FileCheck %s --check-prefix=CHECK-OBJ
+.eabi_attribute Tag_CPU_arch, 4
+@CHECK: .eabi_attribute 6, 4
+@CHECK-OBJ: Tag: 6
+@CHECK-OBJ-NEXT: Value: 4
+@CHECK-OBJ-NEXT: TagName: CPU_arch
+@CHECK-OBJ-NEXT: Description: ARM v5TE
+
+.eabi_attribute Tag_FP_arch, 4
+@CHECK: .eabi_attribute 10, 4
+@CHECK-OBJ: Tag: 10
+@CHECK-OBJ-NEXT: Value: 4
+@CHECK-OBJ-NEXT: TagName: FP_arch
+@CHECK-OBJ-NEXT: Description: VFPv3-D16
+
+.eabi_attribute Tag_Advanced_SIMD_arch, 4
+@CHECK: .eabi_attribute 12, 4
+@CHECK-OBJ: Tag: 12
+@CHECK-OBJ-NEXT: Value: 4
+@CHECK-OBJ-NEXT: TagName: Advanced_SIMD_arch
+@CHECK-OBJ-NEXT: Description: ARMv8.1-a NEON
+
+.eabi_attribute Tag_PCS_config, 4
+@CHECK: .eabi_attribute 13, 4
+@CHECK-OBJ: Tag: 13
+@CHECK-OBJ-NEXT: Value: 4
+@CHECK-OBJ-NEXT: TagName: PCS_config
+@CHECK-OBJ-NEXT: Description: Palm OS 2004
+
+.eabi_attribute Tag_ABI_PCS_wchar_t, 4
+@CHECK: .eabi_attribute 18, 4
+@CHECK-OBJ: Tag: 18
+@CHECK-OBJ-NEXT: Value: 4
+@CHECK-OBJ-NEXT: TagName: ABI_PCS_wchar_t
+@CHECK-OBJ-NEXT: Description: 4-byte
+
+.eabi_attribute Tag_ABI_align_needed, 4
+@CHECK: .eabi_attribute 24, 4
+@CHECK-OBJ: Tag: 24
+@CHECK-OBJ-NEXT: Value: 4
+@CHECK-OBJ-NEXT: TagName: ABI_align_needed
+@CHECK-OBJ-NEXT: Description: 8-byte alignment, 16-byte extended alignment
+
+.eabi_attribute Tag_ABI_align_preserved, 4
+@CHECK: .eabi_attribute 25, 4
+@CHECK-OBJ: Tag: 25
+@CHECK-OBJ-NEXT: Value: 4
+@CHECK-OBJ-NEXT: TagName: ABI_align_preserved
+@CHECK-OBJ-NEXT: Description: 8-byte stack alignment, 16-byte data alignment
+
+.eabi_attribute Tag_ABI_optimization_goals, 4
+@CHECK: .eabi_attribute 30, 4
+@CHECK-OBJ: Tag: 30
+@CHECK-OBJ-NEXT: Value: 4
+@CHECK-OBJ-NEXT: TagName: ABI_optimization_goals
+@CHECK-OBJ-NEXT: Description: Aggressive Size
+
+.eabi_attribute Tag_ABI_FP_optimization_goals, 4
+@CHECK: .eabi_attribute 31, 4
+@CHECK-OBJ: Tag: 31
+@CHECK-OBJ-NEXT: Value: 4
+@CHECK-OBJ-NEXT: TagName: ABI_FP_optimization_goals
+@CHECK-OBJ-NEXT: Description: Aggressive Size
+
diff --git a/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-5.s b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-5.s
new file mode 100644
index 00000000000..d1d386ef978
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-5.s
@@ -0,0 +1,52 @@
+@ RUN: llvm-mc -triple armv7-elf -filetype asm -o - %s | FileCheck %s
+@ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s \
+@ RUN: | llvm-readobj --arch-specific - | FileCheck %s --check-prefix=CHECK-OBJ
+.eabi_attribute Tag_CPU_arch, 5
+@CHECK: .eabi_attribute 6, 5
+@CHECK-OBJ: Tag: 6
+@CHECK-OBJ-NEXT: Value: 5
+@CHECK-OBJ-NEXT: TagName: CPU_arch
+@CHECK-OBJ-NEXT: Description: ARM v5TEJ
+
+.eabi_attribute Tag_FP_arch, 5
+@CHECK: .eabi_attribute 10, 5
+@CHECK-OBJ: Tag: 10
+@CHECK-OBJ-NEXT: Value: 5
+@CHECK-OBJ-NEXT: TagName: FP_arch
+@CHECK-OBJ-NEXT: Description: VFPv4
+
+.eabi_attribute Tag_PCS_config, 5
+@CHECK: .eabi_attribute 13, 5
+@CHECK-OBJ: Tag: 13
+@CHECK-OBJ-NEXT: Value: 5
+@CHECK-OBJ-NEXT: TagName: PCS_config
+@CHECK-OBJ-NEXT: Description: Reserved (Palm OS)
+
+.eabi_attribute Tag_ABI_align_needed, 5
+@CHECK: .eabi_attribute 24, 5
+@CHECK-OBJ: Tag: 24
+@CHECK-OBJ-NEXT: Value: 5
+@CHECK-OBJ-NEXT: TagName: ABI_align_needed
+@CHECK-OBJ-NEXT: Description: 8-byte alignment, 32-byte extended alignment
+
+.eabi_attribute Tag_ABI_align_preserved, 5
+@CHECK: .eabi_attribute 25, 5
+@CHECK-OBJ: Tag: 25
+@CHECK-OBJ-NEXT: Value: 5
+@CHECK-OBJ-NEXT: TagName: ABI_align_preserved
+@CHECK-OBJ-NEXT: Description: 8-byte stack alignment, 32-byte data alignment
+
+.eabi_attribute Tag_ABI_optimization_goals, 5
+@CHECK: .eabi_attribute 30, 5
+@CHECK-OBJ: Tag: 30
+@CHECK-OBJ-NEXT: Value: 5
+@CHECK-OBJ-NEXT: TagName: ABI_optimization_goals
+@CHECK-OBJ-NEXT: Description: Debugging
+
+.eabi_attribute Tag_ABI_FP_optimization_goals, 5
+@CHECK: .eabi_attribute 31, 5
+@CHECK-OBJ: Tag: 31
+@CHECK-OBJ-NEXT: Value: 5
+@CHECK-OBJ-NEXT: TagName: ABI_FP_optimization_goals
+@CHECK-OBJ-NEXT: Description: Accuracy
+
diff --git a/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-6.s b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-6.s
new file mode 100644
index 00000000000..63c1019a3ac
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-6.s
@@ -0,0 +1,52 @@
+@ RUN: llvm-mc -triple armv7-elf -filetype asm -o - %s | FileCheck %s
+@ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s \
+@ RUN: | llvm-readobj --arch-specific - | FileCheck %s --check-prefix=CHECK-OBJ
+.eabi_attribute Tag_CPU_arch, 6
+@CHECK: .eabi_attribute 6, 6
+@CHECK-OBJ: Tag: 6
+@CHECK-OBJ-NEXT: Value: 6
+@CHECK-OBJ-NEXT: TagName: CPU_arch
+@CHECK-OBJ-NEXT: Description: ARM v6
+
+.eabi_attribute Tag_FP_arch, 6
+@CHECK: .eabi_attribute 10, 6
+@CHECK-OBJ: Tag: 10
+@CHECK-OBJ-NEXT: Value: 6
+@CHECK-OBJ-NEXT: TagName: FP_arch
+@CHECK-OBJ-NEXT: Description: VFPv4-D16
+
+.eabi_attribute Tag_PCS_config, 6
+@CHECK: .eabi_attribute 13, 6
+@CHECK-OBJ: Tag: 13
+@CHECK-OBJ-NEXT: Value: 6
+@CHECK-OBJ-NEXT: TagName: PCS_config
+@CHECK-OBJ-NEXT: Description: Symbian OS 2004
+
+.eabi_attribute Tag_ABI_align_needed, 6
+@CHECK: .eabi_attribute 24, 6
+@CHECK-OBJ: Tag: 24
+@CHECK-OBJ-NEXT: Value: 6
+@CHECK-OBJ-NEXT: TagName: ABI_align_needed
+@CHECK-OBJ-NEXT: Description: 8-byte alignment, 64-byte extended alignment
+
+.eabi_attribute Tag_ABI_align_preserved, 6
+@CHECK: .eabi_attribute 25, 6
+@CHECK-OBJ: Tag: 25
+@CHECK-OBJ-NEXT: Value: 6
+@CHECK-OBJ-NEXT: TagName: ABI_align_preserved
+@CHECK-OBJ-NEXT: Description: 8-byte stack alignment, 64-byte data alignment
+
+.eabi_attribute Tag_ABI_optimization_goals, 6
+@CHECK: .eabi_attribute 30, 6
+@CHECK-OBJ: Tag: 30
+@CHECK-OBJ-NEXT: Value: 6
+@CHECK-OBJ-NEXT: TagName: ABI_optimization_goals
+@CHECK-OBJ-NEXT: Description: Best Debugging
+
+.eabi_attribute Tag_ABI_FP_optimization_goals, 6
+@CHECK: .eabi_attribute 31, 6
+@CHECK-OBJ: Tag: 31
+@CHECK-OBJ-NEXT: Value: 6
+@CHECK-OBJ-NEXT: TagName: ABI_FP_optimization_goals
+@CHECK-OBJ-NEXT: Description: Best Accuracy
+
diff --git a/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-7.s b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-7.s
new file mode 100644
index 00000000000..7f511674aef
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-7.s
@@ -0,0 +1,38 @@
+@ RUN: llvm-mc -triple armv7-elf -filetype asm -o - %s | FileCheck %s
+@ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s \
+@ RUN: | llvm-readobj --arch-specific - | FileCheck %s --check-prefix=CHECK-OBJ
+.eabi_attribute Tag_CPU_arch, 7
+@CHECK: .eabi_attribute 6, 7
+@CHECK-OBJ: Tag: 6
+@CHECK-OBJ-NEXT: Value: 7
+@CHECK-OBJ-NEXT: TagName: CPU_arch
+@CHECK-OBJ-NEXT: Description: ARM v6KZ
+
+.eabi_attribute Tag_FP_arch, 7
+@CHECK: .eabi_attribute 10, 7
+@CHECK-OBJ: Tag: 10
+@CHECK-OBJ-NEXT: Value: 7
+@CHECK-OBJ-NEXT: TagName: FP_arch
+@CHECK-OBJ-NEXT: Description: ARMv8-a FP
+
+.eabi_attribute Tag_PCS_config, 7
+@CHECK: .eabi_attribute 13, 7
+@CHECK-OBJ: Tag: 13
+@CHECK-OBJ-NEXT: Value: 7
+@CHECK-OBJ-NEXT: TagName: PCS_config
+@CHECK-OBJ-NEXT: Description: Reserved (Symbian OS)
+
+.eabi_attribute Tag_ABI_align_needed, 7
+@CHECK: .eabi_attribute 24, 7
+@CHECK-OBJ: Tag: 24
+@CHECK-OBJ-NEXT: Value: 7
+@CHECK-OBJ-NEXT: TagName: ABI_align_needed
+@CHECK-OBJ-NEXT: Description: 8-byte alignment, 128-byte extended alignment
+
+.eabi_attribute Tag_ABI_align_preserved, 7
+@CHECK: .eabi_attribute 25, 7
+@CHECK-OBJ: Tag: 25
+@CHECK-OBJ-NEXT: Value: 7
+@CHECK-OBJ-NEXT: TagName: ABI_align_preserved
+@CHECK-OBJ-NEXT: Description: 8-byte stack alignment, 128-byte data alignment
+
diff --git a/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-8.s b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-8.s
new file mode 100644
index 00000000000..42e2c878408
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-8.s
@@ -0,0 +1,31 @@
+@ RUN: llvm-mc -triple armv7-elf -filetype asm -o - %s | FileCheck %s
+@ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s \
+@ RUN: | llvm-readobj --arch-specific - | FileCheck %s --check-prefix=CHECK-OBJ
+.eabi_attribute Tag_CPU_arch, 8
+@CHECK: .eabi_attribute 6, 8
+@CHECK-OBJ: Tag: 6
+@CHECK-OBJ-NEXT: Value: 8
+@CHECK-OBJ-NEXT: TagName: CPU_arch
+@CHECK-OBJ-NEXT: Description: ARM v6T2
+
+.eabi_attribute Tag_FP_arch, 8
+@CHECK: .eabi_attribute 10, 8
+@CHECK-OBJ: Tag: 10
+@CHECK-OBJ-NEXT: Value: 8
+@CHECK-OBJ-NEXT: TagName: FP_arch
+@CHECK-OBJ-NEXT: Description: ARMv8-a FP-D16
+
+.eabi_attribute Tag_ABI_align_needed, 8
+@CHECK: .eabi_attribute 24, 8
+@CHECK-OBJ: Tag: 24
+@CHECK-OBJ-NEXT: Value: 8
+@CHECK-OBJ-NEXT: TagName: ABI_align_needed
+@CHECK-OBJ-NEXT: Description: 8-byte alignment, 256-byte extended alignment
+
+.eabi_attribute Tag_ABI_align_preserved, 8
+@CHECK: .eabi_attribute 25, 8
+@CHECK-OBJ: Tag: 25
+@CHECK-OBJ-NEXT: Value: 8
+@CHECK-OBJ-NEXT: TagName: ABI_align_preserved
+@CHECK-OBJ-NEXT: Description: 8-byte stack alignment, 256-byte data alignment
+
diff --git a/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-9.s b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-9.s
new file mode 100644
index 00000000000..1d15ddeb79f
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-9.s
@@ -0,0 +1,24 @@
+@ RUN: llvm-mc -triple armv7-elf -filetype asm -o - %s | FileCheck %s
+@ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s \
+@ RUN: | llvm-readobj --arch-specific - | FileCheck %s --check-prefix=CHECK-OBJ
+.eabi_attribute Tag_CPU_arch, 9
+@CHECK: .eabi_attribute 6, 9
+@CHECK-OBJ: Tag: 6
+@CHECK-OBJ-NEXT: Value: 9
+@CHECK-OBJ-NEXT: TagName: CPU_arch
+@CHECK-OBJ-NEXT: Description: ARM v6K
+
+.eabi_attribute Tag_ABI_align_needed, 9
+@CHECK: .eabi_attribute 24, 9
+@CHECK-OBJ: Tag: 24
+@CHECK-OBJ-NEXT: Value: 9
+@CHECK-OBJ-NEXT: TagName: ABI_align_needed
+@CHECK-OBJ-NEXT: Description: 8-byte alignment, 512-byte extended alignment
+
+.eabi_attribute Tag_ABI_align_preserved, 9
+@CHECK: .eabi_attribute 25, 9
+@CHECK-OBJ: Tag: 25
+@CHECK-OBJ-NEXT: Value: 9
+@CHECK-OBJ-NEXT: TagName: ABI_align_preserved
+@CHECK-OBJ-NEXT: Description: 8-byte stack alignment, 512-byte data alignment
+
diff --git a/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-A.s b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-A.s
new file mode 100644
index 00000000000..105e70532aa
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-A.s
@@ -0,0 +1,10 @@
+@ RUN: llvm-mc -triple armv7-elf -filetype asm -o - %s | FileCheck %s
+@ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s \
+@ RUN: | llvm-readobj --arch-specific - | FileCheck %s --check-prefix=CHECK-OBJ
+.eabi_attribute Tag_CPU_arch_profile, 'A'
+@CHECK: .eabi_attribute 7, 65
+@CHECK-OBJ: Tag: 7
+@CHECK-OBJ-NEXT: Value: 65
+@CHECK-OBJ-NEXT: TagName: CPU_arch_profile
+@CHECK-OBJ-NEXT: Description: Application
+
diff --git a/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-M.s b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-M.s
new file mode 100644
index 00000000000..72ea70f30c7
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-M.s
@@ -0,0 +1,10 @@
+@ RUN: llvm-mc -triple armv7-elf -filetype asm -o - %s | FileCheck %s
+@ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s \
+@ RUN: | llvm-readobj --arch-specific - | FileCheck %s --check-prefix=CHECK-OBJ
+.eabi_attribute Tag_CPU_arch_profile, 'M'
+@CHECK: .eabi_attribute 7, 77
+@CHECK-OBJ: Tag: 7
+@CHECK-OBJ-NEXT: Value: 77
+@CHECK-OBJ-NEXT: TagName: CPU_arch_profile
+@CHECK-OBJ-NEXT: Description: Microcontroller
+
diff --git a/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-R.s b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-R.s
new file mode 100644
index 00000000000..6a4c2620bab
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-R.s
@@ -0,0 +1,10 @@
+@ RUN: llvm-mc -triple armv7-elf -filetype asm -o - %s | FileCheck %s
+@ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s \
+@ RUN: | llvm-readobj --arch-specific - | FileCheck %s --check-prefix=CHECK-OBJ
+.eabi_attribute Tag_CPU_arch_profile, 'R'
+@CHECK: .eabi_attribute 7, 82
+@CHECK-OBJ: Tag: 7
+@CHECK-OBJ-NEXT: Value: 82
+@CHECK-OBJ-NEXT: TagName: CPU_arch_profile
+@CHECK-OBJ-NEXT: Description: Real-time
+
diff --git a/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-S.s b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-S.s
new file mode 100644
index 00000000000..a8cd27c156c
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-S.s
@@ -0,0 +1,10 @@
+@ RUN: llvm-mc -triple armv7-elf -filetype asm -o - %s | FileCheck %s
+@ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s \
+@ RUN: | llvm-readobj --arch-specific - | FileCheck %s --check-prefix=CHECK-OBJ
+.eabi_attribute Tag_CPU_arch_profile, 'S'
+@CHECK: .eabi_attribute 7, 83
+@CHECK-OBJ: Tag: 7
+@CHECK-OBJ-NEXT: Value: 83
+@CHECK-OBJ-NEXT: TagName: CPU_arch_profile
+@CHECK-OBJ-NEXT: Description: Classic
+
diff --git a/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-conformance-1.s b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-conformance-1.s
new file mode 100644
index 00000000000..2ceaca2cced
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-conformance-1.s
@@ -0,0 +1,10 @@
+@ RUN: llvm-mc -triple armv7-elf -filetype asm -o - %s | FileCheck %s
+@ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s \
+@ RUN: | llvm-readobj --arch-specific - | FileCheck %s --check-prefix=CHECK-OBJ
+@ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s \
+@ RUN: | llvm-readobj -A - | FileCheck %s --check-prefix=CHECK-OBJ
+.eabi_attribute Tag_conformance, "0"
+@CHECK: .eabi_attribute 67, "0"
+@CHECK-OBJ: Tag: 67
+@CHECK-OBJ-NEXT: TagName: conformance
+@CHECK-OBJ-NEXT: Value: 0
diff --git a/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-conformance-2.s b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-conformance-2.s
new file mode 100644
index 00000000000..2ac459aa237
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-conformance-2.s
@@ -0,0 +1,10 @@
+@ RUN: llvm-mc -triple armv7-elf -filetype asm -o - %s | FileCheck %s
+@ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s \
+@ RUN: | llvm-readobj --arch-specific - | FileCheck %s --check-prefix=CHECK-OBJ
+@ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s \
+@ RUN: | llvm-readobj -A - | FileCheck %s --check-prefix=CHECK-OBJ
+.eabi_attribute Tag_conformance, "A.long--non numeric oddity...!!"
+@CHECK: .eabi_attribute 67, "A.long--non numeric oddity...!!"
+@CHECK-OBJ: Tag: 67
+@CHECK-OBJ-NEXT: TagName: conformance
+@CHECK-OBJ-NEXT: Value: A.long--non numeric oddity...!!
diff --git a/llvm/test/tools/llvm-readobj/ELF/ARM/dwarf-cfi.s b/llvm/test/tools/llvm-readobj/ELF/ARM/dwarf-cfi.s
new file mode 100644
index 00000000000..36d71d61c9f
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/ARM/dwarf-cfi.s
@@ -0,0 +1,27 @@
+# RUN: llvm-mc -triple arm-linux -filetype obj -o - %s | llvm-readobj -u | FileCheck %s
+
+# CHECK: [0x0] CIE length=16
+# CHECK-NEXT: version: 1
+# CHECK-NEXT: augmentation: zR
+# CHECK-NEXT: code_alignment_factor: 1
+# CHECK-NEXT: data_alignment_factor: -4
+# CHECK-NEXT: return_address_register: 14
+
+# CHECK: Program:
+# CHECK-NEXT: DW_CFA_def_cfa: reg13 +0
+
+# CHECK: [0x14] FDE length=16 cie=[0x0]
+# CHECK-NEXT: initial_location: 0x0
+# CHECK-NEXT: address_range: 0x4 (end : 0x4)
+
+# CHECK: Program:
+# CHECK-NEXT: DW_CFA_nop:
+# CHECK-NEXT: DW_CFA_nop:
+# CHECK-NEXT: DW_CFA_nop:
+
+.cpu cortex-a8
+
+foo:
+.cfi_startproc
+bx lr
+.cfi_endproc
diff --git a/llvm/test/tools/llvm-readobj/ELF/ARM/lit.local.cfg b/llvm/test/tools/llvm-readobj/ELF/ARM/lit.local.cfg
new file mode 100644
index 00000000000..236e1d34416
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/ARM/lit.local.cfg
@@ -0,0 +1,2 @@
+if not 'ARM' in config.root.targets:
+ config.unsupported = True
diff --git a/llvm/test/tools/llvm-readobj/ELF/ARM/unwind.s b/llvm/test/tools/llvm-readobj/ELF/ARM/unwind.s
new file mode 100644
index 00000000000..ef17118283b
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/ARM/unwind.s
@@ -0,0 +1,329 @@
+@ RUN: llvm-mc -triple armv7-linux-eabi -filetype obj %s -o %t
+@ RUN: llvm-readobj -u %t | FileCheck --check-prefixes=CHECK,SYM %s
+
+@@ If .symtab doesn't exist, we can still dump some information.
+@ RUN: llvm-objcopy --allow-broken-links --strip-all %t - | llvm-readobj -u - | FileCheck %s
+
+ .syntax unified
+
+ .cpu cortex-a8
+ .fpu neon
+
+ .section .personality
+
+ .type __personality,%function
+__personality:
+ .fnstart
+ bkpt
+ .fnend
+
+
+ .section .personality0
+
+ .type personality0,%function
+personality0:
+ .fnstart
+ bx lr
+ .fnend
+
+
+ .section .personality1
+
+ .type personality1,%function
+personality1:
+ .fnstart
+ .pad #0x100
+ sub sp, sp, #0x100
+ .save {r0-r11}
+ push {r0-r11}
+ pop {r0-r11}
+ add sp, sp, #0x100
+ bx lr
+ .fnend
+
+
+ .section .custom_personality
+
+ .type custom_personality,%function
+custom_personality:
+ .fnstart
+ .personality __personality
+ bx lr
+ .fnend
+
+
+ .section .opcodes
+
+ .type opcodes,%function
+opcodes:
+ .fnstart
+ .vsave {d8-d12}
+ vpush {d8-d12}
+ vpop {d8-d12}
+ bx lr
+ .fnend
+
+
+ .section .multiple
+
+ .type function0,%function
+function0:
+ .fnstart
+ bx lr
+ .fnend
+
+ .type function1,%function
+function1:
+ .fnstart
+ .personality __personality
+ bx lr
+ .fnend
+
+ .type function2,%function
+function2:
+ .fnstart
+ bx lr
+ .fnend
+
+ .section .raw
+
+ .type raw,%function
+ .thumb_func
+raw:
+ .fnstart
+ .unwind_raw 12, 0x02
+ .unwind_raw -12, 0x42
+ .unwind_raw 0, 0x80, 0x00
+ .unwind_raw 4, 0x81, 0x00
+ .unwind_raw 4, 0x80, 0x01
+ .unwind_raw 8, 0x80, 0xc0
+ .unwind_raw 12, 0x84, 0xc0
+ .unwind_raw 0, 0x91
+ .unwind_raw 8, 0xa1
+ .unwind_raw 12, 0xa9
+ .unwind_raw 0, 0xb0
+ .unwind_raw 4, 0xb1, 0x01
+ .unwind_raw 0xa04, 0xb2, 0x80, 0x04
+ .unwind_raw 24, 0xb3, 0x12
+ .unwind_raw 24, 0xba
+ .unwind_raw 24, 0xc2
+ .unwind_raw 24, 0xc6, 0x02
+ .unwind_raw 8, 0xc7, 0x03
+ .unwind_raw 24, 0xc8, 0x02
+ .unwind_raw 24, 0xc9, 0x02
+ .unwind_raw 64, 0xd7
+ .fnend
+
+ .section .spare
+
+ .type spare,%function
+spare:
+ .fnstart
+ .unwind_raw 4, 0x00
+ .unwind_raw -4, 0x40
+ .unwind_raw 0, 0x80, 0x00
+ .unwind_raw 4, 0x88, 0x00
+ .unwind_raw 0, 0x91
+ .unwind_raw 0, 0x9d
+ .unwind_raw 0, 0x9f
+ .unwind_raw 0, 0xa0
+ .unwind_raw 0, 0xa8
+ .unwind_raw 0, 0xb0
+ .unwind_raw 0, 0xb1, 0x00
+ .unwind_raw 4, 0xb1, 0x01
+ .unwind_raw 0, 0xb1, 0x10
+ .unwind_raw 0x204, 0xb2, 0x00
+ .unwind_raw 16, 0xb3, 0x00
+ .unwind_raw 0, 0xb4
+ .unwind_raw 16, 0xb8
+ .unwind_raw 4, 0xc0
+ .unwind_raw 4, 0xc6, 0x00
+ .unwind_raw 4, 0xc7, 0x00
+ .unwind_raw 4, 0xc7, 0x01
+ .unwind_raw 0, 0xc7, 0x10
+ .unwind_raw 16, 0xc8, 0x00
+ .unwind_raw 16, 0xc9, 0x00
+ .unwind_raw 0, 0xca
+ .unwind_raw 16, 0xd0
+ .unwind_raw 0, 0xd8
+ .fnend
+
+@ CHECK: UnwindInformation {
+@ CHECK: UnwindIndexTable {
+@ CHECK: SectionName: .ARM.exidx.personality
+@ CHECK: Entries [
+@ CHECK: Entry {
+@ CHECK: FunctionAddress: 0x0
+@ SYM: FunctionName: __personality
+@ CHECK: Model: Compact (Inline)
+@ CHECK: PersonalityIndex: 0
+@ CHECK: Opcodes [
+@ CHECK: 0xB0 ; finish
+@ CHECK: 0xB0 ; finish
+@ CHECK: 0xB0 ; finish
+@ CHECK: ]
+@ CHECK: }
+@ CHECK: ]
+@ CHECK: }
+@ CHECK: UnwindIndexTable {
+@ CHECK: SectionName: .ARM.exidx.personality0
+@ CHECK: Entries [
+@ CHECK: Entry {
+@ CHECK: FunctionAddress: 0x0
+@ SYM: FunctionName: personality0
+@ CHECK: Model: Compact (Inline)
+@ CHECK: PersonalityIndex: 0
+@ CHECK: Opcodes [
+@ CHECK: 0xB0 ; finish
+@ CHECK: 0xB0 ; finish
+@ CHECK: 0xB0 ; finish
+@ CHECK: ]
+@ CHECK: }
+@ CHECK: ]
+@ CHECK: }
+@ CHECK: UnwindIndexTable {
+@ CHECK: SectionName: .ARM.exidx.personality1
+@ CHECK: Entries [
+@ CHECK: Entry {
+@ CHECK: FunctionAddress: 0x0
+@ SYM: FunctionName: personality1
+@ SYM: ExceptionHandlingTable: .ARM.extab.personality1
+@ SYM: TableEntryOffset: 0x0
+@ SYM: Model: Compact
+@ SYM: PersonalityIndex: 1
+@ SYM: Opcodes [
+@ SYM: 0xB1 0x0F ; pop {r0, r1, r2, r3}
+@ SYM: 0xA7 ; pop {r4, r5, r6, r7, r8, r9, r10, fp}
+@ SYM: 0x3F ; vsp = vsp + 256
+@ SYM: 0xB0 ; finish
+@ SYM: 0xB0 ; finish
+@ SYM: ]
+@ CHECK: }
+@ CHECK: ]
+@ CHECK: }
+@ CHECK: UnwindIndexTable {
+@ CHECK: SectionName: .ARM.exidx.custom_personality
+@ CHECK: Entries [
+@ CHECK: Entry {
+@ CHECK: FunctionAddress: 0x0
+@ SYM: FunctionName: custom_personality
+@ SYM: ExceptionHandlingTable: .ARM.extab.custom_personality
+@ SYM: TableEntryOffset: 0x0
+@ SYM: Model: Generic
+@ SYM: PersonalityRoutineAddress: 0x0
+@ CHECK: }
+@ CHECK: ]
+@ CHECK: }
+@ CHECK: UnwindIndexTable {
+@ CHECK: SectionName: .ARM.exidx.opcodes
+@ CHECK: Entries [
+@ CHECK: Entry {
+@ CHECK: FunctionAddress: 0x0
+@ SYM: FunctionName: opcodes
+@ CHECK: Model: Compact (Inline)
+@ CHECK: PersonalityIndex: 0
+@ CHECK: Opcodes [
+@ CHECK: 0xC9 0x84 ; pop {d8, d9, d10, d11, d12}
+@ CHECK: 0xB0 ; finish
+@ CHECK: ]
+@ CHECK: }
+@ CHECK: ]
+@ CHECK: }
+@ CHECK: UnwindIndexTable {
+@ CHECK: SectionName: .ARM.exidx.multiple
+@ CHECK: Entries [
+@ CHECK: Entry {
+@ CHECK: FunctionAddress: 0x0
+@ SYM: FunctionName: function0
+@ CHECK: Model: Compact (Inline)
+@ CHECK: PersonalityIndex: 0
+@ CHECK: Opcodes [
+@ CHECK: 0xB0 ; finish
+@ CHECK: 0xB0 ; finish
+@ CHECK: 0xB0 ; finish
+@ CHECK: ]
+@ CHECK: }
+@ CHECK: Entry {
+@ CHECK: FunctionAddress: 0x4
+@ SYM: FunctionName: function1
+@ SYM: ExceptionHandlingTable: .ARM.extab.multiple
+@ SYM: Model: Generic
+@ SYM: PersonalityRoutineAddress: 0x0
+@ CHECK: }
+@ CHECK: Entry {
+@ CHECK: FunctionAddress: 0x8
+@ SYM: FunctionName: function2
+@ CHECK: Model: Compact (Inline)
+@ CHECK: PersonalityIndex: 0
+@ CHECK: Opcodes [
+@ CHECK: 0xB0 ; finish
+@ CHECK: 0xB0 ; finish
+@ CHECK: 0xB0 ; finish
+@ CHECK: ]
+@ CHECK: }
+@ CHECK: ]
+@ CHECK: }
+@ CHECK: UnwindIndexTable {
+@ CHECK: SectionName: .ARM.exidx.raw
+@ CHECK: Entries [
+@ SYM: Opcodes [
+@ SYM: 0xD7 ; pop {d8, d9, d10, d11, d12, d13, d14, d15}
+@ SYM: 0xC9 0x02 ; pop {d0, d1, d2}
+@ SYM: 0xC8 0x02 ; pop {d16, d17, d18}
+@ SYM: 0xC7 0x03 ; pop {wCGR0, wCGR1}
+@ SYM: 0xC6 0x02 ; pop {wR0, wR1, wR2}
+@ SYM: 0xC2 ; pop {wR10, wR11, wR12}
+@ SYM: 0xBA ; pop {d8, d9, d10}
+@ SYM: 0xB3 0x12 ; pop {d1, d2, d3}
+@ SYM: 0xB2 0x80 0x04 ; vsp = vsp + 2564
+@ SYM: 0xB1 0x01 ; pop {r0}
+@ SYM: 0xB0 ; finish
+@ SYM: 0xA9 ; pop {r4, r5, lr}
+@ SYM: 0xA1 ; pop {r4, r5}
+@ SYM: 0x91 ; vsp = r1
+@ SYM: 0x84 0xC0 ; pop {r10, fp, lr}
+@ SYM: 0x80 0xC0 ; pop {r10, fp}
+@ SYM: 0x80 0x01 ; pop {r4}
+@ SYM: 0x81 0x00 ; pop {ip}
+@ SYM: 0x80 0x00 ; refuse to unwind
+@ SYM: 0x42 ; vsp = vsp - 12
+@ SYM: 0x02 ; vsp = vsp + 12
+@ SYM: ]
+@ CHECK: ]
+@ CHECK: }
+@ CHECK: UnwindIndexTable {
+@ CHECK: SectionName: .ARM.exidx.spare
+@ CHECK: Entries [
+@ SYM: Opcodes [
+@ SYM: 0xD8 ; spare
+@ SYM: 0xD0 ; pop {d8}
+@ SYM: 0xCA ; spare
+@ SYM: 0xC9 0x00 ; pop {d0}
+@ SYM: 0xC8 0x00 ; pop {d16}
+@ SYM: 0xC7 0x10 ; spare
+@ SYM: 0xC7 0x01 ; pop {wCGR0}
+@ SYM: 0xC7 0x00 ; spare
+@ SYM: 0xC6 0x00 ; pop {wR0}
+@ SYM: 0xC0 ; pop {wR10}
+@ SYM: 0xB8 ; pop {d8}
+@ SYM: 0xB4 ; spare
+@ SYM: 0xB3 0x00 ; pop {d0}
+@ SYM: 0xB2 0x00 ; vsp = vsp + 516
+@ SYM: 0xB1 0x10 ; spare
+@ SYM: 0xB1 0x01 ; pop {r0}
+@ SYM: 0xB1 0x00 ; spare
+@ SYM: 0xB0 ; finish
+@ SYM: 0xA8 ; pop {r4, lr}
+@ SYM: 0xA0 ; pop {r4}
+@ SYM: 0x9F ; reserved (WiMMX MOVrr)
+@ SYM: 0x9D ; reserved (ARM MOVrr)
+@ SYM: 0x91 ; vsp = r1
+@ SYM: 0x88 0x00 ; pop {pc}
+@ SYM: 0x80 0x00 ; refuse to unwind
+@ SYM: 0x40 ; vsp = vsp - 4
+@ SYM: 0x00 ; vsp = vsp + 4
+@ SYM: ]
+@ CHECK: ]
+@ CHECK: }
+@ CHECK: }
+
diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/abiflags.obj.elf-mips b/llvm/test/tools/llvm-readobj/ELF/Inputs/abiflags.obj.elf-mips
new file mode 100644
index 00000000000..edcd50becec
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/abiflags.obj.elf-mips
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/abiflags.obj.elf-mipsel b/llvm/test/tools/llvm-readobj/ELF/Inputs/abiflags.obj.elf-mipsel
new file mode 100644
index 00000000000..bb5f43d2862
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/abiflags.obj.elf-mipsel
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/compression.zlib.style.elf-x86-64 b/llvm/test/tools/llvm-readobj/ELF/Inputs/compression.zlib.style.elf-x86-64
new file mode 100644
index 00000000000..34cdb8a89ed
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/compression.zlib.style.elf-x86-64
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/dynamic-table-exe.mips b/llvm/test/tools/llvm-readobj/ELF/Inputs/dynamic-table-exe.mips
new file mode 100644
index 00000000000..28d8e33752c
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/dynamic-table-exe.mips
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/dynamic-table-so.mips b/llvm/test/tools/llvm-readobj/ELF/Inputs/dynamic-table-so.mips
new file mode 100644
index 00000000000..ab36ceeb5a0
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/dynamic-table-so.mips
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/dynamic-table-so.x86 b/llvm/test/tools/llvm-readobj/ELF/Inputs/dynamic-table-so.x86
new file mode 100644
index 00000000000..01bd1c2fc1e
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/dynamic-table-so.x86
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/dynamic-table.c b/llvm/test/tools/llvm-readobj/ELF/Inputs/dynamic-table.c
new file mode 100644
index 00000000000..9d45720eb67
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/dynamic-table.c
@@ -0,0 +1,14 @@
+// clang -target x86_64-linux-gnu -shared -fPIC -lc dynamic-table.c \
+// -o dynamic-table-so.x86 -Wl,-f,aux.so -Wl,-F,filter.so
+// clang -target mipsel-linux-gnu -shared -fPIC -lc dynamic-table.c \
+// -o dynamic-table-so.mips
+// clang -target mipsel-linux-gnu -lc dynamic-table.c \
+// -o dynamic-table-exe.mips
+int puts(const char *);
+
+__thread int foo;
+
+int main(void) {
+ puts("Hello, World");
+ foo = 0;
+}
diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/elf-dynamic-tags-machine-specific.yaml b/llvm/test/tools/llvm-readobj/ELF/Inputs/elf-dynamic-tags-machine-specific.yaml
new file mode 100644
index 00000000000..222b8723e11
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/elf-dynamic-tags-machine-specific.yaml
@@ -0,0 +1,276 @@
+# Used by llvm-readobj/elf-dynamic-tags-machine-specific.test and
+# llvm-objdump/elf-dynamic-section-machine-specific.test.
+
+# First document: Hexagon
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_HEXAGON
+Sections:
+ - Name: .dynstr
+ Type: SHT_STRTAB
+ Address: 0x1000
+ Size: 0x10
+ Content: "004400550066007700"
+ - Name: .dynamic
+ Type: SHT_DYNAMIC
+ Address: 0x1010
+ Entries:
+ - Tag: DT_HASH
+ Value: 0x1000
+ - Tag: DT_HEXAGON_SYMSZ
+ Value: 0x10
+ - Tag: DT_HEXAGON_VER
+ Value: 0x1000
+ - Tag: DT_HEXAGON_PLT
+ Value: 0x1000
+ - Tag: 0x1234abcd
+ Value: 0x1
+ - Tag: DT_NULL
+ Value: 0
+ProgramHeaders:
+ - Type: PT_LOAD
+ VAddr: 0x1000
+ Sections:
+ - Section: .dynstr
+ - Section: .dynamic
+ - Type: PT_DYNAMIC
+ VAddr: 0x1010
+ Sections:
+ - Section: .dynamic
+
+# Second document: MIPS
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_MIPS
+Sections:
+ - Name: .dynstr
+ Type: SHT_STRTAB
+ Address: 0x1000
+ Size: 0x10
+ Content: "004400550066007700"
+ - Name: .dynamic
+ Type: SHT_DYNAMIC
+ Address: 0x1010
+ Entries:
+ - Tag: DT_HASH
+ Value: 0x1000
+ - Tag: DT_MIPS_RLD_VERSION
+ Value: 0x12345678
+ - Tag: DT_MIPS_TIME_STAMP
+ Value: 0x11223344
+ - Tag: DT_MIPS_ICHECKSUM
+ Value: 0x11112222
+ - Tag: DT_MIPS_IVERSION
+ Value: 0x1
+ - Tag: DT_MIPS_FLAGS
+ Value: 0x11111111
+ - Tag: DT_MIPS_BASE_ADDRESS
+ Value: 0x87654321
+ - Tag: DT_MIPS_MSYM
+ Value: 0x1000
+ - Tag: DT_MIPS_CONFLICT
+ Value: 0x1000
+ - Tag: DT_MIPS_LIBLIST
+ Value: 0x1000
+ - Tag: DT_MIPS_LOCAL_GOTNO
+ Value: 0x1
+ - Tag: DT_MIPS_CONFLICTNO
+ Value: 0x1
+ - Tag: DT_MIPS_LIBLISTNO
+ Value: 0x1
+ - Tag: DT_MIPS_SYMTABNO
+ Value: 0x1
+ - Tag: DT_MIPS_UNREFEXTNO
+ Value: 0x0
+ - Tag: DT_MIPS_GOTSYM
+ Value: 0x0
+ - Tag: DT_MIPS_HIPAGENO
+ Value: 0x88776655
+ - Tag: DT_MIPS_RLD_MAP
+ Value: 0x1000
+ - Tag: DT_MIPS_DELTA_CLASS
+ Value: 0x1000
+ - Tag: DT_MIPS_DELTA_CLASS_NO
+ Value: 0x1
+ - Tag: DT_MIPS_DELTA_INSTANCE
+ Value: 0x1000
+ - Tag: DT_MIPS_DELTA_INSTANCE_NO
+ Value: 0x1
+ - Tag: DT_MIPS_DELTA_RELOC
+ Value: 0x1000
+ - Tag: DT_MIPS_DELTA_RELOC_NO
+ Value: 0x1
+ - Tag: DT_MIPS_DELTA_SYM
+ Value: 0x1000
+ - Tag: DT_MIPS_DELTA_SYM_NO
+ Value: 0x1
+ - Tag: DT_MIPS_DELTA_CLASSSYM
+ Value: 0x1000
+ - Tag: DT_MIPS_DELTA_CLASSSYM_NO
+ Value: 0x1
+ - Tag: DT_MIPS_CXX_FLAGS
+ Value: 0x88887777
+ - Tag: DT_MIPS_PIXIE_INIT
+ Value: 0x1000
+ - Tag: DT_MIPS_LOCALPAGE_GOTIDX
+ Value: 0x1
+ - Tag: DT_MIPS_LOCAL_GOTIDX
+ Value: 0x1
+ - Tag: DT_MIPS_HIDDEN_GOTIDX
+ Value: 0x1
+ - Tag: DT_MIPS_PROTECTED_GOTIDX
+ Value: 0x1
+ - Tag: DT_MIPS_OPTIONS
+ Value: 0x1000
+ - Tag: DT_MIPS_INTERFACE
+ Value: 0x1000
+ - Tag: DT_MIPS_DYNSTR_ALIGN
+ Value: 0x88888888
+ - Tag: DT_MIPS_INTERFACE_SIZE
+ Value: 0x10
+ - Tag: DT_MIPS_RLD_TEXT_RESOLVE_ADDR
+ Value: 0x8
+ - Tag: DT_MIPS_PERF_SUFFIX
+ Value: 0x0
+ - Tag: DT_MIPS_COMPACT_SIZE
+ Value: 0x10
+ - Tag: DT_MIPS_GP_VALUE
+ Value: 0x1
+ - Tag: DT_MIPS_AUX_DYNAMIC
+ Value: 0x1000
+ - Tag: DT_MIPS_PLTGOT
+ Value: 0x1000
+ - Tag: DT_MIPS_RWPLT
+ Value: 0x1000
+ - Tag: DT_MIPS_RLD_MAP_REL
+ Value: 0x1000
+ - Tag: 0x1234abcd
+ Value: 0x1
+ - Tag: DT_NULL
+ Value: 0
+ProgramHeaders:
+ - Type: PT_LOAD
+ VAddr: 0x1000
+ Sections:
+ - Section: .dynstr
+ - Section: .dynamic
+ - Type: PT_DYNAMIC
+ VAddr: 0x1010
+ Sections:
+ - Section: .dynamic
+
+# Third document: PPC
+--- !ELF
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2MSB
+ Type: ET_EXEC
+ Machine: EM_PPC
+Sections:
+ - Name: .dynstr
+ Type: SHT_STRTAB
+ Address: 0x200
+ Size: 0x10
+ Content: "004400550066007700"
+ - Name: .dynamic
+ Type: SHT_DYNAMIC
+ Address: 0x20000
+ Entries:
+ - Tag: DT_PPC_GOT
+ Value: 0x200c0
+ - Tag: DT_PPC_OPT
+ Value: 1
+ - Tag: 0x1234abcd
+ Value: 0x1
+ - Tag: DT_NULL
+ Value: 0
+ProgramHeaders:
+ - Type: PT_LOAD
+ VAddr: 0x1000
+ Sections:
+ - Section: .dynstr
+ - Section: .dynamic
+ - Type: PT_DYNAMIC
+ VAddr: 0x20000
+ Sections:
+ - Section: .dynamic
+
+# Fourth document: PPC64
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_PPC64
+Sections:
+ - Name: .dynstr
+ Type: SHT_STRTAB
+ Address: 0x1000
+ Size: 0x10
+ Content: "004400550066007700"
+ - Name: .dynamic
+ Type: SHT_DYNAMIC
+ Address: 0x1010
+ Entries:
+ - Tag: DT_HASH
+ Value: 0x1000
+ - Tag: DT_PPC64_GLINK
+ Value: 0x1000
+ - Tag: 0x1234abcd
+ Value: 0x1
+ - Tag: DT_NULL
+ Value: 0
+ProgramHeaders:
+ - Type: PT_LOAD
+ VAddr: 0x1000
+ Sections:
+ - Section: .dynstr
+ - Section: .dynamic
+ - Type: PT_DYNAMIC
+ VAddr: 0x1010
+ Sections:
+ - Section: .dynamic
+
+# Fourth document: AARCH64
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_AARCH64
+Sections:
+ - Name: .dynstr
+ Type: SHT_STRTAB
+ Address: 0x1000
+ Size: 0x10
+ Content: "004400550066007700"
+ - Name: .dynamic
+ Type: SHT_DYNAMIC
+ Address: 0x1010
+ Entries:
+ - Tag: DT_HASH
+ Value: 0x1000
+ - Tag: DT_AARCH64_BTI_PLT
+ Value: 0
+ - Tag: DT_AARCH64_PAC_PLT
+ Value: 0
+ - Tag: 0x1234abcd
+ Value: 0x1
+ - Tag: DT_NULL
+ Value: 0
+ProgramHeaders:
+ - Type: PT_LOAD
+ VAddr: 0x1000
+ Sections:
+ - Section: .dynstr
+ - Section: .dynamic
+ - Type: PT_DYNAMIC
+ VAddr: 0x1010
+ Sections:
+ - Section: .dynamic
diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/elf-packed-relocs1.s b/llvm/test/tools/llvm-readobj/ELF/Inputs/elf-packed-relocs1.s
new file mode 100644
index 00000000000..ac844095104
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/elf-packed-relocs1.s
@@ -0,0 +1,37 @@
+.ascii "APS2"
+.sleb128 8 // Number of relocations
+.sleb128 4096 // Initial offset
+
+.sleb128 2 // Number of relocations in group
+.sleb128 1 // RELOCATION_GROUPED_BY_INFO_FLAG
+.sleb128 8 // R_X86_RELATIVE
+
+.sleb128 256 // Reloc 1: r_offset delta
+.sleb128 128 // Reloc 2: r_offset delta
+
+.sleb128 2 // Number of relocations in group
+.sleb128 2 // RELOCATION_GROUPED_BY_OFFSET_DELTA_FLAG
+.sleb128 8 // offset delta
+
+.sleb128 (1 << 32) | 1 // R_X86_64_64 (sym index 1)
+.sleb128 (2 << 32) | 1 // R_X86_64_64 (sym index 2)
+
+.sleb128 2 // Number of relocations in group
+.sleb128 8 // RELOCATION_GROUP_HAS_ADDEND_FLAG
+
+.sleb128 1 // offset delta
+.sleb128 (1 << 32) | 1 // R_X86_64_64 (sym index 1)
+.sleb128 8 // addend delta
+
+.sleb128 2 // offset delta
+.sleb128 (2 << 32) | 1 // R_X86_64_64 (sym index 2)
+.sleb128 4 // addend delta
+
+.sleb128 2 // Number of relocations in group
+.sleb128 12 // RELOCATION_GROUP_HAS_ADDEND_FLAG | RELOCATION_GROUPED_BY_ADDEND_FLAG
+.sleb128 -2 // addend delta
+
+.sleb128 4 // offset delta
+.sleb128 (1 << 32) | 1 // R_X86_64_64 (sym index 1)
+.sleb128 8 // offset delta
+.sleb128 (2 << 32) | 1 // R_X86_64_64 (sym index 2)
diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/elf-packed-relocs2.s b/llvm/test/tools/llvm-readobj/ELF/Inputs/elf-packed-relocs2.s
new file mode 100644
index 00000000000..73b3733e2dc
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/elf-packed-relocs2.s
@@ -0,0 +1,15 @@
+.ascii "APS2"
+.sleb128 10 // Number of relocations
+.sleb128 4096 // Initial offset
+
+.sleb128 2 // Number of relocations in group
+.sleb128 2 // RELOCATION_GROUPED_BY_OFFSET_DELTA_FLAG
+.sleb128 8 // offset delta
+
+.sleb128 (1 << 8) | 1 // R_386_32 (sym index 1)
+.sleb128 (2 << 8) | 3 // R_386_GOT32 (sym index 2)
+
+.sleb128 8 // Number of relocations in group
+.sleb128 3 // RELOCATION_GROUPED_BY_OFFSET_DELTA_FLAG | RELOCATION_GROUPED_BY_INFO_FLAG
+.sleb128 -4 // offset delta
+.sleb128 8 // R_386_RELATIVE
diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/elf-packed-relocs3.s b/llvm/test/tools/llvm-readobj/ELF/Inputs/elf-packed-relocs3.s
new file mode 100644
index 00000000000..8d4faedd9e9
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/elf-packed-relocs3.s
@@ -0,0 +1,31 @@
+.ascii "APS2"
+.sleb128 6 // Number of relocations
+.sleb128 4096 // Initial offset
+
+.sleb128 2 // Number of relocations in group
+.sleb128 8 // RELOCATION_GROUP_HAS_ADDEND_FLAG
+
+.sleb128 256 // Reloc 1: r_offset delta
+.sleb128 8 // Reloc 1: r_info R_X86_RELATIVE
+.sleb128 0 // Reloc 1: r_addend delta
+.sleb128 128 // Reloc 2: r_offset delta
+.sleb128 8 // Reloc 2: r_info R_X86_RELATIVE
+.sleb128 8 // Reloc 2: r_addend delta
+
+.sleb128 2 // Number of relocations in group
+.sleb128 0 // No RELOCATION_GROUP_HAS_ADDEND_FLAG
+
+.sleb128 128 // reloc 1: r_offset delta
+.sleb128 (1 << 32) | 1 // r_x86_64_64 (sym index 1)
+.sleb128 8 // reloc 2: r_offset delta
+.sleb128 (2 << 32) | 1 // r_x86_64_64 (sym index 2)
+
+.sleb128 2 // Number of relocations in group
+.sleb128 8 // RELOCATION_GROUP_HAS_ADDEND_FLAG
+
+.sleb128 8 // reloc 1: r_offset delta
+.sleb128 (1 << 32) | 1 // r_x86_64_64 (sym index 1)
+.sleb128 0 // reloc 1: r_addend delta
+.sleb128 8 // reloc 2: r_offset delta
+.sleb128 (2 << 32) | 1 // r_x86_64_64 (sym index 2)
+.sleb128 8 // reloc 2: r_addend delta
diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/elf-relr-relocs1.s b/llvm/test/tools/llvm-readobj/ELF/Inputs/elf-relr-relocs1.s
new file mode 100644
index 00000000000..ec4e9caa73f
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/elf-relr-relocs1.s
@@ -0,0 +1,5 @@
+.quad 0x0000000000010d60 // Initial offset
+.quad 0x0000000000000103 // Continuation bitmap
+.quad 0x0000000000020000 // New offset
+.quad 0x00000000000f0501 // Continuation bitmap
+.quad 0x000a700550400009 // Continuation bitmap
diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/elf-relr-relocs2.s b/llvm/test/tools/llvm-readobj/ELF/Inputs/elf-relr-relocs2.s
new file mode 100644
index 00000000000..515d578971c
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/elf-relr-relocs2.s
@@ -0,0 +1,5 @@
+.long 0x00010d60 // Initial offset
+.long 0x00000103 // Continuation bitmap
+.long 0x00020000 // New offset
+.long 0x000f0501 // Continuation bitmap
+.long 0x50400009 // Continuation bitmap
diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/gnuhash.so.elf-i386 b/llvm/test/tools/llvm-readobj/ELF/Inputs/gnuhash.so.elf-i386
new file mode 100644
index 00000000000..c222a899ba7
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/gnuhash.so.elf-i386
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/gnuhash.so.elf-ppc b/llvm/test/tools/llvm-readobj/ELF/Inputs/gnuhash.so.elf-ppc
new file mode 100644
index 00000000000..fd337f343e0
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/gnuhash.so.elf-ppc
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/gnuhash.so.elf-ppc64 b/llvm/test/tools/llvm-readobj/ELF/Inputs/gnuhash.so.elf-ppc64
new file mode 100644
index 00000000000..25ce5c71b38
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/gnuhash.so.elf-ppc64
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/gnuhash.so.elf-x86_64 b/llvm/test/tools/llvm-readobj/ELF/Inputs/gnuhash.so.elf-x86_64
new file mode 100644
index 00000000000..612e7b2112f
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/gnuhash.so.elf-x86_64
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/got-empty.exe.mipsel b/llvm/test/tools/llvm-readobj/ELF/Inputs/got-empty.exe.mipsel
new file mode 100644
index 00000000000..b57874557c8
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/got-empty.exe.mipsel
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/got-over.exe.elf-mips b/llvm/test/tools/llvm-readobj/ELF/Inputs/got-over.exe.elf-mips
new file mode 100644
index 00000000000..27644bff330
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/got-over.exe.elf-mips
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/got-plt.exe.elf-mipsel b/llvm/test/tools/llvm-readobj/ELF/Inputs/got-plt.exe.elf-mipsel
new file mode 100644
index 00000000000..8cdc69ffa56
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/got-plt.exe.elf-mipsel
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/got-static.exe.mips b/llvm/test/tools/llvm-readobj/ELF/Inputs/got-static.exe.mips
new file mode 100644
index 00000000000..a369e32bd88
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/got-static.exe.mips
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/got-tls.so.elf-mips64el b/llvm/test/tools/llvm-readobj/ELF/Inputs/got-tls.so.elf-mips64el
new file mode 100644
index 00000000000..3afc567f85d
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/got-tls.so.elf-mips64el
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/mips-options.elf-mips64el b/llvm/test/tools/llvm-readobj/ELF/Inputs/mips-options.elf-mips64el
new file mode 100644
index 00000000000..4b6525731dd
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/mips-options.elf-mips64el
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/mips-rld-map-rel.elf-mipsel b/llvm/test/tools/llvm-readobj/ELF/Inputs/mips-rld-map-rel.elf-mipsel
new file mode 100644
index 00000000000..a8e396c2ec3
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/mips-rld-map-rel.elf-mipsel
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/options.obj.elf-mipsel b/llvm/test/tools/llvm-readobj/ELF/Inputs/options.obj.elf-mipsel
new file mode 100644
index 00000000000..6309d87c592
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/options.obj.elf-mipsel
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/phdrs-elf.exe-i386 b/llvm/test/tools/llvm-readobj/ELF/Inputs/phdrs-elf.exe-i386
new file mode 100644
index 00000000000..a5a9541aec5
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/phdrs-elf.exe-i386
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/phdrs-elf.exe-x86_64 b/llvm/test/tools/llvm-readobj/ELF/Inputs/phdrs-elf.exe-x86_64
new file mode 100644
index 00000000000..6b6520809d7
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/phdrs-elf.exe-x86_64
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/ppc64.exe b/llvm/test/tools/llvm-readobj/ELF/Inputs/ppc64.exe
new file mode 100644
index 00000000000..0db6147ca70
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/ppc64.exe
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/reginfo.obj.elf-mipsel b/llvm/test/tools/llvm-readobj/ELF/Inputs/reginfo.obj.elf-mipsel
new file mode 100644
index 00000000000..5cd09809f8b
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/reginfo.obj.elf-mipsel
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/relocs.obj.elf-x86_64 b/llvm/test/tools/llvm-readobj/ELF/Inputs/relocs.obj.elf-x86_64
new file mode 100644
index 00000000000..3ca9d8c6939
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/relocs.obj.elf-x86_64
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/rpath.exe.elf-x86_64 b/llvm/test/tools/llvm-readobj/ELF/Inputs/rpath.exe.elf-x86_64
new file mode 100644
index 00000000000..8c01c502cf8
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/rpath.exe.elf-x86_64
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/st-other.obj.elf-mips b/llvm/test/tools/llvm-readobj/ELF/Inputs/st-other.obj.elf-mips
new file mode 100644
index 00000000000..80cefc192d4
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/st-other.obj.elf-mips
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/st-other.obj.elf-mips16 b/llvm/test/tools/llvm-readobj/ELF/Inputs/st-other.obj.elf-mips16
new file mode 100644
index 00000000000..5f0a0e3de8e
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/st-other.obj.elf-mips16
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/symbols-proc-specific.elf-hexagon b/llvm/test/tools/llvm-readobj/ELF/Inputs/symbols-proc-specific.elf-hexagon
new file mode 100644
index 00000000000..f6979086937
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/symbols-proc-specific.elf-hexagon
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/trivial.ll b/llvm/test/tools/llvm-readobj/ELF/Inputs/trivial.ll
new file mode 100644
index 00000000000..c27d0cb038c
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/trivial.ll
@@ -0,0 +1,21 @@
+; Input used for generating checked-in binaries (trivial.obj.*)
+; llc -mtriple=i386-pc-win32 trivial.ll -filetype=obj -o trivial.obj.coff-i386
+; llc -mtriple=x86_64-pc-win32 trivial.ll -filetype=obj -o trivial.obj.coff-x86-64
+; llc -mtriple=i386-linux-gnu trivial.ll -filetype=obj -o trivial.obj.elf-i386 -relocation-model=pic
+; llc -mtriple=x86_64-linux-gnu trivial.ll -filetype=obj -o trivial.obj.elf-x86-64 -relocation-model=pic
+; llc -mtriple=i386-apple-darwin10 trivial.ll -filetype=obj -o trivial.obj.macho-i386 -relocation-model=pic
+; llc -mtriple=x86_64-apple-darwin10 trivial.ll -filetype=obj -o trivial.obj.macho-x86-64 -relocation-model=pic
+; llc -mtriple=wasm32-unknown-unknown trivial.ll -filetype=obj -o trivial.obj.wasm
+
+@.str = private unnamed_addr constant [13 x i8] c"Hello World\0A\00", align 1
+
+define i32 @main() nounwind {
+entry:
+ %call = tail call i32 @puts(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str, i32 0, i32 0)) nounwind
+ tail call void bitcast (void (...)* @SomeOtherFunction to void ()*)() nounwind
+ ret i32 0
+}
+
+declare i32 @puts(i8* nocapture) nounwind
+
+declare void @SomeOtherFunction(...)
diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/trivial.obj.elf-amdhsa-gfx803 b/llvm/test/tools/llvm-readobj/ELF/Inputs/trivial.obj.elf-amdhsa-gfx803
new file mode 100644
index 00000000000..421269cbd8b
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/trivial.obj.elf-amdhsa-gfx803
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/trivial.obj.elf-i386 b/llvm/test/tools/llvm-readobj/ELF/Inputs/trivial.obj.elf-i386
new file mode 100644
index 00000000000..f85e40d6261
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/trivial.obj.elf-i386
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/trivial.obj.elf-mipsel b/llvm/test/tools/llvm-readobj/ELF/Inputs/trivial.obj.elf-mipsel
new file mode 100644
index 00000000000..c523908605c
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/trivial.obj.elf-mipsel
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/trivial.obj.elf-x86-64 b/llvm/test/tools/llvm-readobj/ELF/Inputs/trivial.obj.elf-x86-64
new file mode 100644
index 00000000000..95285c1f230
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/trivial.obj.elf-x86-64
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/ELF/addrsig.test b/llvm/test/tools/llvm-readobj/ELF/addrsig.test
new file mode 100644
index 00000000000..a0c32ab5936
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/addrsig.test
@@ -0,0 +1,84 @@
+## Show that llvm-readobj can dump SHT_LLVM_ADDRSIG sections.
+
+# RUN: yaml2obj --docnum=1 %s -o %t1.o
+# RUN: llvm-readobj --addrsig %t1.o | FileCheck -DFILE=%t1.o %s --check-prefix LLVM
+# RUN: not llvm-readelf --addrsig %t1.o 2>&1 | FileCheck -DFILE=%t1.o %s --check-prefix GNU
+
+# LLVM: Addrsig [
+# LLVM-NEXT: Sym: foo (1)
+# LLVM-NEXT: Sym: bar (2)
+# LLVM-NEXT: ]
+
+# GNU: error: '[[FILE]]': --addrsig: not implemented
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_DYN
+ Machine: EM_X86_64
+Sections:
+ - Name: .llvm_addrsig
+ Type: SHT_LLVM_ADDRSIG
+ Symbols:
+ - Name: foo
+ - Name: bar
+Symbols:
+ - Name: foo
+ - Name: bar
+
+## Check that llvm-readobj dumps any SHT_LLVM_ADDRSIG section when --all
+## is specified for LLVM style, but not for GNU style.
+## TODO: Refine the llvm-readelf check when GNU-style dumping is implemented.
+
+# RUN: llvm-readobj --all %t1.o | FileCheck %s --check-prefix LLVM
+# RUN: llvm-readelf --all %t1.o 2>&1 | FileCheck %s --implicit-check-not=warning --implicit-check-not=error
+
+## Check we report a warning when SHT_LLVM_ADDRSIG is broken (e.g. contains a malformed uleb128).
+
+# RUN: yaml2obj --docnum=2 %s -o %t2.o
+# RUN: llvm-readobj --addrsig %t2.o 2>&1 | FileCheck %s -DFILE=%t2.o --check-prefix=MALFORMED
+
+# MALFORMED: warning: '[[FILE]]': malformed uleb128, extends past end
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_DYN
+ Machine: EM_X86_64
+Sections:
+ - Name: .llvm_addrsig
+ Type: SHT_LLVM_ADDRSIG
+ Content: "FF"
+
+## Check we report a warning when SHT_LLVM_ADDRSIG references a symbol that can't be
+## dumped (e.g. the index value is larger than the number of symbols in .symtab).
+
+# RUN: yaml2obj --docnum=3 %s -o %t3.o
+# RUN: llvm-readobj --addrsig %t3.o 2>&1 | FileCheck %s -DFILE=%t3.o --check-prefix=INVALID-INDEX
+
+# INVALID-INDEX: Addrsig [
+# INVALID-INDEX-NEXT: Sym: foo (1)
+# INVALID-INDEX-EMPTY:
+# INVALID-INDEX-NEXT: warning: '[[FILE]]': unable to get symbol from section [index 2]: invalid symbol index (255)
+# INVALID-INDEX-NEXT: Sym: <?> (255)
+# INVALID-INDEX-NEXT: Sym: bar (2)
+# INVALID-INDEX-NEXT: ]
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_DYN
+ Machine: EM_X86_64
+Sections:
+ - Name: .llvm_addrsig
+ Type: SHT_LLVM_ADDRSIG
+ Symbols:
+ - Index: 1
+ - Index: 255
+ - Index: 2
+Symbols:
+ - Name: foo
+ - Name: bar
diff --git a/llvm/test/tools/llvm-readobj/ELF/all.test b/llvm/test/tools/llvm-readobj/ELF/all.test
new file mode 100644
index 00000000000..1f617034d0e
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/all.test
@@ -0,0 +1,115 @@
+# RUN: yaml2obj %s -o %t.o
+# RUN: llvm-readobj -a %t.o | FileCheck %s --check-prefix LLVM-ALL
+# RUN: llvm-readobj --all %t.o | FileCheck %s --check-prefix LLVM-ALL
+
+# LLVM-ALL: Format: ELF32-i386
+# LLVM-ALL: Arch: i386
+# LLVM-ALL: AddressSize: 32bit
+# LLVM-ALL: LoadName:
+# LLVM-ALL: ElfHeader {
+# LLVM-ALL: Sections [
+# LLVM-ALL: Relocations [
+# LLVM-ALL: Symbols [
+# LLVM-ALL: EHFrameHeader {
+# LLVM-ALL: .eh_frame section at offset 0x1128 address 0x0:
+# LLVM-ALL: ProgramHeaders [
+# LLVM-ALL: VersionSymbols [
+# LLVM-ALL: VersionDefinitions [
+# LLVM-ALL: VersionRequirements [
+# LLVM-ALL: Addrsig [
+# LLVM-ALL: Notes [
+# LLVM-ALL: StackSizes [
+
+# RUN: llvm-readelf -a %t.o | FileCheck %s --check-prefix GNU-ALL
+# RUN: llvm-readelf --all %t.o | FileCheck %s --check-prefix GNU-ALL
+
+# GNU-ALL: ELF Header:
+# GNU-ALL: There are {{.*}} section headers, starting at offset {{.*}}:
+# GNU-ALL: Relocation section '.rela.data' at offset {{.*}} contains {{.*}} entries:
+# GNU-ALL: Symbol table '.symtab' contains {{.*}} entries:
+# GNU-ALL: EHFrameHeader {
+# GNU-ALL: .eh_frame section at offset {{.*}} address 0x0:
+# GNU-ALL: Dynamic section at offset {{.*}} contains {{.*}} entries:
+# GNU-ALL: Program Headers:
+# GNU-ALL: Version symbols section '.gnu.version' contains {{.*}} entries:
+# GNU-ALL: Version definition section '.gnu.version_d' contains {{.*}} entries:
+# GNU-ALL: Version needs section '.gnu.version_r' contains {{.*}} entries:
+# GNU-ALL: There are no section groups in this file.
+# GNU-ALL: Histogram for bucket list length (total of 1 buckets)
+# GNU-ALL: Displaying notes found at file offset {{.*}} with length {{.*}}:
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_386
+Sections:
+ - Name: .data
+ Type: SHT_PROGBITS
+ - Name: .rela.data
+ Type: SHT_REL
+ Relocations:
+ - Name: .gnu.version
+ Type: SHT_GNU_versym
+ Entries: [ 0 ]
+ Link: .dynsym
+ - Name: .gnu.version_d
+ Type: SHT_GNU_verdef
+ Info: 0x0
+ Entries: []
+ - Name: .gnu.version_r
+ Type: SHT_GNU_verneed
+ Info: 0x0
+ Dependencies:
+ - Version: 1
+ File: verneed1.so.0
+ Entries: []
+ - Name: .dynamic
+ Type: SHT_DYNAMIC
+ Address: 0x1000
+ AddressAlign: 0x1000
+ Entries:
+ - Tag: DT_HASH
+ Value: 0x1100
+ - Tag: DT_NULL
+ Value: 0
+ - Name: .hash
+ Type: SHT_HASH
+ Link: 0
+ Bucket: [ 1 ]
+ Chain: [ 0, 0 ]
+ Address: 0x1100
+ AddressAlign: 0x100
+ - Name: .eh_frame_hdr
+ Type: SHT_PROGBITS
+## An arbitrary linker-generated valid content.
+ Content: 011b033b140000000100000000f0ffff30000000
+ - Name: .eh_frame
+ Type: SHT_PROGBITS
+ AddressAlign: 8
+## An arbitrary linker-generated valid content.
+ Content: 1400000000000000017a5200017810011b0c070890010000100000001c000000c8efffff0100000000000000
+ - Name: .note.gnu.build-id
+ Type: SHT_NOTE
+ Flags: [ SHF_ALLOC ]
+ Address: 0x1500
+## An arbitrary linker-generated valid content.
+ Content: 040000001000000003000000474E55004FCB712AA6387724A9F465A32CD8C14B
+ProgramHeaders:
+ - Type: PT_LOAD
+ VAddr: 0x1000
+ Sections:
+ - Section: .dynamic
+ - Section: .hash
+ - Type: PT_DYNAMIC
+ Sections:
+ - Section: .dynamic
+ - Type: PT_GNU_EH_FRAME
+ Sections:
+ - Section: .eh_frame_hdr
+ - Type: PT_NOTE
+ Sections:
+ - Section: .note.gnu.build-id
+Symbols: []
+DynamicSymbols: []
diff --git a/llvm/test/tools/llvm-readobj/ELF/amdgpu-elf-definitions.test b/llvm/test/tools/llvm-readobj/ELF/amdgpu-elf-definitions.test
new file mode 100644
index 00000000000..24dcc7c052b
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/amdgpu-elf-definitions.test
@@ -0,0 +1,11 @@
+RUN: llvm-readobj --file-headers -l -S --symbols %p/Inputs/trivial.obj.elf-amdhsa-gfx803 | FileCheck %s
+
+CHECK: Format: ELF64-amdgpu
+CHECK: Arch: unknown
+CHECK: ElfHeader {
+CHECK: Ident {
+CHECK: OS/ABI: AMDGPU_HSA (0x40)
+CHECK: ABIVersion: 0
+CHECK: }
+CHECK: Machine: EM_AMDGPU (0xE0)
+CHECK: }
diff --git a/llvm/test/tools/llvm-readobj/ELF/broken-dynamic-reloc-name.test b/llvm/test/tools/llvm-readobj/ELF/broken-dynamic-reloc-name.test
new file mode 100644
index 00000000000..25b8db4e14d
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/broken-dynamic-reloc-name.test
@@ -0,0 +1,51 @@
+## Check that llvm-readobj/llvm-readelf reports an error when dumping relocations if a dynamic
+## symbol name offset is broken (goes past the end of the dynamic symbol string table).
+
+# RUN: yaml2obj %s -o %t
+# RUN: llvm-readobj --dyn-relocations %t 2>&1 | FileCheck %s -DFILE=%t --check-prefix=LLVM
+# RUN: llvm-readelf --dyn-relocations %t 2>&1 | FileCheck %s -DFILE=%t --check-prefix=GNU
+
+# LLVM: Dynamic Relocations {
+# LLVM-EMPTY:
+# LLVM-NEXT: warning: '[[FILE]]': unable to get name of the dynamic symbol with index 1: st_name (0x1234) is past the end of the string table of size 0x1
+# LLVM-NEXT: 0x0 R_X86_64_NONE <corrupt> 0x0
+# LLVM-NEXT: }
+
+# GNU: 'RELA' relocation section at offset {{.+}} contains 24 bytes:
+# GNU-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend
+# GNU-EMPTY:
+# GNU-NEXT: warning: '[[FILE]]': unable to get name of the dynamic symbol with index 1: st_name (0x1234) is past the end of the string table of size 0x1
+# GNU-NEXT: 0000000000000000 0000000100000000 R_X86_64_NONE 0000000000000000 <corrupt> + 0
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_DYN
+ Machine: EM_X86_64
+Sections:
+ - Name: .rela.dyn
+ Type: SHT_RELA
+ Link: .dynsym
+ Relocations:
+ - Offset: 0x0
+ Symbol: 1 ## Index of a dynamic symbol with a broken st_name.
+ Type: R_X86_64_NONE
+ - Name: .dynamic
+ Type: SHT_DYNAMIC
+ Entries:
+ - Tag: DT_RELA
+ Value: 0x0000000000000000
+ - Tag: DT_RELASZ
+ Value: 0x0000000000000018
+ - Tag: DT_RELAENT
+ Value: 0x0000000000000018
+ - Tag: DT_NULL
+ Value: 0x0000000000000000
+DynamicSymbols:
+ - NameIndex: 0x1234
+ProgramHeaders:
+ - Type: PT_LOAD
+ Sections:
+ - Section: .rela.dyn
+ - Section: .dynamic
diff --git a/llvm/test/tools/llvm-readobj/ELF/broken-dynsym-link.test b/llvm/test/tools/llvm-readobj/ELF/broken-dynsym-link.test
new file mode 100644
index 00000000000..d64b1dfb11a
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/broken-dynsym-link.test
@@ -0,0 +1,68 @@
+## Test that we are able to dump section headers even if the
+## .dynsym section's sh_link field is broken.
+
+## Case 1: sh_link is set to 0.
+# RUN: yaml2obj --docnum=1 %s -o %t1
+# RUN: llvm-readobj -S %t1 2>&1 | FileCheck %s -DFILE=%t1 --check-prefixes=LLVM,ERR
+# RUN: llvm-readelf -S %t1 2>&1 | FileCheck %s -DFILE=%t1 --check-prefixes=GNU,ERR
+
+# ERR: warning: '[[FILE]]': invalid sh_type for string table section [index 0]: expected SHT_STRTAB, but got SHT_NULL
+
+# LLVM: Name: .dynsym
+# LLVM-NEXT: Type: SHT_DYNSYM
+# LLVM-NEXT: Flags [
+# LLVM-NEXT: SHF_ALLOC
+# LLVM-NEXT: ]
+# LLVM-NEXT: Address: 0x0
+# LLVM-NEXT: Offset: 0x40
+# LLVM-NEXT: Size: 24
+# LLVM-NEXT: Link: 0
+
+# GNU: Section Headers:
+# GNU-NEXT: [Nr] Name Type Address Off Size ES Flg Lk
+# GNU-NEXT: [ 0] NULL 0000000000000000 000000 000000 00 0 0
+# GNU-NEXT: [ 1] .dynsym DYNSYM 0000000000000000 000040 000018 18 A 0
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_DYN
+ Machine: EM_X86_64
+Sections:
+ - Name: .dynsym
+ Type: SHT_DYNSYM
+
+## Case 2: sh_link is set to 255, which is larger than the number of the sections.
+# RUN: yaml2obj --docnum=2 %s -o %t2
+
+# RUN: llvm-readobj -S %t2 2>&1 | FileCheck -DFILE=%t2 %s --check-prefixes=LLVM2,ERR2
+# RUN: llvm-readelf -S %t2 2>&1 | FileCheck -DFILE=%t2 %s --check-prefixes=GNU2,ERR2
+
+# ERR2: warning: '[[FILE]]': invalid section index
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_DYN
+ Machine: EM_X86_64
+Sections:
+ - Name: .dynsym
+ Type: SHT_DYNSYM
+ Link: 255
+
+# LLVM2: Name: .dynsym
+# LLVM2-NEXT: Type: SHT_DYNSYM
+# LLVM2-NEXT: Flags [
+# LLVM2-NEXT: SHF_ALLOC
+# LLVM2-NEXT: ]
+# LLVM2-NEXT: Address: 0x0
+# LLVM2-NEXT: Offset: 0x40
+# LLVM2-NEXT: Size: 24
+# LLVM2-NEXT: Link: 255
+
+# GNU2: Section Headers:
+# GNU2-NEXT: [Nr] Name Type Address Off Size ES Flg Lk
+# GNU2-NEXT: [ 0] NULL 0000000000000000 000000 000000 00 0 0
+# GNU2-NEXT: [ 1] .dynsym DYNSYM 0000000000000000 000040 000018 18 A 255
diff --git a/llvm/test/tools/llvm-readobj/ELF/broken-group.test b/llvm/test/tools/llvm-readobj/ELF/broken-group.test
new file mode 100644
index 00000000000..23bd76a821e
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/broken-group.test
@@ -0,0 +1,80 @@
+# RUN: yaml2obj %s -o %t.o
+
+# RUN: llvm-readelf --elf-section-groups \
+# RUN: %t.o >%tout.log 2>%terr.log
+# RUN: FileCheck %s -check-prefix=GNU-STDERR < %terr.log
+# GNU-STDERR: Error: section [ 3] in group section [ 4] already in group section [ 2]
+# RUN: FileCheck %s -check-prefix=GNU-STDOUT < %tout.log
+# GNU-STDOUT: COMDAT group section [ 2] `.group' [bar] contains 1 sections:
+# GNU-STDOUT-NEXT: [Index] Name
+# GNU-STDOUT-NEXT: [ 3] .foo
+# GNU-STDOUT: COMDAT group section [ 4] `.group1' [zed] contains 1 sections:
+# GNU-STDOUT-NEXT: [Index] Name
+
+# RUN: llvm-readobj --elf-section-groups \
+# RUN: %t.o >%t2out.log 2>%t2err.log %t.o
+# RUN: FileCheck %s -check-prefix=LLVM-STDERR < %t2err.log
+# LLVM-STDERR: Error: .foo (3) in a group .group1 (4) is already in a group .group (2)
+# RUN: FileCheck %s -check-prefix=LLVM-STDOUT < %t2out.log
+# LLVM-STDOUT: Groups {
+# LLVM-STDOUT-NEXT: Group {
+# LLVM-STDOUT-NEXT: Name: .group
+# LLVM-STDOUT-NEXT: Index: 2
+# LLVM-STDOUT-NEXT: Link: 5
+# LLVM-STDOUT-NEXT: Info: 1
+# LLVM-STDOUT-NEXT: Type: COMDAT
+# LLVM-STDOUT-NEXT: Signature: bar
+# LLVM-STDOUT-NEXT: Section(s) in group [
+# LLVM-STDOUT-NEXT: .foo (3)
+# LLVM-STDOUT-NEXT: ]
+# LLVM-STDOUT-NEXT: }
+# LLVM-STDOUT-NEXT: Group {
+# LLVM-STDOUT-NEXT: Name: .group1
+# LLVM-STDOUT-NEXT: Index: 4
+# LLVM-STDOUT-NEXT: Link: 5
+# LLVM-STDOUT-NEXT: Info: 2
+# LLVM-STDOUT-NEXT: Type: COMDAT
+# LLVM-STDOUT-NEXT: Signature: zed
+# LLVM-STDOUT-NEXT: Section(s) in group [
+# LLVM-STDOUT-NEXT: ]
+# LLVM-STDOUT-NEXT: }
+# LLVM-STDOUT-NEXT: }
+
+!ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .group
+ Type: SHT_GROUP
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: bar
+ Members:
+ - SectionOrType: GRP_COMDAT
+ - SectionOrType: .foo
+ - Name: .foo
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR, SHF_GROUP ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .group1
+ Type: SHT_GROUP
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: zed
+ Members:
+ - SectionOrType: GRP_COMDAT
+ - SectionOrType: .foo
+Symbols:
+ - Name: bar
+ Section: .group
+ - Name: zed
+ Section: .group1
diff --git a/llvm/test/tools/llvm-readobj/ELF/check-output-order.test b/llvm/test/tools/llvm-readobj/ELF/check-output-order.test
new file mode 100644
index 00000000000..36fce3ac642
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/check-output-order.test
@@ -0,0 +1,46 @@
+## This test checks that `--all --needed-libs` output is the same as the
+## printing order in code. One common reason the output could become
+## out-of-order is when more than one stream are printing at the same time.
+## https://bugs.llvm.org/show_bug.cgi?id=42140
+
+# RUN: yaml2obj %s -o %t
+# RUN: llvm-readelf --all --needed-libs %t | FileCheck %s
+
+# CHECK: ELF Header
+# CHECK: Section header string table index
+# CHECK: There are 5 section headers, starting at offset
+# CHECK: Section Headers:
+# CHECK: O (extra OS processing required) o (OS specific), p (processor specific)
+# CHECK: There are no relocations in this file.
+# CHECK: Symbol table '.symtab' contains 1 entries
+# CHECK: 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
+# CHECK: Dynamic section at offset
+# CHECK: 0x0000000000000000 (NULL) 0x0
+# CHECK: NeededLibraries [
+# CHECK: ]
+# CHECK: Elf file type is DYN (Shared object file)
+# CHECK: Entry point 0x0
+# CHECK: There are 1 program headers, starting at offset 64
+# CHECK: DYNAMIC
+# CHECK: Section to Segment mapping:
+# CHECK: None .symtab .strtab .shstrtab
+# CHECK: There are no section groups in this file.
+
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_DYN
+ Machine: EM_X86_64
+Sections:
+ - Name: .dynamic
+ Type: SHT_DYNAMIC
+ Entries:
+ - Tag: DT_NULL
+ Value: 0
+Symbols: []
+ProgramHeaders:
+ - Type: PT_DYNAMIC
+ Sections:
+ - Section: .dynamic
diff --git a/llvm/test/tools/llvm-readobj/ELF/demangle.test b/llvm/test/tools/llvm-readobj/ELF/demangle.test
new file mode 100644
index 00000000000..29181cf1b4c
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/demangle.test
@@ -0,0 +1,227 @@
+## Show that llvm-readelf + llvm-readobj demangle symbol names in symbol tables
+## (including dynamic symbols), relocations (including dynamic relocations), and groups.
+
+# RUN: yaml2obj %s > %t.so
+
+## Check LLVM output style.
+# RUN: llvm-readobj --symbols --relocations --dyn-symbols --dyn-relocations \
+# RUN: --elf-section-groups --elf-cg-profile --addrsig \
+# RUN: --demangle %t.so > %t.llvm.long
+# RUN: llvm-readobj --symbols --relocations --dyn-symbols --dyn-relocations \
+# RUN: --elf-section-groups --elf-cg-profile --addrsig \
+# RUN: -C %t.so > %t.llvm.short
+# RUN: FileCheck %s --input-file %t.llvm.long --check-prefixes=LLVM-COMMON,LLVM-DEMANGLE
+# RUN: diff %t.llvm.long %t.llvm.short
+
+## Check that default is no demangling.
+# RUN: llvm-readobj --symbols --relocations --dyn-symbols --dyn-relocations \
+# RUN: --elf-section-groups --elf-cg-profile --addrsig \
+# RUN: %t.so > %t.llvm.default
+# RUN: llvm-readobj --symbols --relocations --dyn-symbols --dyn-relocations \
+# RUN: --elf-section-groups --elf-cg-profile --addrsig \
+# RUN: --demangle=false %t.so > %t.llvm.nodemangle
+# RUN: FileCheck %s --input-file %t.llvm.default --check-prefixes=LLVM-COMMON,LLVM-MANGLED
+# RUN: diff %t.llvm.default %t.llvm.nodemangle
+
+# LLVM-COMMON: Relocations [
+# LLVM-COMMON: Section {{.*}} .rela.text.foo {
+# LLVM-DEMANGLE-NEXT: {{ }}foo(char){{ }}
+# LLVM-MANGLED-NEXT: {{ }}_Z3fooc{{ }}
+# LLVM-COMMON-NEXT: }
+# LLVM-COMMON: ]
+
+# LLVM-COMMON: Dynamic Relocations {
+# LLVM-DEMANGLE-NEXT: {{ }}foo(int){{ }}
+# LLVM-MANGLED-NEXT: {{ }}_Z3fooi{{ }}
+# LLVM-COMMON-NEXT: }
+
+# LLVM-COMMON: Symbols [
+# LLVM-DEMANGLE: Name: foo(char){{ }}
+# LLVM-DEMANGLE: Name: blah(float){{ }}
+# LLVM-MANGLED: Name: _Z3fooc{{ }}
+# LLVM-MANGLED: Name: _Z4blahf{{ }}
+# LLVM-COMMON: ]
+
+# LLVM-COMMON: DynamicSymbols [
+# LLVM-DEMANGLE: Name: foo(int){{ }}
+# LLVM-MANGLED: Name: _Z3fooi{{ }}
+# LLVM-COMMON: ]
+
+# LLVM-COMMON: Groups {
+# LLVM-DEMANGLE: Signature: foo(char){{$}}
+# LLVM-MANGLED: Signature: _Z3fooc{{$}}
+# LLVM-COMMON: }
+
+# LLVM-COMMON: CGProfile [
+# LLVM-DEMANGLE: From: foo(char){{ }}
+# LLVM-DEMANGLE: To: blah(float){{ }}
+# LLVM-MANGLED: From: _Z3fooc{{ }}
+# LLVM-MANGLED: To: _Z4blahf{{ }}
+# LLVM-COMMON: ]
+
+# LLVM-COMMON: Addrsig [
+# LLVM-DEMANGLE-NEXT: Sym: foo(char){{ }}
+# LLVM-DEMANGLE-NEXT: Sym: blah(float){{ }}
+# LLVM-MANGLED-NEXT: Sym: _Z3fooc{{ }}
+# LLVM-MANGLED-NEXT: Sym: _Z4blahf{{ }}
+# LLVM-COMMON-NEXT: ]
+
+## Check GNU output style.
+# RUN: llvm-readelf --symbols --relocations --dyn-symbols --dyn-relocations \
+# RUN: --elf-section-groups --demangle %t.so > %t.gnu.long
+# RUN: llvm-readelf --symbols --relocations --dyn-symbols --dyn-relocations \
+# RUN: --elf-section-groups -C %t.so > %t.gnu.short
+# RUN: FileCheck %s --input-file %t.gnu.long --check-prefixes=GNU-COMMON,GNU-DEMANGLE
+# RUN: diff %t.gnu.long %t.gnu.short
+
+## Check that default is no demangling.
+# RUN: llvm-readelf --symbols --relocations --dyn-symbols --dyn-relocations \
+# RUN: --elf-section-groups %t.so > %t.gnu.default
+# RUN: llvm-readelf --symbols --relocations --dyn-symbols --dyn-relocations \
+# RUN: --elf-section-groups --demangle=false %t.so > %t.gnu.nodemangle
+# RUN: FileCheck %s --input-file %t.gnu.default --check-prefixes=GNU-COMMON,GNU-MANGLED
+# RUN: diff %t.gnu.default %t.gnu.nodemangle
+
+# GNU-COMMON: Relocation section '.rela.text.foo' at offset {{.*}} contains 1 entries:
+# GNU-COMMON-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend
+# GNU-DEMANGLE-NEXT: foo(char){{ }}
+# GNU-MANGLED-NEXT: _Z3fooc{{ }}
+
+# GNU-COMMON: 'RELA' relocation section at offset {{.*}} contains 24 bytes:
+# GNU-COMMON-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend
+# GNU-DEMANGLE-NEXT: foo(int){{ }}
+# GNU-MANGLED-NEXT: _Z3fooi{{ }}
+
+# GNU-COMMON: Symbol table '.dynsym' contains 2 entries:
+# GNU-COMMON-NEXT: Num: Value Size Type Bind Vis Ndx Name
+# GNU-COMMON-NEXT: 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
+# GNU-DEMANGLE-NEXT: foo(int){{$}}
+# GNU-MANGLED-NEXT: _Z3fooi{{$}}
+
+# GNU-COMMON: Symbol table '.symtab' contains 3 entries:
+# GNU-COMMON-NEXT: Num: Value Size Type Bind Vis Ndx Name
+# GNU-COMMON-NEXT: 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
+# GNU-DEMANGLE-NEXT: foo(char){{$}}
+# GNU-DEMANGLE-NEXT: blah(float){{$}}
+# GNU-MANGLED-NEXT: _Z3fooc{{$}}
+# GNU-MANGLED-NEXT: _Z4blahf{{$}}
+
+# GNU-COMMON: COMDAT group section [{{.*}}] `.group'
+# GNU-DEMANGLE-SAME: [foo(char)]
+# GNU-MANGLED-SAME: [_Z3fooc]
+
+!ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_DYN
+ Machine: EM_X86_64
+Sections:
+ - Name: .dynstr
+ Type: SHT_STRTAB
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 0x100
+ EntSize: 0x1
+ - Name: .dynsym
+ Type: SHT_DYNSYM
+ Flags: [ SHF_ALLOC ]
+ Link: .dynstr
+ Address: 0x100
+ AddressAlign: 0x100
+ EntSize: 0x18
+ - Name: .rela.dyn
+ Type: SHT_RELA
+ Flags: [ SHF_ALLOC ]
+ Link: .dynsym
+ Info: .text.foo
+ Address: 0x200
+ AddressAlign: 0x100
+ EntSize: 0x18
+ Relocations:
+ - Offset: 0x10
+ Symbol: _Z3fooi
+ Type: R_X86_64_PC32
+ Addend: 0x4
+ - Name: .dynamic
+ Type: SHT_DYNAMIC
+ Flags: [ SHF_ALLOC ]
+ Address: 0x0000000000001000
+ Link: .dynstr
+ AddressAlign: 0x0000000000001000
+ EntSize: 0x0000000000000010
+ Entries:
+ - Tag: DT_STRTAB
+ Value: 0x0000000000000000
+ - Tag: DT_STRSZ
+ Value: 0x0000000000000009
+ - Tag: DT_SYMTAB
+ Value: 0x0000000000000100
+ - Tag: DT_SYMENT
+ Value: 0x0000000000000018
+ - Tag: DT_RELA
+ Value: 0x0000000000000200
+ - Tag: DT_RELASZ
+ Value: 0x0000000000000018
+ - Tag: DT_RELAENT
+ Value: 0x0000000000000018
+ - Tag: DT_NULL
+ Value: 0x0000000000000000
+ - Name: .text.foo
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR, SHF_GROUP ]
+ Size: 0x40
+ Address: 0x2000
+ AddressAlign: 0x2000
+ - Name: .group
+ Type: SHT_GROUP
+ Link: .symtab
+ Info: _Z3fooc
+ Members:
+ - SectionOrType: GRP_COMDAT
+ - SectionOrType: .text.foo
+ - Name: .rela.text.foo
+ Type: SHT_RELA
+ Link: .symtab
+ Info: .text.foo
+ Relocations:
+ - Offset: 0x10
+ Symbol: _Z3fooc
+ Type: R_X86_64_PC32
+ - Name: .llvm.call-graph-profile
+ Type: SHT_LLVM_CALL_GRAPH_PROFILE
+ Link: .symtab
+ EntSize: 16
+ Content: "01000000020000002000000000000000"
+ - Name: .llvm_addrsig
+ Type: SHT_LLVM_ADDRSIG
+ Link: .symtab
+ Content: "0102"
+Symbols:
+ - Name: _Z3fooc
+ Type: STT_FUNC
+ Section: .text.foo
+ Binding: STB_GLOBAL
+ - Name: _Z4blahf
+ Type: STT_FUNC
+ Section: .text.foo
+ Binding: STB_GLOBAL
+DynamicSymbols:
+ - Name: _Z3fooi
+ Binding: STB_GLOBAL
+ProgramHeaders:
+ - Type: PT_LOAD
+ Flags: [ PF_R, PF_X ]
+ VAddr: 0x0
+ PAddr: 0x0
+ Sections:
+ - Section: .dynsym
+ - Section: .dynstr
+ - Section: .rela.dyn
+ - Section: .dynamic
+ - Section: .text.foo
+ - Type: PT_DYNAMIC
+ Flags: [ PF_R ]
+ VAddr: 0x1000
+ PAddr: 0x1000
+ Sections:
+ - Section: .dynamic
diff --git a/llvm/test/tools/llvm-readobj/ELF/dependent-libraries.test b/llvm/test/tools/llvm-readobj/ELF/dependent-libraries.test
new file mode 100644
index 00000000000..feb56a52dae
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/dependent-libraries.test
@@ -0,0 +1,74 @@
+## Check that we can use the --dependent-libraries option
+## to dump SHT_LLVM_DEPENDENT_LIBRARIES sections.
+
+## Check how we dump a file that has a single valid SHT_LLVM_DEPENDENT_LIBRARIES
+## section with multiple entries.
+
+# RUN: yaml2obj --docnum=1 %s -o %t1
+# RUN: llvm-readobj --dependent-libraries %t1 2>&1 | FileCheck %s -DFILE=%t
+
+# CHECK: DependentLibs [
+# CHECK-NEXT: foo
+# CHECK-NEXT: bar
+# CHECK-NEXT: foo
+# CHECK-NEXT: ]
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .deplibs
+ Type: SHT_LLVM_DEPENDENT_LIBRARIES
+ Libraries: [ foo, bar, foo ]
+
+## Now, check how we dump a mix of valid, empty and invalid SHT_LLVM_DEPENDENT_LIBRARIES sections.
+
+# RUN: yaml2obj --docnum=2 %s -o %t2
+# RUN: llvm-readobj --dependent-libraries %t2 2>&1 | FileCheck %s --check-prefix=MIX -DFILE=%t2
+
+# MIX: DependentLibs [
+# MIX-EMPTY:
+# MIX-NEXT: warning: '[[FILE]]': SHT_LLVM_DEPENDENT_LIBRARIES section at index 1 is broken: the content is not null-terminated
+# MIX-NEXT: abc
+# MIX-EMPTY:
+# MIX-NEXT: warning: '[[FILE]]': SHT_LLVM_DEPENDENT_LIBRARIES section at index 4 is broken: section [index 4] has a sh_offset (0xffff0000) + sh_size (0x4) that is greater than the file size (0x2c0)
+# MIX-NEXT: bar
+# MIX-NEXT: xxx
+# MIX-NEXT: ]
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+## Case 1: test we report a warning for a non-null-terminated section.
+ - Name: .deplibs.nonul
+ Type: SHT_LLVM_DEPENDENT_LIBRARIES
+ Content: "666f6f" ## 'f', 'o', 'o'
+## Case 2: test we can dump an entry from a valid section that has a single entry.
+ - Name: .deplibs.single
+ Type: SHT_LLVM_DEPENDENT_LIBRARIES
+ Libraries: [ abc ]
+## Case 3: test we do not display warnings for an empty section.
+ - Name: .deplibs.empty
+ Type: SHT_LLVM_DEPENDENT_LIBRARIES
+ Content: ""
+## Case 4: test we report a warning when the section offset is invalid.
+ - Name: .deplibs.broken.shoffset
+ Type: SHT_LLVM_DEPENDENT_LIBRARIES
+ Libraries: [ yyy ]
+ ShOffset: 0xffff0000
+## Case 5: test we can dump all entries from a valid section that has more than one entry.
+ - Name: .deplibs.multiple
+ Type: SHT_LLVM_DEPENDENT_LIBRARIES
+ Libraries: [ bar, xxx ]
+
+## llvm-readelf doesn't support --dependent-libraries yet.
+# RUN: llvm-readelf --dependent-libraries %t1 2>&1 | FileCheck %s --check-prefix=READELF
+
+# READELF: printDependentLibs not implemented!
diff --git a/llvm/test/tools/llvm-readobj/ELF/dyn-symbols.test b/llvm/test/tools/llvm-readobj/ELF/dyn-symbols.test
new file mode 100644
index 00000000000..bfcd821e0f9
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/dyn-symbols.test
@@ -0,0 +1,286 @@
+# RUN: llvm-readobj --dyn-symbols %p/Inputs/dynamic-table-so.x86 | FileCheck %s
+
+## Check the two-letter alias --dt is equivalent to the --dyn-symbols full flag
+## name.
+
+# RUN: llvm-readobj --dt %p/Inputs/dynamic-table-so.x86 > %t.readobj-dt-alias
+# RUN: llvm-readobj --dyn-symbols %p/Inputs/dynamic-table-so.x86 > %t.readobj-dt-no-alias
+# RUN: diff %t.readobj-dt-alias %t.readobj-dt-no-alias
+
+# CHECK: DynamicSymbols [
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name:
+# CHECK-NEXT: Value: 0x0
+# CHECK-NEXT: Size: 0
+# CHECK-NEXT: Binding: Local
+# CHECK-NEXT: Type: None
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: Undefined
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name:
+# CHECK-NEXT: Value: 0x618
+# CHECK-NEXT: Size: 0
+# CHECK-NEXT: Binding: Local
+# CHECK-NEXT: Type: Section
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: .init
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name:
+# CHECK-NEXT: Value: 0x200DC0
+# CHECK-NEXT: Size: 0
+# CHECK-NEXT: Binding: Local
+# CHECK-NEXT: Type: Section
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: .tbss
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: _ITM_deregisterTMCloneTable{{ }}
+# CHECK-NEXT: Value: 0x0
+# CHECK-NEXT: Size: 0
+# CHECK-NEXT: Binding: Weak
+# CHECK-NEXT: Type: None
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: Undefined
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: puts@GLIBC_2.2.5{{ }}
+# CHECK-NEXT: Value: 0x0
+# CHECK-NEXT: Size: 0
+# CHECK-NEXT: Binding: Global
+# CHECK-NEXT: Type: Function
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: Undefined
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: __tls_get_addr@GLIBC_2.3{{ }}
+# CHECK-NEXT: Value: 0x0
+# CHECK-NEXT: Size: 0
+# CHECK-NEXT: Binding: Global
+# CHECK-NEXT: Type: Function
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: Undefined
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: __gmon_start__{{ }}
+# CHECK-NEXT: Value: 0x0
+# CHECK-NEXT: Size: 0
+# CHECK-NEXT: Binding: Weak
+# CHECK-NEXT: Type: None
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: Undefined
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: _Jv_RegisterClasses{{ }}
+# CHECK-NEXT: Value: 0x0
+# CHECK-NEXT: Size: 0
+# CHECK-NEXT: Binding: Weak
+# CHECK-NEXT: Type: None
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: Undefined
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: _ITM_registerTMCloneTable{{ }}
+# CHECK-NEXT: Value: 0x0
+# CHECK-NEXT: Size: 0
+# CHECK-NEXT: Binding: Weak
+# CHECK-NEXT: Type: None
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: Undefined
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: __cxa_finalize@GLIBC_2.2.5{{ }}
+# CHECK-NEXT: Value: 0x0
+# CHECK-NEXT: Size: 0
+# CHECK-NEXT: Binding: Weak
+# CHECK-NEXT: Type: Function
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: Undefined
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: _edata{{ }}
+# CHECK-NEXT: Value: 0x201030
+# CHECK-NEXT: Size: 0
+# CHECK-NEXT: Binding: Global
+# CHECK-NEXT: Type: None
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: .data
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: foo{{ }}
+# CHECK-NEXT: Value: 0x0
+# CHECK-NEXT: Size: 4
+# CHECK-NEXT: Binding: Global
+# CHECK-NEXT: Type: TLS
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: .tbss
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: _end{{ }}
+# CHECK-NEXT: Value: 0x201038
+# CHECK-NEXT: Size: 0
+# CHECK-NEXT: Binding: Global
+# CHECK-NEXT: Type: None
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: .bss
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: __bss_start{{ }}
+# CHECK-NEXT: Value: 0x201030
+# CHECK-NEXT: Size: 0
+# CHECK-NEXT: Binding: Global
+# CHECK-NEXT: Type: None
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: .bss
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: main{{ }}
+# CHECK-NEXT: Value: 0x780
+# CHECK-NEXT: Size: 59
+# CHECK-NEXT: Binding: Global
+# CHECK-NEXT: Type: Function
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: .text
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: _init{{ }}
+# CHECK-NEXT: Value: 0x618
+# CHECK-NEXT: Size: 0
+# CHECK-NEXT: Binding: Global
+# CHECK-NEXT: Type: Function
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: .init
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: _fini{{ }}
+# CHECK-NEXT: Value: 0x7BC
+# CHECK-NEXT: Size: 0
+# CHECK-NEXT: Binding: Global
+# CHECK-NEXT: Type: Function
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: .fini
+# CHECK-NEXT: }
+# CHECK-NEXT: ]
+
+## Check that we are able to dump the dynamic symbol table even when we have no program headers.
+## In this case we find the table by it's type (SHT_DYNSYM) and ignore the DT_SYMTAB value.
+
+# RUN: yaml2obj --docnum=1 %s -o %t1.so
+# RUN: llvm-readobj %t1.so --dyn-symbols | FileCheck %s --check-prefix=NOPHDRS
+
+# NOPHDRS: Name: foo
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_DYN
+ Machine: EM_X86_64
+Sections:
+ - Name: .dynamic
+ Type: SHT_DYNAMIC
+ Entries:
+ - Tag: DT_SYMTAB
+ Value: 0xffff1234
+ - Tag: DT_NULL
+ Value: 0
+DynamicSymbols:
+ - Name: foo
+
+## Check we report a warning when there is no SHT_DYNSYM section and we can't map the DT_SYMTAB value
+## to an address because of the absence of a corresponding PT_LOAD program header.
+
+# RUN: yaml2obj --docnum=2 %s -o %t2.so
+# RUN: llvm-readobj %t2.so --dyn-symbols 2>&1 | FileCheck %s -DFILE=%t2.so --check-prefix=NOSHT-DYNSYM
+
+# NOSHT-DYNSYM: warning: '[[FILE]]': Unable to parse DT_SYMTAB: virtual address is not in any segment: 0x0
+# NOSHT-DYNSYM: DynamicSymbols [
+# NOSHT-DYNSYM-NEXT: ]
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_DYN
+ Machine: EM_X86_64
+Sections:
+ - Name: .dynsym
+ Type: SHT_PROGBITS
+ - Name: .dynamic
+ Type: SHT_DYNAMIC
+ Entries:
+ - Tag: DT_SYMTAB
+ Value: 0
+ - Tag: DT_NULL
+ Value: 0
+DynamicSymbols:
+ - Name: foo
+
+## Check that when we can't map the value of the DT_SYMTAB tag to an address, we report a warning and
+## use the information in the section header table to locate the dynamic symbol table.
+
+# RUN: yaml2obj --docnum=3 %s -o %t3.so
+# RUN: llvm-readobj %t3.so --dyn-symbols 2>&1 | FileCheck -DFILE=%t3.so %s --check-prefix=BROKEN-DTSYMTAB
+
+# BROKEN-DTSYMTAB: warning: '[[FILE]]': Unable to parse DT_SYMTAB: virtual address is not in any segment: 0xffff1234
+# BROKEN-DTSYMTAB: Name: foo
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_DYN
+ Machine: EM_X86_64
+Sections:
+ - Name: .dynamic
+ Type: SHT_DYNAMIC
+ Entries:
+ - Tag: DT_SYMTAB
+ Value: 0xffff1234
+ - Tag: DT_NULL
+ Value: 0
+DynamicSymbols:
+ - Name: foo
+ProgramHeaders:
+ - Type: PT_LOAD
+ VAddr: 0x0000
+ Sections:
+ - Section: .dynsym
+
+## Check that if we can get the location of the dynamic symbol table using both the DT_SYMTAB value
+## and the section headers table then we prefer the former and report a warning.
+
+# RUN: yaml2obj --docnum=4 %s -o %t4.so
+# RUN: llvm-readobj %t4.so --dyn-symbols 2>&1 | FileCheck -DFILE=%t4.so %s --check-prefix=PREFER-DTSYMTAB
+
+# PREFER-DTSYMTAB: warning: '[[FILE]]': SHT_DYNSYM section header and DT_SYMTAB disagree about the location of the dynamic symbol table
+# PREFER-DTSYMTAB: Name: o
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_DYN
+ Machine: EM_X86_64
+Sections:
+ - Name: .dynamic
+ Type: SHT_DYNAMIC
+ Entries:
+ - Tag: DT_SYMTAB
+ Value: 0x0
+ - Tag: DT_NULL
+ Value: 0
+ - Name: .dynsym
+ Type: SHT_DYNSYM
+ - Name: .mydynsym
+ Type: SHT_DYNSYM
+## The Content describes 2 symbols: zero symbol and symbol with st_name == 3.
+ Content: "000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000"
+DynamicSymbols:
+ - Name: foo
+ProgramHeaders:
+ - Type: PT_LOAD
+ VAddr: 0x0000
+ Sections:
+ - Section: .mydynsym
diff --git a/llvm/test/tools/llvm-readobj/ELF/dynamic-empty.test b/llvm/test/tools/llvm-readobj/ELF/dynamic-empty.test
new file mode 100644
index 00000000000..8759d3751c3
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/dynamic-empty.test
@@ -0,0 +1,29 @@
+# Show that llvm-readobj can handle an empty .dynamic section.
+
+# RUN: yaml2obj %s -o %t.o
+# RUN: llvm-readobj --dynamic-table %t.o | FileCheck %s --check-prefix LLVM
+# RUN: llvm-readelf --dynamic-table %t.o | FileCheck %s --check-prefix GNU --allow-empty
+
+# LLVM: File: {{.*}}.o
+# LLVM-NOT: DynamicSection
+# GNU-NOT: {{.}}
+
+!ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .dynamic
+ Type: SHT_DYNAMIC
+ Address: 0x1000
+ProgramHeaders:
+ - Type: PT_LOAD
+ VAddr: 0x1000
+ Sections:
+ - Section: .dynamic
+ - Type: PT_DYNAMIC
+ VAddr: 0x1000
+ Sections:
+ - Section: .dynamic
diff --git a/llvm/test/tools/llvm-readobj/ELF/dynamic-malformed.test b/llvm/test/tools/llvm-readobj/ELF/dynamic-malformed.test
new file mode 100644
index 00000000000..1a31fa39e9f
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/dynamic-malformed.test
@@ -0,0 +1,247 @@
+## Test handling of a dynamic section size which is not a multiple of its entry size.
+## Test the full output to demonstrate how we print the warnings.
+
+# RUN: yaml2obj %s --docnum=1 -o %t.bad-size
+# RUN: llvm-readobj --all %t.bad-size 2>&1 \
+# RUN: | FileCheck %s -DFILE=%t.bad-size --implicit-check-not=warning --check-prefix WARN
+# RUN: llvm-readelf --all %t.bad-size 2>&1 \
+# RUN: | FileCheck %s -DFILE=%t.bad-size --implicit-check-not=warning --check-prefix WARN-GNU
+
+# WARN: warning: '[[FILE]]': invalid section size (4) or entity size (16)
+# WARN: warning: '[[FILE]]': invalid section size (4) or entity size (16)
+# WARN: warning: '[[FILE]]': no valid dynamic table was found
+# WARN-EMPTY:
+# WARN: File:
+# WARN: Symbols [
+# WARN: ]
+# WARN: ProgramHeaders [
+
+# WARN-GNU: warning: '[[FILE]]': invalid section size (4) or entity size (16)
+# WARN-GNU: warning: '[[FILE]]': invalid section size (4) or entity size (16)
+# WARN-GNU: warning: '[[FILE]]': no valid dynamic table was found
+# WARN-GNU-NEXT: ELF Header:
+# WARN-GNU: Symbol table '.symtab' contains 1 entries:
+# WARN-GNU: 0:
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .dynamic
+ Type: SHT_DYNAMIC
+ Address: 0x1000
+ Content: "01234567"
+Symbols: []
+ProgramHeaders:
+ - Type: PT_LOAD
+ VAddr: 0x1000
+ Sections:
+ - Section: .dynamic
+ - Type: PT_DYNAMIC
+ VAddr: 0x1000
+ Sections:
+ - Section: .dynamic
+
+## Test handling of a .dynamic section with an invalid entsize (i.e. not 2 * sizeof(Elf_Dyn)).
+# RUN: yaml2obj %s --docnum=2 -o %t.bad-entsize
+# RUN: llvm-readobj --dynamic-table %t.bad-entsize | FileCheck %s --check-prefix BAD-ENTSIZE-LLVM
+# RUN: llvm-readelf --dynamic-table %t.bad-entsize | FileCheck %s --check-prefix BAD-ENTSIZE-GNU
+
+# BAD-ENTSIZE-LLVM: DynamicSection [ (2 entries)
+# BAD-ENTSIZE-LLVM-NEXT: Tag Type Name/Value
+# BAD-ENTSIZE-LLVM-NEXT: 0x0000000000000015 DEBUG 0x0
+# BAD-ENTSIZE-LLVM-NEXT: 0x0000000000000000 NULL 0x0
+# BAD-ENTSIZE-LLVM-NEXT: ]
+
+# BAD-ENTSIZE-GNU: Dynamic section at offset 0x{{.*}} contains 2 entries:
+# BAD-ENTSIZE-GNU-NEXT: Tag Type Name/Value
+# BAD-ENTSIZE-GNU-NEXT: 0x0000000000000015 (DEBUG) 0x0
+# BAD-ENTSIZE-GNU-NEXT: 0x0000000000000000 (NULL) 0x0
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .dynamic
+ Type: SHT_DYNAMIC
+ Address: 0x1000
+ EntSize: 0x2
+ Entries:
+ - Tag: DT_DEBUG
+ Value: 0
+ - Tag: DT_NULL
+ Value: 0
+Symbols: []
+ProgramHeaders:
+ - Type: PT_LOAD
+ VAddr: 0x1000
+ Sections:
+ - Section: .dynamic
+ - Type: PT_DYNAMIC
+ VAddr: 0x1000
+ Sections:
+ - Section: .dynamic
+
+## Test handling of string references pointing past the end of the dynamic string table.
+# RUN: yaml2obj %s --docnum=3 -o %t.bad-string
+# RUN: llvm-readobj --dynamic-table %t.bad-string | FileCheck %s --check-prefix BAD-STRING-LLVM
+# RUN: llvm-readelf --dynamic-table %t.bad-string | FileCheck %s --check-prefix BAD-STRING-GNU
+
+# BAD-STRING-LLVM: 0x000000000000000A STRSZ 1 (bytes)
+# BAD-STRING-LLVM: 0x0000000000000001 NEEDED Shared library: [<Invalid offset 0x1>]
+# BAD-STRING-LLVM: 0x000000007FFFFFFF FILTER Filter library: [<Invalid offset 0x1>]
+# BAD-STRING-LLVM: 0x000000007FFFFFFD AUXILIARY Auxiliary library: [<Invalid offset 0x1>]
+# BAD-STRING-LLVM: 0x000000007FFFFFFE USED Not needed object: [<Invalid offset 0x1>]
+# BAD-STRING-LLVM: 0x000000000000000E SONAME Library soname: [<Invalid offset 0x1>]
+# BAD-STRING-LLVM: 0x000000000000000F RPATH Library rpath: [<Invalid offset 0x1>]
+# BAD-STRING-LLVM: 0x000000000000001D RUNPATH Library runpath: [<Invalid offset 0x1>]
+
+# BAD-STRING-GNU: 0x000000000000000a (STRSZ) 1 (bytes)
+# BAD-STRING-GNU: 0x0000000000000001 (NEEDED) Shared library: [<Invalid offset 0x1>]
+# BAD-STRING-GNU: 0x000000007fffffff (FILTER) Filter library: [<Invalid offset 0x1>]
+# BAD-STRING-GNU: 0x000000007ffffffd (AUXILIARY) Auxiliary library: [<Invalid offset 0x1>]
+# BAD-STRING-GNU: 0x000000007ffffffe (USED) Not needed object: [<Invalid offset 0x1>]
+# BAD-STRING-GNU: 0x000000000000000e (SONAME) Library soname: [<Invalid offset 0x1>]
+# BAD-STRING-GNU: 0x000000000000000f (RPATH) Library rpath: [<Invalid offset 0x1>]
+# BAD-STRING-GNU: 0x000000000000001d (RUNPATH) Library runpath: [<Invalid offset 0x1>]
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .dynstr
+ Type: SHT_STRTAB
+ Address: 0x1000
+ - Name: .dynamic
+ Type: SHT_DYNAMIC
+ Address: 0x1010
+ Entries:
+ - Tag: DT_STRTAB
+ Value: 0x1000
+ - Tag: DT_STRSZ
+ Value: 1
+ - Tag: DT_NEEDED
+ Value: 1
+ - Tag: DT_FILTER
+ Value: 1
+ - Tag: DT_AUXILIARY
+ Value: 1
+ - Tag: DT_USED
+ Value: 1
+ - Tag: DT_SONAME
+ Value: 1
+ - Tag: DT_RPATH
+ Value: 1
+ - Tag: DT_RUNPATH
+ Value: 1
+ - Tag: DT_NULL
+ Value: 0
+Symbols: []
+ProgramHeaders:
+ - Type: PT_LOAD
+ VAddr: 0x1000
+ Sections:
+ - Section: .dynstr
+ - Section: .dynamic
+ - Type: PT_DYNAMIC
+ VAddr: 0x1010
+ Sections:
+ - Section: .dynamic
+
+## Test handling of DT_STRTAB pointing outside the file's address space.
+# RUN: yaml2obj %s --docnum=4 -o %t.bad-strtab
+
+# RUN: llvm-readobj --dynamic-table %t.bad-strtab 2>&1 >/dev/null | FileCheck -DFILE=%t.bad-strtab %s --check-prefix BAD-STRTAB-ERR
+# RUN: llvm-readelf --dynamic-table %t.bad-strtab 2>&1 >/dev/null | FileCheck -DFILE=%t.bad-strtab %s --check-prefix BAD-STRTAB-ERR
+# BAD-STRTAB-ERR: warning: '[[FILE]]': Unable to parse DT_STRTAB: virtual address is not in any segment: 0x2000000
+
+# RUN: llvm-readobj --dynamic-table --needed-libs %t.bad-strtab | FileCheck %s --check-prefixes=BAD-STRTAB,BAD-STRTAB-LLVM
+# RUN: llvm-readelf --dynamic-table --needed-libs %t.bad-strtab | FileCheck %s --check-prefixes=BAD-STRTAB,BAD-STRTAB-GNU
+# BAD-STRTAB-LLVM: LoadName: <String table is empty or was not found>
+# BAD-STRTAB-LLVM: 0x0000000000000001 NEEDED Shared library: [<String table is empty or was not found>]
+# BAD-STRTAB-GNU: 0x0000000000000001 (NEEDED) Shared library: [<String table is empty or was not found>]
+# BAD-STRTAB: NeededLibraries [
+# BAD-STRTAB: <String table is empty or was not found>
+# BAD-STRTAB: ]
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .dynamic
+ Type: SHT_DYNAMIC
+ Address: 0x1000
+ Entries:
+ - Tag: DT_STRTAB
+ Value: 0x2000000
+ - Tag: DT_STRSZ
+ Value: 10
+ - Tag: DT_NEEDED
+ Value: 1
+ - Tag: DT_NULL
+ Value: 0x0
+Symbols: []
+ProgramHeaders:
+ - Type: PT_LOAD
+ VAddr: 0x1000
+ Sections:
+ - Section: .dynamic
+ - Type: PT_DYNAMIC
+ VAddr: 0x1000
+ Sections:
+ - Section: .dynamic
+
+## Test handling of other d_ptr tags pointing outside the file's address space.
+# RUN: yaml2obj %s --docnum=5 -o %t.bad-rela
+# RUN: llvm-readobj --dynamic-table %t.bad-rela 2>&1 | FileCheck -DFILE=%t.bad-rela %s --check-prefixes=CHECK,BAD-RELA
+# RUN: llvm-readelf --dynamic-table %t.bad-rela 2>&1 | FileCheck -DFILE=%t.bad-rela %s --check-prefixes=CHECK,BAD-RELA-GNU
+
+# CHECK: warning: '[[FILE]]': Unable to parse DT_RELA: virtual address is not in any segment: 0x1000000
+
+# BAD-RELA: DynamicSection [ (2 entries)
+# BAD-RELA-NEXT: Tag Type Name/Value
+# BAD-RELA-NEXT: 0x0000000000000007 RELA 0x1000000
+# BAD-RELA-NEXT: 0x0000000000000000 NULL 0x0
+# BAD-RELA-NEXT: ]
+# BAD-RELA-GNU: Dynamic section at offset 0xb0 contains 2 entries:
+# BAD-RELA-GNU-NEXT: Tag Type Name/Value
+# BAD-RELA-GNU-NEXT: 0x0000000000000007 (RELA) 0x1000000
+# BAD-RELA-GNU-NEXT: 0x0000000000000000 (NULL) 0x0
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .dynamic
+ Type: SHT_DYNAMIC
+ Address: 0x1000
+ Entries:
+ - Tag: DT_RELA
+ Value: 0x1000000
+ - Tag: DT_NULL
+ Value: 0x0
+Symbols: []
+ProgramHeaders:
+ - Type: PT_LOAD
+ VAddr: 0x1000
+ Sections:
+ - Section: .dynamic
+ - Type: PT_DYNAMIC
+ VAddr: 0x1000
+ Sections:
+ - Section: .dynamic
diff --git a/llvm/test/tools/llvm-readobj/ELF/dynamic-no-pt-dynamic.test b/llvm/test/tools/llvm-readobj/ELF/dynamic-no-pt-dynamic.test
new file mode 100644
index 00000000000..8fa7f655249
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/dynamic-no-pt-dynamic.test
@@ -0,0 +1,38 @@
+## Show that dumping occurs even if there is no PT_DYNAMIC header.
+## This is inconsistent with the GNU behavior, but seems to be more reasonable.
+# RUN: yaml2obj %s -o %t.no-phdr
+# RUN: llvm-readobj --dynamic-table %t.no-phdr | FileCheck %s --check-prefix=LLVM
+# RUN: llvm-readelf --dynamic-table %t.no-phdr | FileCheck %s --check-prefix=GNU
+
+# LLVM: File: {{.*}}.no-phdr
+# LLVM-NEXT: Format: ELF64-x86-64
+# LLVM-NEXT: Arch: x86_64
+# LLVM-NEXT: AddressSize: 64bit
+# LLVM-NEXT: LoadName:{{ *}}
+# LLVM-NEXT: DynamicSection [ (1 entries)
+# LLVM-NEXT: Tag Type Name/Value
+# LLVM-NEXT: 0x0000000000000000 NULL 0x0
+# LLVM-NEXT: ]
+
+# GNU: Dynamic section at offset 0x78 contains 1 entries:
+# GNU-NEXT: Tag Type Name/Value
+# GNU-NEXT: 0x0000000000000000 (NULL) 0x0
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .dynamic
+ Type: SHT_DYNAMIC
+ Address: 0x1000
+ Entries:
+ - Tag: DT_NULL
+ Value: 0
+ProgramHeaders:
+ - Type: PT_LOAD
+ VAddr: 0x1000
+ Sections:
+ - Section: .dynamic
diff --git a/llvm/test/tools/llvm-readobj/ELF/dynamic-not-in-pt-dynamic.test b/llvm/test/tools/llvm-readobj/ELF/dynamic-not-in-pt-dynamic.test
new file mode 100644
index 00000000000..cb8da637e00
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/dynamic-not-in-pt-dynamic.test
@@ -0,0 +1,159 @@
+## Show that llvm-readobj/llvm-readelf tools sometimes can dump the
+## dynamic table when it is not in a PT_DYNAMIC segment.
+
+## Case 1: The dynamic table found using the dynamic program header is corrupted
+## (<size of data> % <size of dynamic entry> != 0). So the table is taken
+## from the section header.
+
+# RUN: yaml2obj --docnum=1 %s -o %t1.o
+# RUN: llvm-readobj --dynamic-table %t1.o 2>&1 \
+# RUN: | FileCheck -DFILE=%t1.o --check-prefixes=WARNING1,LLVM1 %s
+# RUN: llvm-readelf --dynamic-table %t1.o 2>&1 \
+# RUN: | FileCheck -DFILE=%t1.o --check-prefixes=WARNING1,GNU1 %s
+
+# WARNING1: warning: '[[FILE]]': The SHT_DYNAMIC section '.dynamic' is not contained within the PT_DYNAMIC segment
+# WARNING1: warning: '[[FILE]]': invalid section size (1) or entity size (16)
+# WARNING1: warning: '[[FILE]]': SHT_DYNAMIC section header and PT_DYNAMIC program header disagree about the location of the dynamic table
+# WARNING1: warning: '[[FILE]]': PT_DYNAMIC dynamic table is invalid: SHT_DYNAMIC will be used
+
+# LLVM1: DynamicSection [ (2 entries)
+# LLVM1-NEXT: Tag Type Name/Value
+# LLVM1-NEXT: 0x0000000000000018 BIND_NOW 0x1
+# LLVM1-NEXT: 0x0000000000000000 NULL 0x0
+# LLVM1-NEXT: ]
+
+# GNU1: Dynamic section at offset 0x{{.*}} contains 2 entries:
+# GNU1-NEXT: Tag Type Name/Value
+# GNU1-NEXT: 0x0000000000000018 (BIND_NOW) 0x1
+# GNU1-NEXT: 0x0000000000000000 (NULL) 0x0
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .dynamic
+ Type: SHT_DYNAMIC
+ Flags: [SHF_ALLOC]
+ Address: 0x1000
+ AddressAlign: 0x1000
+ Entries:
+ - Tag: DT_BIND_NOW
+ Value: 0x1
+ - Tag: DT_NULL
+ Value: 0x0
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [SHF_ALLOC]
+ Address: 0x1100
+ AddressAlign: 0x100
+ Content: "00"
+ProgramHeaders:
+ - Type: PT_LOAD
+ VAddr: 0x1000
+ Sections:
+ - Section: .dynamic
+ - Section: .text
+ - Type: PT_DYNAMIC
+ VAddr: 0x1000
+ Sections:
+ - Section: .text
+
+## Case 2: The dynamic table found using the dynamic program header is different from the
+## table found using the section header table.
+
+# RUN: yaml2obj --docnum=2 %s -o %t2.o
+# RUN: llvm-readobj --dynamic-table %t2.o 2>&1 \
+# RUN: | FileCheck -DFILE=%t2.o --check-prefixes=WARNING2,LLVM2 %s
+# RUN: llvm-readelf --dynamic-table %t2.o 2>&1 \
+# RUN: | FileCheck -DFILE=%t2.o --check-prefixes=WARNING2,GNU2 %s
+
+# WARNING2: warning: '[[FILE]]': The SHT_DYNAMIC section '.dynamic' is not contained within the PT_DYNAMIC segment
+# WARNING2: warning: '[[FILE]]': SHT_DYNAMIC section header and PT_DYNAMIC program header disagree about the location of the dynamic table
+
+# LLVM2: DynamicSection [ (1 entries)
+# LLVM2-NEXT: Tag Type Name/Value
+# LLVM2-NEXT: 0x0000000000000000 NULL 0x0
+# LLVM2-NEXT: ]
+
+# GNU2: Dynamic section at offset 0x{{.*}} contains 1 entries:
+# GNU2-NEXT: Tag Type Name/Value
+# GNU2-NEXT: 0x0000000000000000 (NULL) 0x0
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .dynamic
+ Type: SHT_DYNAMIC
+ Flags: [SHF_ALLOC]
+ Address: 0x1000
+ AddressAlign: 0x1000
+ Entries:
+ - Tag: DT_BIND_NOW
+ Value: 0x1
+ - Tag: DT_NULL
+ Value: 0x0
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [SHF_ALLOC]
+ Address: 0x1100
+ AddressAlign: 0x100
+ Content: "00000000000000000000000000000000"
+ProgramHeaders:
+ - Type: PT_LOAD
+ VAddr: 0x1000
+ Sections:
+ - Section: .dynamic
+ - Section: .text
+ - Type: PT_DYNAMIC
+ VAddr: 0x1000
+ Sections:
+ - Section: .text
+
+## Case 3: Both dynamic tables found using SHT_DYNAMIC/PT_DYNAMIC are corrupted.
+
+# RUN: yaml2obj --docnum=3 %s -o %t3.o
+# RUN: llvm-readobj --dynamic-table %t3.o 2>&1 \
+# RUN: | FileCheck -DFILE=%t3.o --check-prefix=WARNING3 --implicit-check-not="Dynamic" %s
+# RUN: llvm-readelf --dynamic-table %t3.o 2>&1 \
+# RUN: | FileCheck -DFILE=%t3.o --check-prefix=WARNING3 --implicit-check-not="Dynamic" %s
+
+# WARNING3: warning: '[[FILE]]': invalid section size (1) or entity size (16)
+# WARNING3: warning: '[[FILE]]': SHT_DYNAMIC section header and PT_DYNAMIC program header disagree about the location of the dynamic table
+# WARNING3: warning: '[[FILE]]': no valid dynamic table was found
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .dynamic
+ Type: SHT_DYNAMIC
+ Flags: [SHF_ALLOC]
+ Address: 0x1000
+ AddressAlign: 0x1000
+ Content: "00"
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [SHF_ALLOC]
+ Address: 0x1100
+ AddressAlign: 0x100
+ Content: "00"
+ProgramHeaders:
+ - Type: PT_LOAD
+ VAddr: 0x1000
+ Sections:
+ - Section: .dynamic
+ - Section: .text
+ - Type: PT_DYNAMIC
+ VAddr: 0x1000
+ Sections:
+ - Section: .text
diff --git a/llvm/test/tools/llvm-readobj/ELF/dynamic-table-dtnull.s b/llvm/test/tools/llvm-readobj/ELF/dynamic-table-dtnull.s
new file mode 100644
index 00000000000..b613e4137d1
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/dynamic-table-dtnull.s
@@ -0,0 +1,87 @@
+# Check we are able to dump the dynamic section without a DT_NULL entry correctly.
+
+# RUN: yaml2obj -docnum=1 %s -o %t.o
+# RUN: llvm-readobj --dynamic-table %t.o | FileCheck %s --check-prefix=NONULL-LLVM
+# RUN: llvm-readelf --dynamic-table %t.o | FileCheck %s --check-prefix=NONULL-GNU
+
+# NONULL-LLVM: DynamicSection [ (1 entries)
+# NONULL-LLVM-NEXT: Tag Type Name/Value
+# NONULL-LLVM-NEXT: 0x0000000000000015 DEBUG 0x0
+# NONULL-LLVM-NEXT: ]
+
+# NONULL-GNU: Dynamic section at offset {{.*}} contains 1 entries:
+# NONULL-GNU-NEXT: Tag Type Name/Value
+# NONULL-GNU-NEXT: 0x0000000000000015 (DEBUG) 0x0
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .dynamic
+ Type: SHT_DYNAMIC
+ Address: 0x0000000000001010
+ AddressAlign: 0x0000000000000010
+ EntSize: 0x0000000000000010
+ Entries:
+ - Tag: DT_DEBUG
+ Value: 0x0000000000000000
+ProgramHeaders:
+ - Type: PT_LOAD
+ VAddr: 0x1000
+ Sections:
+ - Section: .dynamic
+ - Type: PT_DYNAMIC
+ VAddr: 0x1010
+ Sections:
+ - Section: .dynamic
+
+# Sometimes .dynamic section content length can be greater than the
+# length of its entries. In this case, we should not try to dump anything
+# past the DT_NULL entry, which works as a terminator.
+
+# RUN: yaml2obj -docnum=2 %s -o %t.o
+# RUN: llvm-readobj --dynamic-table %t.o | FileCheck %s --check-prefix=LONG-LLVM
+# RUN: llvm-readelf --dynamic-table %t.o | FileCheck %s --check-prefix=LONG-GNU
+
+# LONG-LLVM: DynamicSection [ (2 entries)
+# LONG-LLVM-NEXT: Tag Type Name/Value
+# LONG-LLVM-NEXT: 0x0000000000000015 DEBUG 0x0
+# LONG-LLVM-NEXT: 0x0000000000000000 NULL 0x0
+# LONG-LLVM-NEXT: ]
+
+# LONG-GNU: Dynamic section at offset {{.*}} contains 2 entries:
+# LONG-GNU-NEXT: Tag Type Name/Value
+# LONG-GNU-NEXT: 0x0000000000000015 (DEBUG) 0x0
+# LONG-GNU-NEXT: 0x0000000000000000 (NULL) 0x0
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .dynamic
+ Type: SHT_DYNAMIC
+ Address: 0x0000000000001010
+ AddressAlign: 0x0000000000000010
+ EntSize: 0x0000000000000010
+ Entries:
+ - Tag: DT_DEBUG
+ Value: 0x0000000000000000
+ - Tag: DT_NULL
+ Value: 0x0000000000000000
+ - Tag: DT_NULL
+ Value: 0x0000000000000000
+ProgramHeaders:
+ - Type: PT_LOAD
+ VAddr: 0x1000
+ Sections:
+ - Section: .dynamic
+ - Type: PT_DYNAMIC
+ VAddr: 0x1010
+ Sections:
+ - Section: .dynamic
diff --git a/llvm/test/tools/llvm-readobj/ELF/dynamic-tags-machine-specific.test b/llvm/test/tools/llvm-readobj/ELF/dynamic-tags-machine-specific.test
new file mode 100644
index 00000000000..cebb1cbac72
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/dynamic-tags-machine-specific.test
@@ -0,0 +1,196 @@
+# Test that hexagon machine-specific tags can be dumped.
+# RUN: yaml2obj --docnum=1 %S/Inputs/elf-dynamic-tags-machine-specific.yaml -o %t.hex
+# RUN: llvm-readobj --dynamic-table %t.hex | FileCheck %s --check-prefix=LLVM-HEXAGON
+# RUN: llvm-readelf --dynamic-table %t.hex | FileCheck %s --check-prefix=GNU-HEXAGON
+
+# LLVM-HEXAGON: DynamicSection [ (6 entries)
+# LLVM-HEXAGON-NEXT: Tag Type Name/Value
+# LLVM-HEXAGON-NEXT: 0x0000000000000004 HASH 0x1000
+# LLVM-HEXAGON-NEXT: 0x0000000070000000 HEXAGON_SYMSZ 0x10
+# LLVM-HEXAGON-NEXT: 0x0000000070000001 HEXAGON_VER 4096
+# LLVM-HEXAGON-NEXT: 0x0000000070000002 HEXAGON_PLT 0x1000
+# LLVM-HEXAGON-NEXT: 0x000000001234ABCD unknown 0x1
+# LLVM-HEXAGON-NEXT: 0x0000000000000000 NULL 0x0
+# LLVM-HEXAGON-NEXT: ]
+
+# GNU-HEXAGON: Dynamic section at offset {{.*}} contains 6 entries:
+# GNU-HEXAGON-NEXT: Tag Type Name/Value
+# GNU-HEXAGON-NEXT: 0x0000000000000004 (HASH) 0x1000
+# GNU-HEXAGON-NEXT: 0x0000000070000000 (HEXAGON_SYMSZ) 0x10
+# GNU-HEXAGON-NEXT: 0x0000000070000001 (HEXAGON_VER) 4096
+# GNU-HEXAGON-NEXT: 0x0000000070000002 (HEXAGON_PLT) 0x1000
+# GNU-HEXAGON-NEXT: 0x000000001234abcd (unknown) 0x1
+# GNU-HEXAGON-NEXT: 0x0000000000000000 (NULL) 0x0
+
+
+# Test that MIPS machine-specific tags can be dumped.
+# RUN: yaml2obj --docnum=2 %S/Inputs/elf-dynamic-tags-machine-specific.yaml -o %t.mips
+# RUN: llvm-readobj --dynamic-table %t.mips | FileCheck %s --check-prefix=LLVM-MIPS
+# RUN: llvm-readelf --dynamic-table %t.mips | FileCheck %s --check-prefix=GNU-MIPS
+
+# LLVM-MIPS: DynamicSection [ (48 entries)
+# LLVM-MIPS-NEXT: Tag Type Name/Value
+# LLVM-MIPS-NEXT: 0x0000000000000004 HASH 0x1000
+# LLVM-MIPS-NEXT: 0x0000000070000001 MIPS_RLD_VERSION 305419896
+# LLVM-MIPS-NEXT: 0x0000000070000002 MIPS_TIME_STAMP 0x11223344
+# LLVM-MIPS-NEXT: 0x0000000070000003 MIPS_ICHECKSUM 0x11112222
+# LLVM-MIPS-NEXT: 0x0000000070000004 MIPS_IVERSION 0x1
+# LLVM-MIPS-NEXT: 0x0000000070000005 MIPS_FLAGS QUICKSTART SGI_ONLY PIXIE CORD
+# LLVM-MIPS-NEXT: 0x0000000070000006 MIPS_BASE_ADDRESS 0x87654321
+# LLVM-MIPS-NEXT: 0x0000000070000007 MIPS_MSYM 0x1000
+# LLVM-MIPS-NEXT: 0x0000000070000008 MIPS_CONFLICT 0x1000
+# LLVM-MIPS-NEXT: 0x0000000070000009 MIPS_LIBLIST 0x1000
+# LLVM-MIPS-NEXT: 0x000000007000000A MIPS_LOCAL_GOTNO 1
+# LLVM-MIPS-NEXT: 0x000000007000000B MIPS_CONFLICTNO 0x1
+# LLVM-MIPS-NEXT: 0x0000000070000010 MIPS_LIBLISTNO 0x1
+# LLVM-MIPS-NEXT: 0x0000000070000011 MIPS_SYMTABNO 1
+# LLVM-MIPS-NEXT: 0x0000000070000012 MIPS_UNREFEXTNO 0
+# LLVM-MIPS-NEXT: 0x0000000070000013 MIPS_GOTSYM 0x0
+# LLVM-MIPS-NEXT: 0x0000000070000014 MIPS_HIPAGENO 0x88776655
+# LLVM-MIPS-NEXT: 0x0000000070000016 MIPS_RLD_MAP 0x1000
+# LLVM-MIPS-NEXT: 0x0000000070000017 MIPS_DELTA_CLASS 0x1000
+# LLVM-MIPS-NEXT: 0x0000000070000018 MIPS_DELTA_CLASS_NO 0x1
+# LLVM-MIPS-NEXT: 0x0000000070000019 MIPS_DELTA_INSTANCE 0x1000
+# LLVM-MIPS-NEXT: 0x000000007000001A MIPS_DELTA_INSTANCE_NO0x1
+# LLVM-MIPS-NEXT: 0x000000007000001B MIPS_DELTA_RELOC 0x1000
+# LLVM-MIPS-NEXT: 0x000000007000001C MIPS_DELTA_RELOC_NO 0x1
+# LLVM-MIPS-NEXT: 0x000000007000001D MIPS_DELTA_SYM 0x1000
+# LLVM-MIPS-NEXT: 0x000000007000001E MIPS_DELTA_SYM_NO 0x1
+# LLVM-MIPS-NEXT: 0x0000000070000020 MIPS_DELTA_CLASSSYM 0x1000
+# LLVM-MIPS-NEXT: 0x0000000070000021 MIPS_DELTA_CLASSSYM_NO0x1
+# LLVM-MIPS-NEXT: 0x0000000070000022 MIPS_CXX_FLAGS 0x88887777
+# LLVM-MIPS-NEXT: 0x0000000070000023 MIPS_PIXIE_INIT 0x1000
+# LLVM-MIPS-NEXT: 0x0000000070000025 MIPS_LOCALPAGE_GOTIDX0x1
+# LLVM-MIPS-NEXT: 0x0000000070000026 MIPS_LOCAL_GOTIDX 0x1
+# LLVM-MIPS-NEXT: 0x0000000070000027 MIPS_HIDDEN_GOTIDX 0x1
+# LLVM-MIPS-NEXT: 0x0000000070000028 MIPS_PROTECTED_GOTIDX0x1
+# LLVM-MIPS-NEXT: 0x0000000070000029 MIPS_OPTIONS 0x1000
+# LLVM-MIPS-NEXT: 0x000000007000002A MIPS_INTERFACE 0x1000
+# LLVM-MIPS-NEXT: 0x000000007000002B MIPS_DYNSTR_ALIGN 0x88888888
+# LLVM-MIPS-NEXT: 0x000000007000002C MIPS_INTERFACE_SIZE 0x10
+# LLVM-MIPS-NEXT: 0x000000007000002D MIPS_RLD_TEXT_RESOLVE_ADDR0x8
+# LLVM-MIPS-NEXT: 0x000000007000002E MIPS_PERF_SUFFIX 0x0
+# LLVM-MIPS-NEXT: 0x000000007000002F MIPS_COMPACT_SIZE 0x10
+# LLVM-MIPS-NEXT: 0x0000000070000030 MIPS_GP_VALUE 0x1
+# LLVM-MIPS-NEXT: 0x0000000070000031 MIPS_AUX_DYNAMIC 0x1000
+# LLVM-MIPS-NEXT: 0x0000000070000032 MIPS_PLTGOT 0x1000
+# LLVM-MIPS-NEXT: 0x0000000070000034 MIPS_RWPLT 0x1000
+# LLVM-MIPS-NEXT: 0x0000000070000035 MIPS_RLD_MAP_REL 0x1000
+# LLVM-MIPS-NEXT: 0x000000001234ABCD unknown 0x1
+# LLVM-MIPS-NEXT: 0x0000000000000000 NULL 0x0
+# LLVM-MIPS-NEXT: ]
+
+# GNU-MIPS: Dynamic section at offset {{.*}} contains 48 entries:
+# GNU-MIPS-NEXT: Tag Type Name/Value
+# GNU-MIPS-NEXT: 0x0000000000000004 (HASH) 0x1000
+# GNU-MIPS-NEXT: 0x0000000070000001 (MIPS_RLD_VERSION) 305419896
+# GNU-MIPS-NEXT: 0x0000000070000002 (MIPS_TIME_STAMP) 0x11223344
+# GNU-MIPS-NEXT: 0x0000000070000003 (MIPS_ICHECKSUM) 0x11112222
+# GNU-MIPS-NEXT: 0x0000000070000004 (MIPS_IVERSION) 0x1
+# GNU-MIPS-NEXT: 0x0000000070000005 (MIPS_FLAGS) QUICKSTART SGI_ONLY PIXIE CORD
+# GNU-MIPS-NEXT: 0x0000000070000006 (MIPS_BASE_ADDRESS) 0x87654321
+# GNU-MIPS-NEXT: 0x0000000070000007 (MIPS_MSYM) 0x1000
+# GNU-MIPS-NEXT: 0x0000000070000008 (MIPS_CONFLICT) 0x1000
+# GNU-MIPS-NEXT: 0x0000000070000009 (MIPS_LIBLIST) 0x1000
+# GNU-MIPS-NEXT: 0x000000007000000a (MIPS_LOCAL_GOTNO) 1
+# GNU-MIPS-NEXT: 0x000000007000000b (MIPS_CONFLICTNO) 0x1
+# GNU-MIPS-NEXT: 0x0000000070000010 (MIPS_LIBLISTNO) 0x1
+# GNU-MIPS-NEXT: 0x0000000070000011 (MIPS_SYMTABNO) 1
+# GNU-MIPS-NEXT: 0x0000000070000012 (MIPS_UNREFEXTNO) 0
+# GNU-MIPS-NEXT: 0x0000000070000013 (MIPS_GOTSYM) 0x0
+# GNU-MIPS-NEXT: 0x0000000070000014 (MIPS_HIPAGENO) 0x88776655
+# GNU-MIPS-NEXT: 0x0000000070000016 (MIPS_RLD_MAP) 0x1000
+# GNU-MIPS-NEXT: 0x0000000070000017 (MIPS_DELTA_CLASS) 0x1000
+# GNU-MIPS-NEXT: 0x0000000070000018 (MIPS_DELTA_CLASS_NO) 0x1
+# GNU-MIPS-NEXT: 0x0000000070000019 (MIPS_DELTA_INSTANCE) 0x1000
+# GNU-MIPS-NEXT: 0x000000007000001a (MIPS_DELTA_INSTANCE_NO) 0x1
+# GNU-MIPS-NEXT: 0x000000007000001b (MIPS_DELTA_RELOC) 0x1000
+# GNU-MIPS-NEXT: 0x000000007000001c (MIPS_DELTA_RELOC_NO) 0x1
+# GNU-MIPS-NEXT: 0x000000007000001d (MIPS_DELTA_SYM) 0x1000
+# GNU-MIPS-NEXT: 0x000000007000001e (MIPS_DELTA_SYM_NO) 0x1
+# GNU-MIPS-NEXT: 0x0000000070000020 (MIPS_DELTA_CLASSSYM) 0x1000
+# GNU-MIPS-NEXT: 0x0000000070000021 (MIPS_DELTA_CLASSSYM_NO) 0x1
+# GNU-MIPS-NEXT: 0x0000000070000022 (MIPS_CXX_FLAGS) 0x88887777
+# GNU-MIPS-NEXT: 0x0000000070000023 (MIPS_PIXIE_INIT) 0x1000
+# GNU-MIPS-NEXT: 0x0000000070000025 (MIPS_LOCALPAGE_GOTIDX) 0x1
+# GNU-MIPS-NEXT: 0x0000000070000026 (MIPS_LOCAL_GOTIDX) 0x1
+# GNU-MIPS-NEXT: 0x0000000070000027 (MIPS_HIDDEN_GOTIDX) 0x1
+# GNU-MIPS-NEXT: 0x0000000070000028 (MIPS_PROTECTED_GOTIDX) 0x1
+# GNU-MIPS-NEXT: 0x0000000070000029 (MIPS_OPTIONS) 0x1000
+# GNU-MIPS-NEXT: 0x000000007000002a (MIPS_INTERFACE) 0x1000
+# GNU-MIPS-NEXT: 0x000000007000002b (MIPS_DYNSTR_ALIGN) 0x88888888
+# GNU-MIPS-NEXT: 0x000000007000002c (MIPS_INTERFACE_SIZE) 0x10
+# GNU-MIPS-NEXT: 0x000000007000002d (MIPS_RLD_TEXT_RESOLVE_ADDR) 0x8
+# GNU-MIPS-NEXT: 0x000000007000002e (MIPS_PERF_SUFFIX) 0x0
+# GNU-MIPS-NEXT: 0x000000007000002f (MIPS_COMPACT_SIZE) 0x10
+# GNU-MIPS-NEXT: 0x0000000070000030 (MIPS_GP_VALUE) 0x1
+# GNU-MIPS-NEXT: 0x0000000070000031 (MIPS_AUX_DYNAMIC) 0x1000
+# GNU-MIPS-NEXT: 0x0000000070000032 (MIPS_PLTGOT) 0x1000
+# GNU-MIPS-NEXT: 0x0000000070000034 (MIPS_RWPLT) 0x1000
+# GNU-MIPS-NEXT: 0x0000000070000035 (MIPS_RLD_MAP_REL) 0x1000
+# GNU-MIPS-NEXT: 0x000000001234abcd (unknown) 0x1
+# GNU-MIPS-NEXT: 0x0000000000000000 (NULL) 0x0
+
+
+# Test that PPC machine-specific tags can be dumped.
+# RUN: yaml2obj --docnum=3 %S/Inputs/elf-dynamic-tags-machine-specific.yaml -o %t.ppc
+# RUN: llvm-readobj --dynamic-table %t.ppc | FileCheck %s --check-prefix=LLVM-PPC
+# RUN: llvm-readelf --dynamic-table %t.ppc | FileCheck %s --check-prefix=GNU-PPC
+
+# LLVM-PPC: DynamicSection [ (4 entries)
+# LLVM-PPC-NEXT: Tag Type Name/Value
+# LLVM-PPC-NEXT: 0x70000000 PPC_GOT 0x200C0
+# LLVM-PPC-NEXT: 0x70000001 PPC_OPT 0x1
+# LLVM-PPC-NEXT: 0x1234ABCD unknown 0x1
+# LLVM-PPC-NEXT: 0x00000000 NULL 0x0
+# LLVM-PPC-NEXT: ]
+
+# GNU-PPC: Dynamic section at offset {{.*}} contains 4 entries:
+# GNU-PPC-NEXT: Tag Type Name/Value
+# GNU-PPC-NEXT: 0x70000000 (PPC_GOT) 0x200c0
+# GNU-PPC-NEXT: 0x70000001 (PPC_OPT) 0x1
+# GNU-PPC-NEXT: 0x1234abcd (unknown) 0x1
+# GNU-PPC-NEXT: 0x00000000 (NULL) 0x0
+
+
+# Test that PPC64 machine-specific tags can be dumped.
+# RUN: yaml2obj --docnum=4 %S/Inputs/elf-dynamic-tags-machine-specific.yaml -o %t.ppc64
+# RUN: llvm-readobj --dynamic-table %t.ppc64 | FileCheck %s --check-prefix=LLVM-PPC64
+# RUN: llvm-readelf --dynamic-table %t.ppc64 | FileCheck %s --check-prefix=GNU-PPC64
+
+# LLVM-PPC64: DynamicSection [ (4 entries)
+# LLVM-PPC64-NEXT: Tag Type Name/Value
+# LLVM-PPC64-NEXT: 0x0000000000000004 HASH 0x1000
+# LLVM-PPC64-NEXT: 0x0000000070000000 PPC64_GLINK 0x1000
+# LLVM-PPC64-NEXT: 0x000000001234ABCD unknown 0x1
+# LLVM-PPC64-NEXT: 0x0000000000000000 NULL 0x0
+# LLVM-PPC64-NEXT: ]
+
+# GNU-PPC64: Dynamic section at offset {{.*}} contains 4 entries:
+# GNU-PPC64-NEXT: Tag Type Name/Value
+# GNU-PPC64-NEXT: 0x0000000000000004 (HASH) 0x1000
+# GNU-PPC64-NEXT: 0x0000000070000000 (PPC64_GLINK) 0x1000
+# GNU-PPC64-NEXT: 0x000000001234abcd (unknown) 0x1
+# GNU-PPC64-NEXT: 0x0000000000000000 (NULL) 0x0
+
+# Test that AARCH64 machine-specific tags can be dumped.
+# RUN: yaml2obj --docnum=5 %S/Inputs/elf-dynamic-tags-machine-specific.yaml -o %t.aarch64
+# RUN: llvm-readobj --dynamic-table %t.aarch64 | FileCheck %s --check-prefix=LLVM-AARCH64
+# RUN: llvm-readelf --dynamic-table %t.aarch64 | FileCheck %s --check-prefix=GNU-AARCH64
+
+# LLVM-AARCH64: DynamicSection [ (5 entries)
+# LLVM-AARCH64-NEXT: Tag Type Name/Value
+# LLVM-AARCH64-NEXT: 0x0000000000000004 HASH 0x1000
+# LLVM-AARCH64-NEXT: 0x0000000070000001 AARCH64_BTI_PLT 0
+# LLVM-AARCH64-NEXT: 0x0000000070000003 AARCH64_PAC_PLT 0
+# LLVM-AARCH64-NEXT: 0x000000001234ABCD unknown 0x1
+# LLVM-AARCH64-NEXT: 0x0000000000000000 NULL 0x0
+# LLVM-AARCH64-NEXT:]
+
+# GNU-AARCH64: Dynamic section at offset {{.*}} contains 5 entries:
+# GNU-AARCH64-NEXT: Tag Type Name/Value
+# GNU-AARCH64-NEXT: 0x0000000000000004 (HASH) 0x1000
+# GNU-AARCH64-NEXT: 0x0000000070000001 (AARCH64_BTI_PLT) 0
+# GNU-AARCH64-NEXT: 0x0000000070000003 (AARCH64_PAC_PLT) 0
+# GNU-AARCH64-NEXT: 0x000000001234abcd (unknown) 0x1
+# GNU-AARCH64-NEXT: 0x0000000000000000 (NULL) 0x0
diff --git a/llvm/test/tools/llvm-readobj/ELF/dynamic-tags.test b/llvm/test/tools/llvm-readobj/ELF/dynamic-tags.test
new file mode 100644
index 00000000000..bbf9f798cc6
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/dynamic-tags.test
@@ -0,0 +1,287 @@
+## Show that all non-machine specific tags can be read and printed correctly.
+## Also show that -d is an alias for --dynamic-table.
+
+# RUN: yaml2obj %s -o %t
+# RUN: llvm-readobj --dynamic-table %t | FileCheck %s --check-prefix=LLVM
+# RUN: llvm-readobj -d %t | FileCheck %s --check-prefix=LLVM
+# RUN: llvm-readelf --dynamic-table %t | FileCheck %s --check-prefix=GNU
+# RUN: llvm-readelf -d %t | FileCheck %s --check-prefix=GNU
+
+# LLVM: DynamicSection [ (61 entries)
+# LLVM-NEXT: Tag Type Name/Value
+# LLVM-NEXT: 0x0000000000000001 NEEDED Shared library: [D]
+# LLVM-NEXT: 0x0000000000000002 PLTRELSZ 16 (bytes)
+# LLVM-NEXT: 0x0000000000000003 PLTGOT 0x1000
+# LLVM-NEXT: 0x0000000000000004 HASH 0x1000
+# LLVM-NEXT: 0x0000000000000005 STRTAB 0x1000
+# LLVM-NEXT: 0x0000000000000006 SYMTAB 0x1000
+# LLVM-NEXT: 0x0000000000000007 RELA 0x1000
+# LLVM-NEXT: 0x0000000000000008 RELASZ 16 (bytes)
+# LLVM-NEXT: 0x0000000000000009 RELAENT 1929 (bytes)
+# LLVM-NEXT: 0x000000000000000A STRSZ 16 (bytes)
+# LLVM-NEXT: 0x000000000000000B SYMENT 2439 (bytes)
+# LLVM-NEXT: 0x000000000000000C INIT 0x1000
+# LLVM-NEXT: 0x000000000000000D FINI 0x1000
+# LLVM-NEXT: 0x000000000000000E SONAME Library soname: [U]
+# LLVM-NEXT: 0x000000000000000F RPATH Library rpath: [f]
+# LLVM-NEXT: 0x0000000000000010 SYMBOLIC 0x1234567890ABCDEF
+# LLVM-NEXT: 0x0000000000000011 REL 0x1000
+# LLVM-NEXT: 0x0000000000000012 RELSZ 16 (bytes)
+# LLVM-NEXT: 0x0000000000000013 RELENT 291 (bytes)
+# LLVM-NEXT: 0x0000000000000014 PLTREL RELA
+# LLVM-NEXT: 0x0000000000000015 DEBUG 0xFEDCBA0987654321
+# LLVM-NEXT: 0x0000000000000016 TEXTREL 0x1122334455667788
+# LLVM-NEXT: 0x0000000000000017 JMPREL 0x1000
+# LLVM-NEXT: 0x0000000000000018 BIND_NOW 0x8877665544332211
+# LLVM-NEXT: 0x0000000000000019 INIT_ARRAY 0x1000
+# LLVM-NEXT: 0x000000000000001A FINI_ARRAY 0x1000
+# LLVM-NEXT: 0x000000000000001B INIT_ARRAYSZ 16 (bytes)
+# LLVM-NEXT: 0x000000000000001C FINI_ARRAYSZ 16 (bytes)
+# LLVM-NEXT: 0x000000000000001D RUNPATH Library runpath: [w]
+# LLVM-NEXT: 0x000000000000001E FLAGS ORIGIN SYMBOLIC TEXTREL BIND_NOW STATIC_TLS {{$}}
+# LLVM-NEXT: 0x0000000000000020 PREINIT_ARRAY 0x1000
+# LLVM-NEXT: 0x0000000000000021 PREINIT_ARRAYSZ 16 (bytes)
+# LLVM-NEXT: 0x0000000000000022 SYMTAB_SHNDX 0x1000
+# LLVM-NEXT: 0x0000000000000023 RELRSZ 0x10
+# LLVM-NEXT: 0x0000000000000024 RELR 0x1000
+# LLVM-NEXT: 0x0000000000000025 RELRENT 0x4321
+# LLVM-NEXT: 0x000000006000000F ANDROID_REL 0x1000
+# LLVM-NEXT: 0x0000000060000010 ANDROID_RELSZ 16 (bytes)
+# LLVM-NEXT: 0x0000000060000011 ANDROID_RELA 0x1000
+# LLVM-NEXT: 0x0000000060000012 ANDROID_RELASZ 16 (bytes)
+# LLVM-NEXT: 0x000000006FFFE000 ANDROID_RELR 0x1000
+# LLVM-NEXT: 0x000000006FFFE001 ANDROID_RELRSZ 0x10
+# LLVM-NEXT: 0x000000006FFFE003 ANDROID_RELRENT 0x1234
+# LLVM-NEXT: 0x000000006FFFFEF5 GNU_HASH 0x1000
+# LLVM-NEXT: 0x000000006FFFFEF6 TLSDESC_PLT 0x1000
+# LLVM-NEXT: 0x000000006FFFFEF7 TLSDESC_GOT 0x1000
+# LLVM-NEXT: 0x000000006FFFFFF9 RELACOUNT 0
+# LLVM-NEXT: 0x000000006FFFFFFA RELCOUNT 0
+# LLVM-NEXT: 0x000000006FFFFFFB FLAGS_1 NOW GLOBAL GROUP NODELETE LOADFLTR INITFIRST NOOPEN ORIGIN DIRECT TRANS INTERPOSE NODEFLIB NODUMP CONFALT ENDFILTEE DISPRELDNE DISPRELPND NODIRECT IGNMULDEF NOKSYMS NOHDR EDITED NORELOC SYMINTPOSE GLOBAUDIT SINGLETON {{$}}
+# LLVM-NEXT: 0x000000006FFFFFF0 VERSYM 0x1000
+# LLVM-NEXT: 0x000000006FFFFFFC VERDEF 0x1000
+# LLVM-NEXT: 0x000000006FFFFFFD VERDEFNUM 0
+# LLVM-NEXT: 0x000000006FFFFFFE VERNEED 0x1000
+# LLVM-NEXT: 0x000000006FFFFFFF VERNEEDNUM 0
+# LLVM-NEXT: 0x000000007FFFFFFD AUXILIARY Auxiliary library: [D]
+# LLVM-NEXT: 0x000000007FFFFFFE USED Not needed object: [U]
+# LLVM-NEXT: 0x000000007FFFFFFF FILTER Filter library: [U]
+# LLVM-NEXT: 0x0000000012345678 unknown 0x8765432187654321
+# LLVM-NEXT: 0x000000006ABCDEF0 unknown 0x9988776655443322
+# LLVM-NEXT: 0x0000000076543210 unknown 0x5555666677778888
+# LLVM-NEXT: 0x0000000000000000 NULL 0x0
+# LLVM-NEXT: ]
+
+# GNU: Dynamic section at offset {{.*}} contains 61 entries:
+# GNU-NEXT: Tag Type Name/Value
+# GNU-NEXT: 0x0000000000000001 (NEEDED) Shared library: [D]
+# GNU-NEXT: 0x0000000000000002 (PLTRELSZ) 16 (bytes)
+# GNU-NEXT: 0x0000000000000003 (PLTGOT) 0x1000
+# GNU-NEXT: 0x0000000000000004 (HASH) 0x1000
+# GNU-NEXT: 0x0000000000000005 (STRTAB) 0x1000
+# GNU-NEXT: 0x0000000000000006 (SYMTAB) 0x1000
+# GNU-NEXT: 0x0000000000000007 (RELA) 0x1000
+# GNU-NEXT: 0x0000000000000008 (RELASZ) 16 (bytes)
+# GNU-NEXT: 0x0000000000000009 (RELAENT) 1929 (bytes)
+# GNU-NEXT: 0x000000000000000a (STRSZ) 16 (bytes)
+# GNU-NEXT: 0x000000000000000b (SYMENT) 2439 (bytes)
+# GNU-NEXT: 0x000000000000000c (INIT) 0x1000
+# GNU-NEXT: 0x000000000000000d (FINI) 0x1000
+# GNU-NEXT: 0x000000000000000e (SONAME) Library soname: [U]
+# GNU-NEXT: 0x000000000000000f (RPATH) Library rpath: [f]
+# GNU-NEXT: 0x0000000000000010 (SYMBOLIC) 0x1234567890abcdef
+# GNU-NEXT: 0x0000000000000011 (REL) 0x1000
+# GNU-NEXT: 0x0000000000000012 (RELSZ) 16 (bytes)
+# GNU-NEXT: 0x0000000000000013 (RELENT) 291 (bytes)
+# GNU-NEXT: 0x0000000000000014 (PLTREL) RELA
+# GNU-NEXT: 0x0000000000000015 (DEBUG) 0xfedcba0987654321
+# GNU-NEXT: 0x0000000000000016 (TEXTREL) 0x1122334455667788
+# GNU-NEXT: 0x0000000000000017 (JMPREL) 0x1000
+# GNU-NEXT: 0x0000000000000018 (BIND_NOW) 0x8877665544332211
+# GNU-NEXT: 0x0000000000000019 (INIT_ARRAY) 0x1000
+# GNU-NEXT: 0x000000000000001a (FINI_ARRAY) 0x1000
+# GNU-NEXT: 0x000000000000001b (INIT_ARRAYSZ) 16 (bytes)
+# GNU-NEXT: 0x000000000000001c (FINI_ARRAYSZ) 16 (bytes)
+# GNU-NEXT: 0x000000000000001d (RUNPATH) Library runpath: [w]
+# GNU-NEXT: 0x000000000000001e (FLAGS) ORIGIN SYMBOLIC TEXTREL BIND_NOW STATIC_TLS {{$}}
+# GNU-NEXT: 0x0000000000000020 (PREINIT_ARRAY) 0x1000
+# GNU-NEXT: 0x0000000000000021 (PREINIT_ARRAYSZ) 16 (bytes)
+# GNU-NEXT: 0x0000000000000022 (SYMTAB_SHNDX) 0x1000
+# GNU-NEXT: 0x0000000000000023 (RELRSZ) 0x10
+# GNU-NEXT: 0x0000000000000024 (RELR) 0x1000
+# GNU-NEXT: 0x0000000000000025 (RELRENT) 0x4321
+# GNU-NEXT: 0x000000006000000f (ANDROID_REL) 0x1000
+# GNU-NEXT: 0x0000000060000010 (ANDROID_RELSZ) 16 (bytes)
+# GNU-NEXT: 0x0000000060000011 (ANDROID_RELA) 0x1000
+# GNU-NEXT: 0x0000000060000012 (ANDROID_RELASZ) 16 (bytes)
+# GNU-NEXT: 0x000000006fffe000 (ANDROID_RELR) 0x1000
+# GNU-NEXT: 0x000000006fffe001 (ANDROID_RELRSZ) 0x10
+# GNU-NEXT: 0x000000006fffe003 (ANDROID_RELRENT) 0x1234
+# GNU-NEXT: 0x000000006ffffef5 (GNU_HASH) 0x1000
+# GNU-NEXT: 0x000000006ffffef6 (TLSDESC_PLT) 0x1000
+# GNU-NEXT: 0x000000006ffffef7 (TLSDESC_GOT) 0x1000
+# GNU-NEXT: 0x000000006ffffff9 (RELACOUNT) 0
+# GNU-NEXT: 0x000000006ffffffa (RELCOUNT) 0
+# GNU-NEXT: 0x000000006ffffffb (FLAGS_1) NOW GLOBAL GROUP NODELETE LOADFLTR INITFIRST NOOPEN ORIGIN DIRECT TRANS INTERPOSE NODEFLIB NODUMP CONFALT ENDFILTEE DISPRELDNE DISPRELPND NODIRECT IGNMULDEF NOKSYMS NOHDR EDITED NORELOC SYMINTPOSE GLOBAUDIT SINGLETON {{$}}
+# GNU-NEXT: 0x000000006ffffff0 (VERSYM) 0x1000
+# GNU-NEXT: 0x000000006ffffffc (VERDEF) 0x1000
+# GNU-NEXT: 0x000000006ffffffd (VERDEFNUM) 0
+# GNU-NEXT: 0x000000006ffffffe (VERNEED) 0x1000
+# GNU-NEXT: 0x000000006fffffff (VERNEEDNUM) 0
+# GNU-NEXT: 0x000000007ffffffd (AUXILIARY) Auxiliary library: [D]
+# GNU-NEXT: 0x000000007ffffffe (USED) Not needed object: [U]
+# GNU-NEXT: 0x000000007fffffff (FILTER) Filter library: [U]
+# GNU-NEXT: 0x0000000012345678 (unknown) 0x8765432187654321
+# GNU-NEXT: 0x000000006abcdef0 (unknown) 0x9988776655443322
+# GNU-NEXT: 0x0000000076543210 (unknown) 0x5555666677778888
+# GNU-NEXT: 0x0000000000000000 (NULL) 0x0
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .dynstr
+ Type: SHT_STRTAB
+ Address: 0x1000
+ Size: 0x10
+ Content: "004400550066007700"
+ - Name: .dynamic
+ Type: SHT_DYNAMIC
+ Address: 0x1010
+ Entries:
+ - Tag: DT_NEEDED
+ Value: 0x1
+ - Tag: DT_PLTRELSZ
+ Value: 0x10
+ - Tag: DT_PLTGOT
+ Value: 0x1000
+ - Tag: DT_HASH
+ Value: 0x1000
+ - Tag: DT_STRTAB
+ Value: 0x1000
+ - Tag: DT_SYMTAB
+ Value: 0x1000
+ - Tag: DT_RELA
+ Value: 0x1000
+ - Tag: DT_RELASZ
+ Value: 0x10
+ - Tag: DT_RELAENT
+ Value: 0x789
+ - Tag: DT_STRSZ
+ Value: 0x10
+ - Tag: DT_SYMENT
+ Value: 0x987
+ - Tag: DT_INIT
+ Value: 0x1000
+ - Tag: DT_FINI
+ Value: 0x1000
+ - Tag: DT_SONAME
+ Value: 0x3
+ - Tag: DT_RPATH
+ Value: 0x5
+ - Tag: DT_SYMBOLIC
+ Value: 0x1234567890abcdef
+ - Tag: DT_REL
+ Value: 0x1000
+ - Tag: DT_RELSZ
+ Value: 0x10
+ - Tag: DT_RELENT
+ Value: 0x123
+ - Tag: DT_PLTREL
+ Value: 0x7
+ - Tag: DT_DEBUG
+ Value: 0xfedcba0987654321
+ - Tag: DT_TEXTREL
+ Value: 0x1122334455667788
+ - Tag: DT_JMPREL
+ Value: 0x1000
+ - Tag: DT_BIND_NOW
+ Value: 0x8877665544332211
+ - Tag: DT_INIT_ARRAY
+ Value: 0x1000
+ - Tag: DT_FINI_ARRAY
+ Value: 0x1000
+ - Tag: DT_INIT_ARRAYSZ
+ Value: 0x10
+ - Tag: DT_FINI_ARRAYSZ
+ Value: 0x10
+ - Tag: DT_RUNPATH
+ Value: 0x7
+ - Tag: DT_FLAGS
+ Value: 0xffffffffffffffff
+ - Tag: DT_PREINIT_ARRAY
+ Value: 0x1000
+ - Tag: DT_PREINIT_ARRAYSZ
+ Value: 0x10
+ - Tag: DT_SYMTAB_SHNDX
+ Value: 0x1000
+ - Tag: DT_RELRSZ
+ Value: 0x10
+ - Tag: DT_RELR
+ Value: 0x1000
+ - Tag: DT_RELRENT
+ Value: 0x4321
+ - Tag: DT_ANDROID_REL
+ Value: 0x1000
+ - Tag: DT_ANDROID_RELSZ
+ Value: 0x10
+ - Tag: DT_ANDROID_RELA
+ Value: 0x1000
+ - Tag: DT_ANDROID_RELASZ
+ Value: 0x10
+ - Tag: DT_ANDROID_RELR
+ Value: 0x1000
+ - Tag: DT_ANDROID_RELRSZ
+ Value: 0x10
+ - Tag: DT_ANDROID_RELRENT
+ Value: 0x1234
+ - Tag: DT_GNU_HASH
+ Value: 0x1000
+ - Tag: DT_TLSDESC_PLT
+ Value: 0x1000
+ - Tag: DT_TLSDESC_GOT
+ Value: 0x1000
+ - Tag: DT_RELACOUNT
+ Value: 0x0
+ - Tag: DT_RELCOUNT
+ Value: 0x0
+ - Tag: DT_FLAGS_1
+ Value: 0xffffffffffffffff
+ - Tag: DT_VERSYM
+ Value: 0x1000
+ - Tag: DT_VERDEF
+ Value: 0x1000
+ - Tag: DT_VERDEFNUM
+ Value: 0x0
+ - Tag: DT_VERNEED
+ Value: 0x1000
+ - Tag: DT_VERNEEDNUM
+ Value: 0x0
+ - Tag: DT_AUXILIARY
+ Value: 0x1
+ - Tag: DT_USED
+ Value: 0x3
+ - Tag: DT_FILTER
+ Value: 0x3
+ # Show behaviour for unknown values in special and un-marked ranges.
+ - Tag: 0x12345678
+ Value: 0x8765432187654321
+ - Tag: 0x6abcdef0
+ Value: 0x9988776655443322
+ - Tag: 0x76543210
+ Value: 0x5555666677778888
+ - Tag: DT_NULL
+ Value: 0x0
+ProgramHeaders:
+ - Type: PT_LOAD
+ VAddr: 0x1000
+ Sections:
+ - Section: .dynstr
+ - Section: .dynamic
+ - Type: PT_DYNAMIC
+ VAddr: 0x1010
+ Sections:
+ - Section: .dynamic
diff --git a/llvm/test/tools/llvm-readobj/ELF/file-headers.test b/llvm/test/tools/llvm-readobj/ELF/file-headers.test
new file mode 100644
index 00000000000..d3282c804cc
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/file-headers.test
@@ -0,0 +1,139 @@
+# RUN: yaml2obj %s --docnum=1 -o %t.i386
+# RUN: llvm-readobj -h %t.i386 | FileCheck %s --strict-whitespace --match-full-lines -DFILE=%t.i386 --check-prefix I386
+# RUN: llvm-readobj --file-header %t.i386 | FileCheck %s --strict-whitespace --match-full-lines -DFILE=%t.i386 --check-prefix I386
+# RUN: llvm-readobj --file-headers %t.i386 | FileCheck %s --strict-whitespace --match-full-lines -DFILE=%t.i386 --check-prefix I386
+
+# I386:File: [[FILE]]
+# I386-NEXT:Format: ELF32-i386
+# I386-NEXT:Arch: i386
+# I386-NEXT:AddressSize: 32bit
+# I386-NEXT:LoadName: <Not found>
+# I386-NEXT:ElfHeader {
+# I386-NEXT: Ident {
+# I386-NEXT: Magic: (7F 45 4C 46)
+# I386-NEXT: Class: 32-bit (0x1)
+# I386-NEXT: DataEncoding: LittleEndian (0x1)
+# I386-NEXT: FileVersion: 1
+# I386-NEXT: OS/ABI: GNU/Linux (0x3)
+# I386-NEXT: ABIVersion: 0
+# I386-NEXT: Unused: (00 00 00 00 00 00 00)
+# I386-NEXT: }
+# I386-NEXT: Type: Relocatable (0x1)
+# I386-NEXT: Machine: EM_386 (0x3)
+# I386-NEXT: Version: 1
+# I386-NEXT: Entry: 0x0
+# I386-NEXT: ProgramHeaderOffset: 0x0
+# I386-NEXT: SectionHeaderOffset: 0x48
+# I386-NEXT: Flags [ (0x0)
+# I386-NEXT: ]
+# I386-NEXT: HeaderSize: 52
+# I386-NEXT: ProgramHeaderEntrySize: 0
+# I386-NEXT: ProgramHeaderCount: 0
+# I386-NEXT: SectionHeaderEntrySize: 40
+# I386-NEXT: SectionHeaderCount: 3
+# I386-NEXT: StringTableSectionIndex: 2
+# I386-NEXT:}
+# I386-NOT:{{.}}
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_386
+
+# RUN: yaml2obj %s --docnum=2 -o %t.x86-64
+# RUN: llvm-readobj -h %t.x86-64 \
+# RUN: | FileCheck %s --strict-whitespace --match-full-lines -DFILE=%t.x86-64 --check-prefix X86-64
+# RUN: llvm-readobj --file-header %t.x86-64 \
+# RUN: | FileCheck %s --strict-whitespace --match-full-lines -DFILE=%t.x86-64 --check-prefix X86-64
+# RUN: llvm-readobj --file-headers %t.x86-64 \
+# RUN: | FileCheck %s --strict-whitespace --match-full-lines -DFILE=%t.x86-64 --check-prefix X86-64
+
+# X86-64:File: [[FILE]]
+# X86-64-NEXT:Format: ELF64-x86-64
+# X86-64-NEXT:Arch: x86_64
+# X86-64-NEXT:AddressSize: 64bit
+# X86-64-NEXT:LoadName: <Not found>
+# X86-64-NEXT:ElfHeader {
+# X86-64-NEXT: Ident {
+# X86-64-NEXT: Magic: (7F 45 4C 46)
+# X86-64-NEXT: Class: 64-bit (0x2)
+# X86-64-NEXT: DataEncoding: LittleEndian (0x1)
+# X86-64-NEXT: FileVersion: 1
+# X86-64-NEXT: OS/ABI: GNU/Linux (0x3)
+# X86-64-NEXT: ABIVersion: 0
+# X86-64-NEXT: Unused: (00 00 00 00 00 00 00)
+# X86-64-NEXT: }
+# X86-64-NEXT: Type: Relocatable (0x1)
+# X86-64-NEXT: Machine: EM_X86_64 (0x3E)
+# X86-64-NEXT: Version: 1
+# X86-64-NEXT: Entry: 0x0
+# X86-64-NEXT: ProgramHeaderOffset: 0x0
+# X86-64-NEXT: SectionHeaderOffset: 0x58
+# X86-64-NEXT: Flags [ (0x0)
+# X86-64-NEXT: ]
+# X86-64-NEXT: HeaderSize: 64
+# X86-64-NEXT: ProgramHeaderEntrySize: 0
+# X86-64-NEXT: ProgramHeaderCount: 0
+# X86-64-NEXT: SectionHeaderEntrySize: 64
+# X86-64-NEXT: SectionHeaderCount: 3
+# X86-64-NEXT: StringTableSectionIndex: 2
+# X86-64-NEXT:}
+# X86-64-NOT:{{.}}
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_X86_64
+
+# RUN: yaml2obj %s --docnum=3 -o %t.lanai
+# RUN: llvm-readobj -h %t.lanai \
+# RUN: | FileCheck %s --strict-whitespace --match-full-lines -DFILE=%t.lanai --check-prefix LANAI
+# RUN: llvm-readobj --file-header %t.lanai \
+# RUN: | FileCheck %s --strict-whitespace --match-full-lines -DFILE=%t.lanai --check-prefix LANAI
+# RUN: llvm-readobj --file-headers %t.lanai \
+# RUN: | FileCheck %s --strict-whitespace --match-full-lines -DFILE=%t.lanai --check-prefix LANAI
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2MSB
+ Type: ET_REL
+ Machine: EM_LANAI
+
+# LANAI:File: [[FILE]]
+# LANAI-NEXT:Format: ELF32-lanai
+# LANAI-NEXT:Arch: lanai
+# LANAI-NEXT:AddressSize: 32bit
+# LANAI-NEXT:LoadName: <Not found>
+# LANAI-NEXT:ElfHeader {
+# LANAI-NEXT: Ident {
+# LANAI-NEXT: Magic: (7F 45 4C 46)
+# LANAI-NEXT: Class: 32-bit (0x1)
+# LANAI-NEXT: DataEncoding: BigEndian (0x2)
+# LANAI-NEXT: FileVersion: 1
+# LANAI-NEXT: OS/ABI: SystemV (0x0)
+# LANAI-NEXT: ABIVersion: 0
+# LANAI-NEXT: Unused: (00 00 00 00 00 00 00)
+# LANAI-NEXT: }
+# LANAI-NEXT: Type: Relocatable (0x1)
+# LANAI-NEXT: Machine: EM_LANAI (0xF4)
+# LANAI-NEXT: Version: 1
+# LANAI-NEXT: Entry: 0x0
+# LANAI-NEXT: ProgramHeaderOffset: 0x0
+# LANAI-NEXT: SectionHeaderOffset: 0x48
+# LANAI-NEXT: Flags [ (0x0)
+# LANAI-NEXT: ]
+# LANAI-NEXT: HeaderSize: 52
+# LANAI-NEXT: ProgramHeaderEntrySize: 0
+# LANAI-NEXT: ProgramHeaderCount: 0
+# LANAI-NEXT: SectionHeaderEntrySize: 40
+# LANAI-NEXT: SectionHeaderCount: 3
+# LANAI-NEXT: StringTableSectionIndex: 2
+# LANAI-NEXT:}
+# LANAI-NOT:{{.}}
diff --git a/llvm/test/tools/llvm-readobj/ELF/file-name.test b/llvm/test/tools/llvm-readobj/ELF/file-name.test
new file mode 100644
index 00000000000..4a2244e9716
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/file-name.test
@@ -0,0 +1,42 @@
+## This test shows that the name of the file is printed under the right
+## circumstances and with the correct formatting for object inputs.
+
+# RUN: yaml2obj %s -o %t1
+# RUN: cp %t1 %t2
+
+## Show that the file name is not printed for a single input for GNU output.
+# RUN: llvm-readelf --file-headers %t1 \
+# RUN: | FileCheck %s --implicit-check-not=File: --check-prefix=GNU-SINGLE
+
+## Show that the very first line of the output is the one with "ELF Header" on.
+# GNU-SINGLE: {{^}}
+# GNU-SINGLE-SAME: ELF Header:
+
+## Show that the file names are printed for all inputs for GNU output.
+# RUN: llvm-readelf --file-headers %t1 %t2 \
+# RUN: | FileCheck %s --check-prefixes=NAME1,GNU,NAME2 -DFILE1=%t1 -DFILE2=%t2
+
+## Show that the file name is printed for a single input for LLVM output.
+# RUN: llvm-readobj --file-headers %t1 | FileCheck %s --check-prefix=NAME1 -DFILE1=%t1
+
+## Show that the file name is printed with correct spacing for multiple inputs
+## with LLVM output.
+# RUN: llvm-readobj --file-headers %t1 %t2 \
+# RUN: | FileCheck %s --check-prefixes=NAME1,LLVM,NAME2 -DFILE1=%t1 -DFILE2=%t2
+
+## The very first line should be blank. CHECK-EMPTY isn't allowed on the first line.
+# NAME1: {{^$}}
+# NAME1-NEXT: {{^}}File: [[FILE1]]{{$}}
+
+# GNU: Section header string table index:
+# LLVM: StringTableSectionIndex:
+# LLVM-NEXT: }
+# NAME2-EMPTY:
+# NAME2-NEXT: {{^}}File: [[FILE2]]{{$}}
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
diff --git a/llvm/test/tools/llvm-readobj/ELF/file-types.test b/llvm/test/tools/llvm-readobj/ELF/file-types.test
new file mode 100644
index 00000000000..0765cff1040
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/file-types.test
@@ -0,0 +1,154 @@
+## Check llvm-readobj and llvm-readelf can dump files of the different ELF types.
+
+# RUN: yaml2obj %s --docnum=1 -o %t1
+# RUN: llvm-readobj -h %t1 | FileCheck %s --match-full-lines --check-prefix LLVM-NONE
+# RUN: llvm-readelf -h %t1 | FileCheck %s --match-full-lines --check-prefix GNU-NONE
+
+# LLVM-NONE: ElfHeader {
+# LLVM-NONE: Type: None (0x0)
+
+# GNU-NONE: ELF Header:
+# GNU-NONE: Type: NONE (none)
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_NONE
+ Machine: EM_X86_64
+
+# RUN: yaml2obj %s --docnum=2 -o %t2
+# RUN: llvm-readobj -h %t2 | FileCheck %s --match-full-lines --check-prefix LLVM-REL
+# RUN: llvm-readelf -h %t2 | FileCheck %s --match-full-lines --check-prefix GNU-REL
+
+# LLVM-REL: ElfHeader {
+# LLVM-REL: Type: Relocatable (0x1)
+
+# GNU-REL: ELF Header:
+# GNU-REL: Type: REL (Relocatable file)
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+
+# RUN: yaml2obj %s --docnum=3 -o %t3
+# RUN: llvm-readobj -h %t3 | FileCheck %s --match-full-lines --check-prefix LLVM-EXEC
+# RUN: llvm-readelf -h %t3 | FileCheck %s --match-full-lines --check-prefix GNU-EXEC
+
+# LLVM-EXEC: ElfHeader {
+# LLVM-EXEC: Type: Executable (0x2)
+
+# GNU-EXEC: ELF Header:
+# GNU-EXEC: Type: EXEC (Executable file)
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+
+# RUN: yaml2obj %s --docnum=4 -o %t4
+# RUN: llvm-readobj -h %t4 | FileCheck %s --match-full-lines --check-prefix LLVM-DYN
+# RUN: llvm-readelf -h %t4 | FileCheck %s --match-full-lines --check-prefix GNU-DYN
+
+# LLVM-DYN: ElfHeader {
+# LLVM-DYN: Type: SharedObject (0x3)
+
+# GNU-DYN: ELF Header:
+# GNU-DYN: Type: DYN (Shared object file)
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_DYN
+ Machine: EM_X86_64
+
+# RUN: yaml2obj %s --docnum=5 -o %t5
+# RUN: llvm-readobj -h %t5 | FileCheck %s --match-full-lines --check-prefix LLVM-CORE
+# RUN: llvm-readelf -h %t5 | FileCheck %s --match-full-lines --check-prefix GNU-CORE
+
+# LLVM-CORE: ElfHeader {
+# LLVM-CORE: Type: Core (0x4)
+
+# GNU-CORE: ELF Header:
+# GNU-CORE: Type: CORE (Core file)
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_CORE
+ Machine: EM_X86_64
+
+# RUN: yaml2obj %s --docnum=6 -o %t6
+# RUN: llvm-readobj -h %t6 | FileCheck %s --match-full-lines --check-prefix LLVM-LOOS
+# RUN: llvm-readelf -h %t6 | FileCheck %s --match-full-lines --check-prefix GNU-LOOS
+
+# LLVM-LOOS: ElfHeader {
+# LLVM-LOOS: Type: 0xFE00
+
+# GNU-LOOS: ELF Header:
+# GNU-LOOS: Type: fe00
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: 0xfe00
+ Machine: EM_X86_64
+
+# RUN: yaml2obj %s --docnum=7 -o %t7
+# RUN: llvm-readobj -h %t7 | FileCheck %s --match-full-lines --check-prefix LLVM-HIOS
+# RUN: llvm-readelf -h %t7 | FileCheck %s --match-full-lines --check-prefix GNU-HIOS
+
+# LLVM-HIOS: ElfHeader {
+# LLVM-HIOS: Type: 0xFEFF
+
+# GNU-HIOS: ELF Header:
+# GNU-HIOS: Type: feff
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: 0xfeff
+ Machine: EM_X86_64
+
+# RUN: yaml2obj %s --docnum=8 -o %t8
+# RUN: llvm-readobj -h %t8 | FileCheck %s --match-full-lines --check-prefix LLVM-LOPROC
+# RUN: llvm-readelf -h %t8 | FileCheck %s --match-full-lines --check-prefix GNU-LOPROC
+
+# LLVM-LOPROC: ElfHeader {
+# LLVM-LOPROC: Type: 0xFF00
+
+# GNU-LOPROC: ELF Header:
+# GNU-LOPROC: Type: ff00
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: 0xff00
+ Machine: EM_X86_64
+
+# RUN: yaml2obj %s --docnum=9 -o %t9
+# RUN: llvm-readobj -h %t9 | FileCheck %s --match-full-lines --check-prefix LLVM-HIPROC
+# RUN: llvm-readelf -h %t9 | FileCheck %s --match-full-lines --check-prefix GNU-HIPROC
+
+# LLVM-HIPROC: ElfHeader {
+# LLVM-HIPROC: Type: 0xFFFF
+
+# GNU-HIPROC: ELF Header:
+# GNU-HIPROC: Type: ffff
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: 0xffff
+ Machine: EM_X86_64
diff --git a/llvm/test/tools/llvm-readobj/ELF/gnu-file-headers.test b/llvm/test/tools/llvm-readobj/ELF/gnu-file-headers.test
new file mode 100644
index 00000000000..c6287450989
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/gnu-file-headers.test
@@ -0,0 +1,81 @@
+RUN: llvm-readelf -h %p/Inputs/trivial.obj.elf-i386 \
+RUN: | FileCheck %s -check-prefix ELF32
+RUN: llvm-readelf --file-header %p/Inputs/trivial.obj.elf-i386 \
+RUN: | FileCheck %s -check-prefix ELF32
+RUN: llvm-readelf --file-headers %p/Inputs/trivial.obj.elf-i386 \
+RUN: | FileCheck %s -check-prefix ELF32
+RUN: llvm-readelf -h %p/Inputs/trivial.obj.elf-x86-64 \
+RUN: | FileCheck %s -check-prefix ELF64
+RUN: llvm-readelf --file-header %p/Inputs/trivial.obj.elf-x86-64 \
+RUN: | FileCheck %s -check-prefix ELF64
+RUN: llvm-readelf --file-headers %p/Inputs/trivial.obj.elf-x86-64 \
+RUN: | FileCheck %s -check-prefix ELF64
+RUN: llvm-readelf -h %p/Inputs/trivial.obj.elf-mipsel \
+RUN: | FileCheck %s -check-prefix MIPSEL
+RUN: llvm-readelf --file-header %p/Inputs/trivial.obj.elf-mipsel \
+RUN: | FileCheck %s -check-prefix MIPSEL
+RUN: llvm-readelf --file-headers %p/Inputs/trivial.obj.elf-mipsel \
+RUN: | FileCheck %s -check-prefix MIPSEL
+
+ELF32: ELF Header:
+ELF32-NEXT: Magic: 7f 45 4c 46 01 01 01 03 00 00 00 00 00 00 00 00
+ELF32-NEXT: Class: ELF32
+ELF32-NEXT: Data: 2's complement, little endian
+ELF32-NEXT: Version: 1 (current)
+ELF32-NEXT: OS/ABI: UNIX - GNU
+ELF32-NEXT: ABI Version: 0
+ELF32-NEXT: Type: REL (Relocatable file)
+ELF32-NEXT: Machine: Intel 80386
+ELF32-NEXT: Version: 0x1
+ELF32-NEXT: Entry point address: 0x0
+ELF32-NEXT: Start of program headers: 0 (bytes into file)
+ELF32-NEXT: Start of section headers: 200 (bytes into file)
+ELF32-NEXT: Flags: 0x0
+ELF32-NEXT: Size of this header: 52 (bytes)
+ELF32-NEXT: Size of program headers: 0 (bytes)
+ELF32-NEXT: Number of program headers: 0
+ELF32-NEXT: Size of section headers: 40 (bytes)
+ELF32-NEXT: Number of section headers: 10
+ELF32-NEXT: Section header string table index: 7
+
+ELF64: ELF Header:
+ELF64-NEXT: Magic: 7f 45 4c 46 02 01 01 03 00 00 00 00 00 00 00 00
+ELF64-NEXT: Class: ELF64
+ELF64-NEXT: Data: 2's complement, little endian
+ELF64-NEXT: Version: 1 (current)
+ELF64-NEXT: OS/ABI: UNIX - GNU
+ELF64-NEXT: ABI Version: 0
+ELF64-NEXT: Type: REL (Relocatable file)
+ELF64-NEXT: Machine: Advanced Micro Devices X86-64
+ELF64-NEXT: Version: 0x1
+ELF64-NEXT: Entry point address: 0x0
+ELF64-NEXT: Start of program headers: 0 (bytes into file)
+ELF64-NEXT: Start of section headers: 184 (bytes into file)
+ELF64-NEXT: Flags: 0x0
+ELF64-NEXT: Size of this header: 64 (bytes)
+ELF64-NEXT: Size of program headers: 0 (bytes)
+ELF64-NEXT: Number of program headers: 0
+ELF64-NEXT: Size of section headers: 64 (bytes)
+ELF64-NEXT: Number of section headers: 10
+ELF64-NEXT: Section header string table index: 7
+
+MIPSEL: ELF Header:
+MIPSEL-NEXT: Magic: 7f 45 4c 46 01 01 01 03 00 00 00 00 00 00 00 00
+MIPSEL-NEXT: Class: ELF32
+MIPSEL-NEXT: Data: 2's complement, little endian
+MIPSEL-NEXT: Version: 1 (current)
+MIPSEL-NEXT: OS/ABI: UNIX - GNU
+MIPSEL-NEXT: ABI Version: 0x0
+MIPSEL-NEXT: Type: REL (Relocatable file)
+MIPSEL-NEXT: Machine: MIPS R3000
+MIPSEL-NEXT: Version: 0x1
+MIPSEL-NEXT: Entry point address: 0x0
+MIPSEL-NEXT: Start of program headers: 0 (bytes into file)
+MIPSEL-NEXT: Start of section headers: 172 (bytes into file)
+MIPSEL-NEXT: Flags: 0x50001000, o32, mips32
+MIPSEL-NEXT: Size of this header: 52 (bytes)
+MIPSEL-NEXT: Size of program headers: 0 (bytes)
+MIPSEL-NEXT: Number of program headers: 0
+MIPSEL-NEXT: Size of section headers: 40 (bytes)
+MIPSEL-NEXT: Number of section headers: 9
+MIPSEL-NEXT: Section header string table index: 6
diff --git a/llvm/test/tools/llvm-readobj/ELF/gnu-note-size.test b/llvm/test/tools/llvm-readobj/ELF/gnu-note-size.test
new file mode 100644
index 00000000000..ea01d5b7814
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/gnu-note-size.test
@@ -0,0 +1,32 @@
+# RUN: yaml2obj %s > %t
+# RUN: llvm-readelf --notes %t | FileCheck %s --check-prefix=GNU
+# RUN: llvm-readobj --elf-output-style LLVM --notes %t | FileCheck %s --check-prefix=LLVM
+
+# GNU: Owner Data size Description
+# GNU-NEXT: GNU 0x00000004 NT_GNU_ABI_TAG (ABI version tag)
+# GNU-NEXT: <corrupt GNU_ABI_TAG>
+
+# LLVM: Notes [
+# LLVM-NEXT: NoteSection {
+# LLVM-NEXT: Offset:
+# LLVM-NEXT: Size: 0x14
+# LLVM-NEXT: Note {
+# LLVM-NEXT: Owner: GNU
+# LLVM-NEXT: Data size: 0x4
+# LLVM-NEXT: Type: NT_GNU_ABI_TAG (ABI version tag)
+# LLVM-NEXT: ABI: <corrupt GNU_ABI_TAG>
+# LLVM-NEXT: }
+# LLVM-NEXT: }
+# LLVM-NEXT: ]
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .note.ABI-tag
+ Type: SHT_NOTE
+ AddressAlign: 0x0000000000000004
+ Content: 040000000400000001000000474E550000000000
diff --git a/llvm/test/tools/llvm-readobj/ELF/gnu-notes.test b/llvm/test/tools/llvm-readobj/ELF/gnu-notes.test
new file mode 100644
index 00000000000..a625c024b00
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/gnu-notes.test
@@ -0,0 +1,194 @@
+## Test tools are able to dump different types of notes.
+
+# RUN: yaml2obj --docnum=1 %s > %t1.so
+# RUN: llvm-readelf --notes %t1.so | FileCheck %s --check-prefix=GNU --strict-whitespace --match-full-lines
+# RUN: llvm-readobj --notes %t1.so | FileCheck %s --check-prefix=LLVM
+# RUN: llvm-objcopy --strip-sections %t1.so %t1.stripped.so
+# RUN: llvm-readelf --notes %t1.stripped.so | FileCheck %s --check-prefix=GNU-STRIPPED --strict-whitespace --match-full-lines
+# RUN: llvm-readobj --notes %t1.stripped.so | FileCheck %s --check-prefix=LLVM-STRIPPED
+
+# GNU:Displaying notes found at file offset 0x00000078 with length 0x00000020:
+# GNU-NEXT: Owner Data size Description
+# GNU-NEXT: GNU 0x00000010 NT_GNU_ABI_TAG (ABI version tag)
+# GNU-NEXT: OS: Linux, ABI: 2.6.32
+
+# GNU:Displaying notes found at file offset 0x00000098 with length 0x00000020:
+# GNU-NEXT: Owner Data size Description
+# GNU-NEXT: GNU 0x00000010 NT_GNU_BUILD_ID (unique build ID bitstring)
+# GNU-NEXT: Build ID: 4fcb712aa6387724a9f465a32cd8c14b
+
+# GNU:Displaying notes found at file offset 0x000000b8 with length 0x0000001c:
+# GNU-NEXT: Owner Data size Description
+# GNU-NEXT: GNU 0x00000009 NT_GNU_GOLD_VERSION (gold version)
+# GNU-NEXT: Version: gold 1.11
+
+# LLVM: Notes [
+# LLVM-NEXT: NoteSection {
+# LLVM-NEXT: Offset: 0x78
+# LLVM-NEXT: Size: 0x20
+# LLVM-NEXT: Note {
+# LLVM-NEXT: Owner: GNU
+# LLVM-NEXT: Data size: 0x10
+# LLVM-NEXT: Type: NT_GNU_ABI_TAG (ABI version tag)
+# LLVM-NEXT: OS: Linux
+# LLVM-NEXT: ABI: 2.6.32
+# LLVM-NEXT: }
+# LLVM-NEXT: }
+# LLVM-NEXT: NoteSection {
+# LLVM-NEXT: Offset: 0x98
+# LLVM-NEXT: Size: 0x20
+# LLVM-NEXT: Note {
+# LLVM-NEXT: Owner: GNU
+# LLVM-NEXT: Data size: 0x10
+# LLVM-NEXT: Type: NT_GNU_BUILD_ID (unique build ID bitstring)
+# LLVM-NEXT: Build ID: 4fcb712aa6387724a9f465a32cd8c14b
+# LLVM-NEXT: }
+# LLVM-NEXT: }
+# LLVM-NEXT: NoteSection {
+# LLVM-NEXT: Offset: 0xB8
+# LLVM-NEXT: Size: 0x1C
+# LLVM-NEXT: Note {
+# LLVM-NEXT: Owner: GNU
+# LLVM-NEXT: Data size: 0x9
+# LLVM-NEXT: Type: NT_GNU_GOLD_VERSION (gold version)
+# LLVM-NEXT: Version: gold 1.11
+# LLVM-NEXT: }
+# LLVM-NEXT: }
+# LLVM-NEXT: ]
+
+# LLVM-STRIPPED: Notes [
+# LLVM-STRIPPED-NEXT: NoteSection {
+# LLVM-STRIPPED-NEXT: Offset: 0x78
+# LLVM-STRIPPED-NEXT: Size: 0x20
+# LLVM-STRIPPED-NEXT: Note {
+# LLVM-STRIPPED-NEXT: Owner: GNU
+# LLVM-STRIPPED-NEXT: Data size: 0x10
+# LLVM-STRIPPED-NEXT: Type: NT_GNU_BUILD_ID (unique build ID bitstring)
+# LLVM-STRIPPED-NEXT: Build ID: 4fcb712aa6387724a9f465a32cd8c14b
+# LLVM-STRIPPED-NEXT: }
+# LLVM-STRIPPED-NEXT: }
+# LLVM-STRIPPED-NEXT: ]
+
+# GNU-STRIPPED:Displaying notes found at file offset 0x00000078 with length 0x00000020:
+# GNU-STRIPPED-NEXT: Owner Data size Description
+# GNU-STRIPPED-NEXT: GNU 0x00000010 NT_GNU_BUILD_ID (unique build ID bitstring)
+# GNU-STRIPPED-NEXT: Build ID: 4fcb712aa6387724a9f465a32cd8c14b
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .note.ABI-tag
+ Type: SHT_NOTE
+ AddressAlign: 0x0000000000000004
+ Content: 040000001000000001000000474E550000000000020000000600000020000000
+ - Name: .note.gnu.build-id
+ Type: SHT_NOTE
+ Flags: [ SHF_ALLOC ]
+ Address: 0x0000000000400120
+ AddressAlign: 0x0000000000000004
+ Content: 040000001000000003000000474E55004FCB712AA6387724A9F465A32CD8C14B
+ - Name: .note.gnu.gold-version
+ Type: SHT_NOTE
+ AddressAlign: 0x0000000000000004
+ Content: 040000000900000004000000474E5500676F6C6420312E3131000000
+ProgramHeaders:
+ - Type: PT_NOTE
+ FileSize: 0x20
+ Sections:
+ - Section: .note.gnu.build-id
+
+## Test tools report an error if a note section has an invalid offset
+## that goes past the end of file.
+
+# RUN: yaml2obj --docnum=2 %s > %t2.so
+# RUN: not llvm-readelf --notes %t2.so 2>&1 | FileCheck -DFILE=%t2.so %s --check-prefix=ERR1
+# RUN: not llvm-readobj --notes %t2.so 2>&1 | FileCheck -DFILE=%t2.so %s --check-prefix=ERR1
+
+# ERR1: error: '[[FILE]]': SHT_NOTE section [index 1] has invalid offset (0xffff0000) or size (0x0)
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .note
+ Type: SHT_NOTE
+ Notes: []
+ ShOffset: 0xffff0000
+
+## Test tools report an error if a note section has invalid size
+## that goes past the end of file.
+
+# RUN: yaml2obj --docnum=3 %s > %t3.so
+# RUN: not llvm-readelf --notes %t3.so 2>&1 | FileCheck -DFILE=%t3.so %s --check-prefix=ERR2
+# RUN: not llvm-readobj --notes %t3.so 2>&1 | FileCheck -DFILE=%t3.so %s --check-prefix=ERR2
+
+# ERR2: error: '[[FILE]]': SHT_NOTE section [index 1] has invalid offset (0x40) or size (0xffff0000)
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .note
+ Type: SHT_NOTE
+ ShSize: 0xffff0000
+ Notes: []
+
+## Test tools report an error if a note program header has an invalid offset that
+## goes past the end of file.
+
+# RUN: yaml2obj --docnum=4 %s > %t4.so
+# RUN: not llvm-readelf --notes %t4.so 2>&1 | FileCheck -DFILE=%t4.so %s --check-prefix=ERR3
+# RUN: not llvm-readobj --notes %t4.so 2>&1 | FileCheck -DFILE=%t4.so %s --check-prefix=ERR3
+
+# ERR3: error: '[[FILE]]': PT_NOTE header has invalid offset (0xffff0000) or size (0x0)
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_CORE
+ Machine: EM_X86_64
+Sections:
+ - Name: .note
+ Type: SHT_NOTE
+ Notes: []
+ProgramHeaders:
+ - Type: PT_NOTE
+ Offset: 0xffff0000
+ Sections:
+ - Section: .note
+
+## Test tools report an error if a note program header has an invalid size that
+## goes past the end of file.
+
+# RUN: yaml2obj --docnum=5 %s > %t5.so
+# RUN: not llvm-readelf --notes %t5.so 2>&1 | FileCheck -DFILE=%t5.so %s --check-prefix=ERR4
+# RUN: not llvm-readobj --notes %t5.so 2>&1 | FileCheck -DFILE=%t5.so %s --check-prefix=ERR4
+
+# ERR4: error: '[[FILE]]': PT_NOTE header has invalid offset (0x78) or size (0xffff0000)
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_CORE
+ Machine: EM_X86_64
+Sections:
+ - Name: .note
+ Type: SHT_NOTE
+ Notes: []
+ProgramHeaders:
+ - Type: PT_NOTE
+ FileSize: 0xffff0000
+ Sections:
+ - Section: .note
diff --git a/llvm/test/tools/llvm-readobj/ELF/gnu-phdrs.test b/llvm/test/tools/llvm-readobj/ELF/gnu-phdrs.test
new file mode 100644
index 00000000000..cf6ba17259a
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/gnu-phdrs.test
@@ -0,0 +1,97 @@
+#Source :
+#__thread int a = 1;
+#__thread int b;
+#
+#int main () {
+# b = 2;
+# throw (a + b) ;
+# return 0;
+#}
+# compiled as clang++ source.cpp
+# and clang++ -m32 source.cpp
+
+RUN: llvm-readelf -l %p/Inputs/phdrs-elf.exe-i386 \
+RUN: | FileCheck %s -check-prefix ELF32
+RUN: llvm-readelf -l %p/Inputs/phdrs-elf.exe-x86_64 \
+RUN: | FileCheck %s -check-prefixes ELF64-PHDRS,ELF64-MAPPING
+RUN: llvm-readelf -program-headers %p/Inputs/phdrs-elf.exe-x86_64 \
+RUN: | FileCheck %s -check-prefixes ELF64-PHDRS,ELF64-MAPPING
+
+# Check that -section-mapping produces a mapping and not the program headers.
+RUN: llvm-readelf -section-mapping %p/Inputs/phdrs-elf.exe-x86_64 \
+RUN: | FileCheck %s -check-prefix ELF64-MAPPING -implicit-check-not="Program Headers:"
+
+# Check that -section-mapping=false -program-headers produces just program headers.
+RUN: llvm-readelf -section-mapping=false -program-headers %p/Inputs/phdrs-elf.exe-x86_64 \
+RUN: | FileCheck %s -check-prefix ELF64-PHDRS -implicit-check-not="Section to Segment mapping:"
+
+# Check that only one copy of the section/segment mapping table is produced.
+RUN: llvm-readelf -section-mapping -program-headers %p/Inputs/phdrs-elf.exe-x86_64 \
+RUN: | FileCheck %s -check-prefix ELF64-ONEMAPPING
+
+ELF32: Elf file type is EXEC (Executable file)
+ELF32-NEXT: Entry point 0x8048460
+ELF32-NEXT: There are 10 program headers, starting at offset 52
+
+ELF32: Program Headers:
+ELF32-NEXT: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
+ELF32-NEXT: PHDR 0x000034 0x08048034 0x08048034 0x00140 0x00140 R E 0x4
+ELF32-NEXT: INTERP 0x000174 0x08048174 0x08048174 0x00013 0x00013 R 0x1
+ELF32-NEXT: [Requesting program interpreter: /lib/ld-linux.so.2]
+ELF32-NEXT: LOAD 0x000000 0x08048000 0x08048000 0x006d0 0x006d0 R E 0x1000
+ELF32-NEXT: LOAD 0x000ef0 0x08049ef0 0x08049ef0 0x00128 0x00140 RW 0x1000
+ELF32-NEXT: DYNAMIC 0x000f08 0x08049f08 0x08049f08 0x000e8 0x000e8 RW 0x4
+ELF32-NEXT: NOTE 0x000188 0x08048188 0x08048188 0x00044 0x00044 R 0x4
+ELF32-NEXT: TLS 0x000ef0 0x08049ef0 0x08049ef0 0x00004 0x00008 R 0x4
+ELF32-NEXT: GNU_EH_FRAME 0x000640 0x08048640 0x08048640 0x0001c 0x0001c R 0x4
+ELF32-NEXT: GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x4
+ELF32-NEXT: GNU_RELRO 0x000ef0 0x08049ef0 0x08049ef0 0x00110 0x00110 R 0x1
+
+ELF32: Section to Segment mapping:
+ELF32-NEXT: Segment Sections...
+ELF32-NEXT: 00
+ELF32-NEXT: 01 .interp
+ELF32-NEXT: 02 .interp .note.ABI-tag .note.gnu.build-id .hash .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rel.dyn .rel.plt .init .plt .text .fini .rodata .eh_frame_hdr .eh_frame
+ELF32-NEXT: 03 .tdata .ctors .dtors .jcr .dynamic .got .got.plt .data .bss
+ELF32-NEXT: 04 .dynamic
+ELF32-NEXT: 05 .note.ABI-tag .note.gnu.build-id
+ELF32-NEXT: 06 .tdata .tbss
+ELF32-NEXT: 07 .eh_frame_hdr
+ELF32-NEXT: 08
+ELF32-NEXT: 09 .tdata .ctors .dtors .jcr .dynamic .got
+ELF32-NEXT: None .comment .shstrtab .symtab .strtab
+
+ELF64-PHDRS: Elf file type is EXEC (Executable file)
+ELF64-PHDRS-NEXT: Entry point 0x400610
+ELF64-PHDRS-NEXT: There are 10 program headers, starting at offset 64
+
+ELF64-PHDRS: Program Headers:
+ELF64-PHDRS-NEXT: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
+ELF64-PHDRS-NEXT: PHDR 0x000040 0x0000000000400040 0x0000000000400040 0x000230 0x000230 R E 0x8
+ELF64-PHDRS-NEXT: INTERP 0x000270 0x0000000000400270 0x0000000000400270 0x00001c 0x00001c R 0x1
+ELF64-PHDRS-NEXT: [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
+ELF64-PHDRS-NEXT: LOAD 0x000000 0x0000000000400000 0x0000000000400000 0x000924 0x000924 R E 0x200000
+ELF64-PHDRS-NEXT: LOAD 0x000db4 0x0000000000600db4 0x0000000000600db4 0x000274 0x0002a4 RW 0x200000
+ELF64-PHDRS-NEXT: DYNAMIC 0x000dd0 0x0000000000600dd0 0x0000000000600dd0 0x000210 0x000210 RW 0x8
+ELF64-PHDRS-NEXT: NOTE 0x00028c 0x000000000040028c 0x000000000040028c 0x000044 0x000044 R 0x4
+ELF64-PHDRS-NEXT: TLS 0x000db4 0x0000000000600db4 0x0000000000600db4 0x000004 0x000008 R 0x4
+ELF64-PHDRS-NEXT: GNU_EH_FRAME 0x00083c 0x000000000040083c 0x000000000040083c 0x00002c 0x00002c R 0x4
+ELF64-PHDRS-NEXT: GNU_STACK 0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 RW 0x8
+ELF64-PHDRS-NEXT: GNU_RELRO 0x000db4 0x0000000000600db4 0x0000000000600db4 0x00024c 0x00024c R 0x1
+
+ELF64-MAPPING: Section to Segment mapping:
+ELF64-MAPPING-NEXT: Segment Sections...
+ELF64-MAPPING-NEXT: 00
+ELF64-MAPPING-NEXT: 01 .interp
+ELF64-MAPPING-NEXT: 02 .interp .note.ABI-tag .note.gnu.build-id .hash .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt .init .plt .text .fini .rodata .eh_frame_hdr .eh_frame
+ELF64-MAPPING-NEXT: 03 .tdata .init_array .fini_array .jcr .dynamic .got .got.plt .data .bss
+ELF64-MAPPING-NEXT: 04 .dynamic
+ELF64-MAPPING-NEXT: 05 .note.ABI-tag .note.gnu.build-id
+ELF64-MAPPING-NEXT: 06 .tdata .tbss
+ELF64-MAPPING-NEXT: 07 .eh_frame_hdr
+ELF64-MAPPING-NEXT: 08
+ELF64-MAPPING-NEXT: 09 .tdata .init_array .fini_array .jcr .dynamic .got
+ELF64-MAPPING-NEXT: None .comment .shstrtab .symtab .strtab
+
+ELF64-ONEMAPPING: Section to Segment mapping:
+ELF64-ONEMAPPING-NOT: Section to Segment mapping:
diff --git a/llvm/test/tools/llvm-readobj/ELF/gnu-section-mapping-no-phdrs.test b/llvm/test/tools/llvm-readobj/ELF/gnu-section-mapping-no-phdrs.test
new file mode 100644
index 00000000000..f1a23921678
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/gnu-section-mapping-no-phdrs.test
@@ -0,0 +1,5 @@
+RUN: llvm-readelf --section-mapping %p/Inputs/trivial.obj.elf-x86-64 | FileCheck %s
+CHECK: Section to Segment mapping:
+CHECK-NEXT: Segment Sections...
+CHECK-NEXT: None .text .rela.text .data .bss .rodata.str1.1 .note.GNU-stack .shstrtab .symtab .strtab {{$}}
+CHECK-NOT: {{.}}
diff --git a/llvm/test/tools/llvm-readobj/ELF/gnu-section-mapping-no-shdrs.test b/llvm/test/tools/llvm-readobj/ELF/gnu-section-mapping-no-shdrs.test
new file mode 100644
index 00000000000..94f827485a5
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/gnu-section-mapping-no-shdrs.test
@@ -0,0 +1,15 @@
+RUN: llvm-objcopy --strip-sections %p/Inputs/phdrs-elf.exe-x86_64 %t.o
+RUN: llvm-readelf --section-mapping %t.o | FileCheck %s
+CHECK: Section to Segment mapping:
+CHECK-NEXT: Segment Sections...
+CHECK-NEXT: 00 {{$}}
+CHECK-NEXT: 01 {{$}}
+CHECK-NEXT: 02 {{$}}
+CHECK-NEXT: 03 {{$}}
+CHECK-NEXT: 04 {{$}}
+CHECK-NEXT: 05 {{$}}
+CHECK-NEXT: 06 {{$}}
+CHECK-NEXT: 07 {{$}}
+CHECK-NEXT: 08 {{$}}
+CHECK-NEXT: 09 {{$}}
+CHECK-NOT: {{.}}
diff --git a/llvm/test/tools/llvm-readobj/ELF/gnu-sections.test b/llvm/test/tools/llvm-readobj/ELF/gnu-sections.test
new file mode 100644
index 00000000000..c5c67330ef3
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/gnu-sections.test
@@ -0,0 +1,115 @@
+# RUN: yaml2obj --docnum=1 %s -o %t-i386.o
+# RUN: llvm-readelf -S %t-i386.o | FileCheck %s -check-prefix ELF32
+
+# ELF32: There are 8 section headers, starting at offset 0x90:
+# ELF32-EMPTY:
+# ELF32-NEXT: Section Headers:
+# ELF32-NEXT: [Nr] Name Type Address Off Size ES Flg Lk Inf Al
+# ELF32-NEXT: [ 0] NULL 00000000 000000 000000 00 0 0 0
+# ELF32-NEXT: [ 1] .text PROGBITS 00000000 000034 000001 00 AX 0 0 4
+# ELF32-NEXT: [ 2] .rel.text REL 00000000 000038 000000 08 5 1 4
+# ELF32-NEXT: [ 3] .data PROGBITS 00000000 000038 000000 00 WA 0 0 4
+# ELF32-NEXT: [ 4] .bss NOBITS 00000000 000038 000000 00 WA 0 0 4
+# ELF32-NEXT: [ 5] .symtab SYMTAB 00000000 000038 000020 10 6 2 8
+# ELF32-NEXT: [ 6] .strtab STRTAB 00000000 000058 000007 00 0 0 1
+# ELF32-NEXT: [ 7] .shstrtab STRTAB 00000000 00005f 000030 00 0 0 1
+# ELF32-NEXT: Key to Flags:
+# ELF32-NEXT: W (write), A (alloc), X (execute), M (merge), S (strings), l (large)
+# ELF32-NEXT: I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)
+# ELF32-NEXT: O (extra OS processing required) o (OS specific), p (processor specific)
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_386
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 00
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ EntSize: 0x0000000000000008
+ Info: .text
+ Relocations:
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+Symbols:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+
+# RUN: yaml2obj --docnum=2 %s -o %t-x64.o
+# RUN: llvm-readelf -S %t-x64.o | FileCheck %s -check-prefix ELF64
+
+## Check that --wide is the same as -W and ignored and also
+## that --section is the same as -S.
+# RUN: llvm-readobj --wide --sections %t-x64.o --elf-output-style=GNU \
+# RUN: | FileCheck %s -check-prefix ELF64
+# RUN: llvm-readobj -W --sections %t-x64.o --elf-output-style=GNU \
+# RUN: | FileCheck %s -check-prefix ELF64
+# RUN: llvm-readelf -W -S %t-x64.o | FileCheck %s -check-prefix ELF64
+
+# ELF64: There are 8 section headers, starting at offset 0xb0:
+# ELF64-EMPTY:
+# ELF64-NEXT: Section Headers:
+# ELF64-NEXT: [Nr] Name Type Address Off Size ES Flg Lk Inf Al
+# ELF64-NEXT: [ 0] NULL 0000000000000000 000000 000000 00 0 0 0
+# ELF64-NEXT: [ 1] .text PROGBITS 0000000000000000 000040 000001 00 AX 0 0 4
+# ELF64-NEXT: [ 2] .rela.text RELA 0000000000000000 000048 000000 18 5 1 8
+# ELF64-NEXT: [ 3] .data PROGBITS 0000000000000000 000048 000000 00 WA 0 0 4
+# ELF64-NEXT: [ 4] .bss NOBITS 0000000000000000 000048 000000 00 WA 0 0 4
+# ELF64-NEXT: [ 5] .symtab SYMTAB 0000000000000000 000048 000030 18 6 2 8
+# ELF64-NEXT: [ 6] .strtab STRTAB 0000000000000000 000078 000007 00 0 0 1
+# ELF64-NEXT: [ 7] .shstrtab STRTAB 0000000000000000 00007f 000031 00 0 0 1
+# ELF64-NEXT: Key to Flags:
+# ELF64-NEXT: W (write), A (alloc), X (execute), M (merge), S (strings), l (large)
+# ELF64-NEXT: I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)
+# ELF64-NEXT: O (extra OS processing required) o (OS specific), p (processor specific)
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 00
+ - Name: .rela.text
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 0x0000000000000008
+ EntSize: 0x0000000000000018
+ Info: .text
+ Relocations:
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+Symbols:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
diff --git a/llvm/test/tools/llvm-readobj/ELF/gnu-symbols.test b/llvm/test/tools/llvm-readobj/ELF/gnu-symbols.test
new file mode 100644
index 00000000000..3d087ac459b
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/gnu-symbols.test
@@ -0,0 +1,57 @@
+RUN: llvm-readelf --symbols %p/Inputs/symbols-proc-specific.elf-hexagon \
+RUN: | FileCheck %s --check-prefix ELF32
+RUN: llvm-readelf --symbols %p/Inputs/relocs.obj.elf-x86_64 \
+RUN: | FileCheck %s --check-prefix ELF64
+RUN: llvm-readelf --symbols %p/Inputs/gnuhash.so.elf-x86_64 \
+RUN: | FileCheck %s --check-prefixes=SYMTAB,DYN
+RUN: llvm-readelf --dyn-symbols %p/Inputs/gnuhash.so.elf-x86_64 \
+RUN: | FileCheck %s --check-prefixes=NO-SYMTAB,DYN
+RUN: llvm-readelf --symbols --dyn-symbols %p/Inputs/gnuhash.so.elf-x86_64 \
+RUN: | FileCheck %s --check-prefixes=SYMTAB,DYN
+
+ELF32: Symbol table '.symtab' contains 5 entries:
+ELF32-NEXT: Num: Value Size Type Bind Vis Ndx Name
+ELF32-NEXT: 0: 00000000 0 NOTYPE LOCAL DEFAULT UND
+ELF32-NEXT: 1: 00000000 0 FILE LOCAL DEFAULT ABS a.c
+ELF32-NEXT: 2: 00000000 20 FUNC GLOBAL DEFAULT 2 main
+ELF32-NEXT: 3: 00000004 4 OBJECT GLOBAL DEFAULT PRC[0xff03] x
+ELF32-NEXT: 4: 00000000 4 OBJECT GLOBAL DEFAULT 3 y
+
+ELF64: Symbol table '.symtab' contains 6 entries:
+ELF64-NEXT: Num: Value Size Type Bind Vis Ndx Name
+ELF64-NEXT: 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
+ELF64-NEXT: 1: 0000000000000000 0 SECTION LOCAL DEFAULT 1 .text
+ELF64-NEXT: 2: 0000000000000000 0 SECTION LOCAL DEFAULT 3 .data
+ELF64-NEXT: 3: 0000000000000000 0 SECTION LOCAL DEFAULT 4 .bss
+ELF64-NEXT: 4: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND _GLOBAL_OFFSET_TABLE_
+ELF64-NEXT: 5: 0000000000000000 0 TLS GLOBAL DEFAULT UND sym
+
+NO-SYMTAB-NOT: Symbol table '.symtab'
+
+DYN: Symbol table '.dynsym' contains 5 entries:
+DYN-NEXT: Num: Value Size Type Bind Vis Ndx Name
+DYN-NEXT: 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
+DYN-NEXT: 1: 00000000000001b8 0 NOTYPE GLOBAL DEFAULT 4 foo
+DYN-NEXT: 2: 0000000000200268 0 NOTYPE GLOBAL DEFAULT 5 _edata
+DYN-NEXT: 3: 0000000000200268 0 NOTYPE GLOBAL DEFAULT 5 _end
+DYN-NEXT: 4: 0000000000200268 0 NOTYPE GLOBAL DEFAULT 5 __bss_start
+
+DYN-NOT: .dynsym
+NO-SYMTAB-NOT: Symbol table '.symtab'
+
+SYMTAB: Symbol table '.symtab' contains 12 entries:
+SYMTAB-NEXT: Num: Value Size Type Bind Vis Ndx Name
+SYMTAB-NEXT: 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
+SYMTAB-NEXT: 1: 00000000000000e8 0 SECTION LOCAL DEFAULT 1 .gnu.hash
+SYMTAB-NEXT: 2: 0000000000000120 0 SECTION LOCAL DEFAULT 2 .dynsym
+SYMTAB-NEXT: 3: 0000000000000198 0 SECTION LOCAL DEFAULT 3 .dynstr
+SYMTAB-NEXT: 4: 00000000000001b8 0 SECTION LOCAL DEFAULT 4 .eh_frame
+SYMTAB-NEXT: 5: 00000000002001b8 0 SECTION LOCAL DEFAULT 5 .dynamic
+SYMTAB-NEXT: 6: 00000000002001b8 0 OBJECT LOCAL DEFAULT 5 _DYNAMIC
+SYMTAB-NEXT: 7: 0000000000200268 0 OBJECT LOCAL DEFAULT 5 _GLOBAL_OFFSET_TABLE_
+SYMTAB-NEXT: 8: 0000000000200268 0 NOTYPE GLOBAL DEFAULT 5 __bss_start
+SYMTAB-NEXT: 9: 00000000000001b8 0 NOTYPE GLOBAL DEFAULT 4 foo
+SYMTAB-NEXT: 10: 0000000000200268 0 NOTYPE GLOBAL DEFAULT 5 _edata
+SYMTAB-NEXT: 11: 0000000000200268 0 NOTYPE GLOBAL DEFAULT 5 _end
+
+DYN-NOT: .dynsym
diff --git a/llvm/test/tools/llvm-readobj/ELF/gnuhash.test b/llvm/test/tools/llvm-readobj/ELF/gnuhash.test
new file mode 100644
index 00000000000..c7d15dc3153
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/gnuhash.test
@@ -0,0 +1,63 @@
+// Check dumping of the GNU Hash section
+// The input was generated using the following:
+// $ llvm-mc -filetype=obj -triple=i386-pc-linux -o example-i386.o example.s
+// $ llvm-mc -filetype=obj -triple=x86_64-pc-linux -o example-x86_64.o example.s
+// $ llvm-mc -filetype=obj -triple=powerpc-pc-linux -o example-ppc.o example.s
+// $ llvm-mc -filetype=obj -triple=powerpc64-pc-linux -o example-ppc64.o example.s
+// $ ld -shared -m elf_i386 -hash-style=gnu -o gnuhash.so.elf-i386 example-i386.o
+// $ ld -shared -m elf_x86_64 -hash-style=gnu -o gnuhash.so.elf-x86_64 example-x86_64.o
+// $ ld -shared -m elf32ppc -hash-style=gnu -o gnuhash.so.elf-ppc example-ppc.o
+// $ ld -shared -m elf64ppc -hash-style=gnu -o gnuhash.so.elf-ppc64 example-ppc64.o
+// $ cat example.s
+// .globl foo
+// foo:
+
+RUN: llvm-readobj --gnu-hash-table %p/Inputs/gnuhash.so.elf-i386 | FileCheck %s -check-prefix I386
+RUN: llvm-readobj --gnu-hash-table %p/Inputs/gnuhash.so.elf-x86_64 | FileCheck %s -check-prefix X86_64
+RUN: llvm-readobj --gnu-hash-table %p/Inputs/gnuhash.so.elf-ppc | FileCheck %s -check-prefix PPC
+RUN: llvm-readobj --gnu-hash-table %p/Inputs/gnuhash.so.elf-ppc64 | FileCheck %s -check-prefix PPC64
+
+I386: Arch: i386
+I386: GnuHashTable {
+I386-NEXT: Num Buckets: 3
+I386-NEXT: First Hashed Symbol Index: 1
+I386-NEXT: Num Mask Words: 1
+I386-NEXT: Shift Count: 5
+I386-NEXT: Bloom Filter: [0x39004608]
+I386-NEXT: Buckets: [1, 4, 0]
+I386-NEXT: Values: [0xB887388, 0xECD54542, 0x7C92E3BB, 0x1C5871D9]
+I386-NEXT: }
+
+X86_64: Arch: x86_64
+X86_64: GnuHashTable {
+X86_64-NEXT: Num Buckets: 3
+X86_64-NEXT: First Hashed Symbol Index: 1
+X86_64-NEXT: Num Mask Words: 1
+X86_64-NEXT: Shift Count: 6
+X86_64-NEXT: Bloom Filter: [0x800000001204288]
+X86_64-NEXT: Buckets: [1, 4, 0]
+X86_64-NEXT: Values: [0xB887388, 0xECD54542, 0x7C92E3BB, 0x1C5871D9]
+X86_64-NEXT: }
+
+PPC: Arch: powerpc
+PPC: GnuHashTable {
+PPC-NEXT: Num Buckets: 3
+PPC-NEXT: First Hashed Symbol Index: 1
+PPC-NEXT: Num Mask Words: 1
+PPC-NEXT: Shift Count: 5
+PPC-NEXT: Bloom Filter: [0x3D00460A]
+PPC-NEXT: Buckets: [1, 5, 0]
+PPC-NEXT: Values: [0xEEBEC3A, 0xB887388, 0xECD54542, 0x7C92E3BB, 0x1C5871D9]
+PPC-NEXT: }
+
+PPC64: Arch: powerpc64
+PPC64: GnuHashTable {
+PPC64-NEXT: Num Buckets: 3
+PPC64-NEXT: First Hashed Symbol Index: 1
+PPC64-NEXT: Num Mask Words: 1
+PPC64-NEXT: Shift Count: 6
+PPC64-NEXT: Bloom Filter: [0x800000001204288]
+PPC64-NEXT: Buckets: [1, 4, 0]
+PPC64-NEXT: Values: [0xB887388, 0xECD54542, 0x7C92E3BB, 0x1C5871D9]
+PPC64-NEXT: }
+
diff --git a/llvm/test/tools/llvm-readobj/ELF/groups.test b/llvm/test/tools/llvm-readobj/ELF/groups.test
new file mode 100644
index 00000000000..4e165311ecf
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/groups.test
@@ -0,0 +1,82 @@
+## Check that llvm-readelf and llvm-readobj can
+## dump SHT_GROUP sections properly.
+
+# RUN: yaml2obj %s -o %t.o
+# RUN: llvm-readobj -g %t.o | FileCheck %s
+# RUN: llvm-readelf -g %t.o | FileCheck --check-prefix=GNU %s
+
+# CHECK: Groups {
+# CHECK-NEXT: Group {
+# CHECK-NEXT: Name: .group
+# CHECK-NEXT: Index: 1
+# CHECK-NEXT: Link: 7
+# CHECK-NEXT: Info: 1
+# CHECK-NEXT: Type: COMDAT
+# CHECK-NEXT: Signature: foo
+# CHECK-NEXT: Section(s) in group [
+# CHECK-NEXT: .text.foo
+# CHECK-NEXT: .rela.text.foo
+# CHECK-NEXT: ]
+# CHECK-NEXT: }
+# CHECK-NEXT: Group {
+# CHECK-NEXT: Name: .group1
+# CHECK-NEXT: Index: 2
+# CHECK-NEXT: Link: 7
+# CHECK-NEXT: Info: 2
+# CHECK-NEXT: Type: COMDAT
+# CHECK-NEXT: Signature: bar
+# CHECK-NEXT: Section(s) in group [
+# CHECK-NEXT: .text.bar
+# CHECK-NEXT: .rela.text.bar
+# CHECK-NEXT: ]
+# CHECK-NEXT: }
+
+# GNU: COMDAT group section [ 1] `.group' [foo] contains 2 sections:
+# GNU-NEXT: [Index] Name
+# GNU-NEXT: [ 3] .text.foo
+# GNU-NEXT: [ 4] .rela.text.foo
+# GNU: COMDAT group section [ 2] `.group1' [bar] contains 2 sections:
+# GNU-NEXT: [Index] Name
+# GNU-NEXT: [ 5] .text.bar
+# GNU-NEXT: [ 6] .rela.text.bar
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .group
+ Type: SHT_GROUP
+ Link: .symtab
+ Info: foo
+ Members:
+ - SectionOrType: GRP_COMDAT
+ - SectionOrType: .text.foo
+ - SectionOrType: .rela.text.foo
+ - Name: .group1
+ Type: SHT_GROUP
+ Link: .symtab
+ Info: bar
+ Members:
+ - SectionOrType: GRP_COMDAT
+ - SectionOrType: .text.bar
+ - SectionOrType: .rela.text.bar
+ - Name: .text.foo
+ Type: SHT_PROGBITS
+ - Name: .rela.text.foo
+ Type: SHT_RELA
+ Link: .symtab
+ Info: .text.foo
+ - Name: .text.bar
+ Type: SHT_PROGBITS
+ - Name: .rela.text.bar
+ Type: SHT_RELA
+ Link: .symtab
+ Info: .text.bar
+Symbols:
+ - Name: foo
+ Section: .text.foo
+ - Name: bar
+ Section: .text.bar
diff --git a/llvm/test/tools/llvm-readobj/ELF/hash-histogram.test b/llvm/test/tools/llvm-readobj/ELF/hash-histogram.test
new file mode 100644
index 00000000000..e0c29d15abc
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/hash-histogram.test
@@ -0,0 +1,70 @@
+# RUN: llvm-readelf --elf-hash-histogram %p/Inputs/gnuhash.so.elf-ppc64 \
+# RUN: | FileCheck %s -check-prefix PPC64GNU
+# RUN: llvm-readelf --elf-hash-histogram %p/Inputs/gnuhash.so.elf-x86_64 \
+# RUN: | FileCheck %s -check-prefix X86GNU
+# RUN: llvm-readelf --elf-hash-histogram %p/Inputs/got-plt.exe.elf-mipsel \
+# RUN: | FileCheck %s -check-prefix SYSV
+
+# PPC64GNU: Histogram for `.gnu.hash' bucket list length (total of 3 buckets)
+# PPC64GNU-NEXT: Length Number % of total Coverage
+# PPC64GNU-NEXT: 0 1 ( 33.3%) 0.0%
+# PPC64GNU-NEXT: 1 1 ( 33.3%) 25.0%
+# PPC64GNU-NEXT: 2 0 ( 0.0%) 25.0%
+# PPC64GNU-NEXT: 3 1 ( 33.3%) 100.0%
+
+# X86GNU: Histogram for `.gnu.hash' bucket list length (total of 3 buckets)
+# X86GNU-NEXT: Length Number % of total Coverage
+# X86GNU-NEXT: 0 1 ( 33.3%) 0.0%
+# X86GNU-NEXT: 1 1 ( 33.3%) 25.0%
+# X86GNU-NEXT: 2 0 ( 0.0%) 25.0%
+# X86GNU-NEXT: 3 1 ( 33.3%) 100.0%
+
+# SYSV: Histogram for bucket list length (total of 3 buckets)
+# SYSV-NEXT: Length Number % of total Coverage
+# SYSV-NEXT: 0 0 ( 0.0%) 0.0%
+# SYSV-NEXT: 1 0 ( 0.0%) 0.0%
+# SYSV-NEXT: 2 2 ( 66.7%) 57.1%
+# SYSV-NEXT: 3 1 ( 33.3%) 100.0%
+
+## Show that we report a warning for a hash table which contains an entry of
+## the bucket array pointing to a cycle.
+
+# RUN: yaml2obj %s -o %t.o
+# RUN: llvm-readelf --elf-hash-histogram 2>&1 %t.o | FileCheck -DFILE=%t.o %s --check-prefix BROKEN
+
+# BROKEN: warning: '[[FILE]]': .hash section is invalid: bucket 1: a cycle was detected in the linked chain
+# BROKEN: Histogram for bucket list length (total of 1 buckets)
+# BROKEN-NEXT: Length Number % of total Coverage
+# BROKEN-NEXT: 0 0 ( 0.0%) 0.0%
+# BROKEN-NEXT: 1 1 (100.0%) 100.0%
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_386
+Sections:
+ - Name: .hash
+ Type: SHT_HASH
+ Link: .dynsym
+ Bucket: [ 1 ]
+ Chain: [ 0, 1 ]
+ - Name: .dynamic
+ Type: SHT_DYNAMIC
+ Flags: [ SHF_ALLOC ]
+ Entries:
+## llvm-readelf will read the hash table from the file offset
+## p_offset + (p_vaddr - DT_HASH) = p_offset + (0 - 0) = p_offset,
+## which is the start of PT_LOAD, i.e. the file offset of .hash.
+ - Tag: DT_HASH
+ Value: 0x0
+ - Tag: DT_NULL
+ Value: 0
+DynamicSymbols:
+ - Name: foo
+ProgramHeaders:
+ - Type: PT_LOAD
+ Sections:
+ - Section: .hash
+ - Section: .dynamic
diff --git a/llvm/test/tools/llvm-readobj/ELF/hash-symbols.test b/llvm/test/tools/llvm-readobj/ELF/hash-symbols.test
new file mode 100644
index 00000000000..e4515b692eb
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/hash-symbols.test
@@ -0,0 +1,417 @@
+## Check llvm-readelf is able to dump the content of hash sections correctly.
+
+## Check the output when both .hash and .gnu.hash sections are present.
+
+# RUN: yaml2obj --docnum=1 %s -o %t1-32.so
+# RUN: llvm-readelf --hash-symbols %t1-32.so \
+# RUN: | FileCheck %s --strict-whitespace --match-full-lines --check-prefix HASH-32
+
+# HASH-32: Symbol table of .hash for image:
+# HASH-32-NEXT: Num Buc: Value Size Type Bind Vis Ndx Name
+# HASH-32-NEXT: 1 0: 00000000 0 NOTYPE GLOBAL DEFAULT UND ccc
+# HASH-32-NEXT: 5 0: 00001001 0 NOTYPE WEAK DEFAULT 1 bbb
+# HASH-32-NEXT: 3 0: 00000001 0 NOTYPE GLOBAL DEFAULT ABS ddd
+# HASH-32-NEXT: 2 0: 00001000 0 NOTYPE GLOBAL DEFAULT 1 aaa
+# HASH-32-NEXT: 4 0: 00000000 0 NOTYPE GLOBAL DEFAULT 2 eee
+# HASH-32-EMPTY:
+# HASH-32: Symbol table of .gnu.hash for image:
+# HASH-32-NEXT: Num Buc: Value Size Type Bind Vis Ndx Name
+# HASH-32-NEXT: 2 1: 00001000 0 NOTYPE GLOBAL DEFAULT 1 aaa
+# HASH-32-NEXT: 3 1: 00000001 0 NOTYPE GLOBAL DEFAULT ABS ddd
+# HASH-32-NEXT: 4 2: 00000000 0 NOTYPE GLOBAL DEFAULT 2 eee
+# HASH-32-NEXT: 5 2: 00001001 0 NOTYPE WEAK DEFAULT 1 bbb
+# HASH-32-NOT: {{.}}
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_DYN
+ Machine: EM_386
+Sections:
+ - Name: .hash
+ Type: SHT_HASH
+ Flags: [ SHF_ALLOC ]
+ Link: .dynsym
+ Bucket: [ 1, 0, 0 ]
+ Chain: [ 0, 5, 4, 2, 0, 3 ]
+ - Name: .gnu.hash
+ Type: SHT_GNU_HASH
+ Flags: [ SHF_ALLOC ]
+ Link: .dynsym
+ Header:
+ SymNdx: 0x2
+ Shift2: 0x0
+ BloomFilter: [ 0x0 ]
+ HashBuckets: [ 0x0, 0x2, 0x4 ]
+ HashValues: [ 0x0B885C68, 0x0B886991, 0x0B886DF4, 0x0B8860CB ]
+ - Name: .dynamic
+ Type: SHT_DYNAMIC
+ Flags: [ SHF_ALLOC ]
+ Link: .dynstr
+ Entries:
+## PT_LOAD's p_vaddr is 0x0. PT_LOAD's p_offset = 0x1bc. DT_HASH value is 0x0.
+## llvm-readelf will read .hash content from p_offset + (p_vaddr - DT_HASH value) = 0x1bc.
+## This matches the file offset of the .hash section.
+ - Tag: DT_HASH
+ Value: 0x0000000000000000
+ - Tag: DT_GNU_HASH
+## PT_LOAD's p_vaddr is 0x0. PT_LOAD's p_offset = 0x1bc. DT_GNU_HASH value is 0x2c (size of .hash = 0x2c).
+## llvm-readelf will read .gnu.hash content from p_offset + (p_vaddr - DT_GNU_HASH value) = 0x1e8.
+## This matches the file offset of the .gnu.hash section.
+ Value: 0x000000000000002C
+ - Tag: DT_NULL
+ Value: 0x0000000000000000
+DynamicSymbols:
+ - Name: ccc
+ Binding: STB_GLOBAL
+ - Name: aaa
+ Section: .hash
+ Binding: STB_GLOBAL
+ Value: 0x0000000000001000
+ - Name: ddd
+ Index: SHN_ABS
+ Binding: STB_GLOBAL
+ Value: 0x0000000000000001
+ - Name: eee
+ Section: .gnu.hash
+ Binding: STB_GLOBAL
+ - Name: bbb
+ Section: .hash
+ Binding: STB_WEAK
+ Value: 0x0000000000001001
+ProgramHeaders:
+ - Type: PT_LOAD
+ Flags: [ PF_R, PF_X ]
+ Sections:
+ - Section: .hash
+ - Section: .gnu.hash
+ - Section: .dynamic
+
+# RUN: yaml2obj --docnum=2 %s -o %t1-64.so
+# RUN: llvm-readelf --hash-symbols %t1-64.so | FileCheck %s --check-prefix HASH-64
+
+# HASH-64: Symbol table of .hash for image:
+# HASH-64-NEXT: Num Buc: Value Size Type Bind Vis Ndx Name
+# HASH-64-NEXT: 1 0: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND ccc
+# HASH-64-NEXT: 5 0: 0000000000001001 0 NOTYPE WEAK DEFAULT 1 bbb
+# HASH-64-NEXT: 3 0: 0000000000000001 0 NOTYPE GLOBAL DEFAULT ABS ddd
+# HASH-64-NEXT: 2 0: 0000000000001000 0 NOTYPE GLOBAL DEFAULT 1 aaa
+# HASH-64-NEXT: 4 0: 0000000000000000 0 NOTYPE GLOBAL DEFAULT 2 eee
+# HASH-64-EMPTY:
+# HASH-64-NEXT: Symbol table of .gnu.hash for image:
+# HASH-64-NEXT: Num Buc: Value Size Type Bind Vis Ndx Name
+# HASH-64-NEXT: 2 1: 0000000000001000 0 NOTYPE GLOBAL DEFAULT 1 aaa
+# HASH-64-NEXT: 3 1: 0000000000000001 0 NOTYPE GLOBAL DEFAULT ABS ddd
+# HASH-64-NEXT: 4 2: 0000000000000000 0 NOTYPE GLOBAL DEFAULT 2 eee
+# HASH-64-NEXT: 5 2: 0000000000001001 0 NOTYPE WEAK DEFAULT 1 bbb
+# HASH-64-NOT: {{.}}
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_DYN
+ Machine: EM_X86_64
+Sections:
+ - Name: .hash
+ Type: SHT_HASH
+ Flags: [ SHF_ALLOC ]
+ Link: .dynsym
+ Bucket: [ 1, 0, 0 ]
+ Chain: [ 0, 5, 4, 2, 0, 3 ]
+ - Name: .gnu.hash
+ Type: SHT_GNU_HASH
+ Flags: [ SHF_ALLOC ]
+ Link: .dynsym
+ Header:
+ SymNdx: 0x2
+ Shift2: 0x0
+ BloomFilter: [ 0x0 ]
+ HashBuckets: [ 0x00000000, 0x00000002, 0x00000004 ]
+ HashValues: [ 0x0B885C68, 0x0B886991, 0x0B886DF4, 0x0B8860CB ]
+ - Name: .dynamic
+ Type: SHT_DYNAMIC
+ Flags: [ SHF_ALLOC ]
+ Link: .dynstr
+ Entries:
+ - Tag: DT_HASH
+## PT_LOAD's p_vaddr is 0x0. PT_LOAD's p_offset = 0x2b8. DT_HASH value is 0x0.
+## llvm-readelf will read .hash content from p_offset + (p_vaddr - DT_HASH value) = 0x2b8.
+## This matches the file offset of the .hash section.
+ Value: 0x0000000000000000
+ - Tag: DT_GNU_HASH
+## PT_LOAD's p_vaddr is 0x0. PT_LOAD's p_offset = 0x2b8. DT_GNU_HASH value is 0x2c (size of .hash = 0x2c).
+## llvm-readelf will read .gnu.hash content from p_offset + (p_vaddr - DT_GNU_HASH value) = 0x2e4.
+## This matches the file offset of the .gnu.hash section.
+ Value: 0x000000000000002c
+ - Tag: DT_NULL
+ Value: 0x0000000000000000
+DynamicSymbols:
+ - Name: ccc
+ Binding: STB_GLOBAL
+ - Name: aaa
+ Section: .hash
+ Binding: STB_GLOBAL
+ Value: 0x0000000000001000
+ - Name: ddd
+ Index: SHN_ABS
+ Binding: STB_GLOBAL
+ Value: 0x0000000000000001
+ - Name: eee
+ Section: .gnu.hash
+ Binding: STB_GLOBAL
+ - Name: bbb
+ Section: .hash
+ Binding: STB_WEAK
+ Value: 0x0000000000001001
+ProgramHeaders:
+ - Type: PT_LOAD
+ Flags: [ PF_R, PF_X ]
+ Sections:
+ - Section: .hash
+ - Section: .gnu.hash
+ - Section: .dynamic
+
+## Check the output when only .hash section is present.
+
+# RUN: yaml2obj --docnum=3 %s -o %t2-32.so
+# RUN: llvm-readelf --hash-symbols %t2-32.so \
+# RUN: | FileCheck %s --strict-whitespace --match-full-lines --check-prefix ONLY-HASH-32
+
+# ONLY-HASH-32: Symbol table of .hash for image:
+# ONLY-HASH-32-NEXT: Num Buc: Value Size Type Bind Vis Ndx Name
+# ONLY-HASH-32-NEXT: 1 0: 00000000 0 NOTYPE GLOBAL DEFAULT UND ccc
+# ONLY-HASH-32-NEXT: 5 0: 00001001 0 NOTYPE WEAK DEFAULT 1 bbb
+# ONLY-HASH-32-NEXT: 3 0: 00000001 0 NOTYPE GLOBAL DEFAULT ABS ddd
+# ONLY-HASH-32-NEXT: 2 0: 00001000 0 NOTYPE GLOBAL DEFAULT 1 aaa
+# ONLY-HASH-32-NEXT: 4 0: 00000000 0 NOTYPE GLOBAL DEFAULT 2 eee
+# ONLY-HASH-32-NOT: {{.}}
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_DYN
+ Machine: EM_386
+Sections:
+ - Name: .hash
+ Type: SHT_HASH
+ Flags: [ SHF_ALLOC ]
+ Link: .dynsym
+ Bucket: [ 1, 0, 0 ]
+ Chain: [ 0, 5, 4, 2, 0, 3 ]
+ - Name: .dynamic
+ Type: SHT_DYNAMIC
+ Flags: [ SHF_ALLOC ]
+ Link: .dynstr
+ Entries:
+ - Tag: DT_HASH
+ Value: 0x0000000000000000
+ - Tag: DT_NULL
+ Value: 0x0000000000000000
+DynamicSymbols:
+ - Name: ccc
+ Binding: STB_GLOBAL
+ - Name: aaa
+ Section: .hash
+ Binding: STB_GLOBAL
+ Value: 0x0000000000001000
+ - Name: ddd
+ Index: SHN_ABS
+ Binding: STB_GLOBAL
+ Value: 0x0000000000000001
+ - Name: eee
+ Section: .dynamic
+ Binding: STB_GLOBAL
+ - Name: bbb
+ Section: .hash
+ Binding: STB_WEAK
+ Value: 0x0000000000001001
+ProgramHeaders:
+ - Type: PT_LOAD
+ Flags: [ PF_R, PF_X ]
+ Sections:
+ - Section: .hash
+ - Section: .dynamic
+
+## Check the output when only .gnu.hash section is present.
+
+# RUN: yaml2obj --docnum=4 %s -o %t3-32.so
+# RUN: llvm-readelf --hash-symbols %t3-32.so \
+# RUN: | FileCheck %s --strict-whitespace --match-full-lines --check-prefix ONLY-GNUHASH-32
+
+# ONLY-GNUHASH-32: Symbol table of .gnu.hash for image:
+# ONLY-GNUHASH-32-NEXT: Num Buc: Value Size Type Bind Vis Ndx Name
+# ONLY-GNUHASH-32-NEXT: 2 1: 00001000 0 NOTYPE GLOBAL DEFAULT 2 aaa
+# ONLY-GNUHASH-32-NEXT: 3 1: 00000001 0 NOTYPE GLOBAL DEFAULT ABS ddd
+# ONLY-GNUHASH-32-NEXT: 4 2: 00000000 0 NOTYPE GLOBAL DEFAULT 1 eee
+# ONLY-GNUHASH-32-NEXT: 5 2: 00001001 0 NOTYPE WEAK DEFAULT 2 bbb
+# ONLY-GNUHASH-32-NOT: {{.}}
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_DYN
+ Machine: EM_386
+Sections:
+ - Name: .gnu.hash
+ Type: SHT_GNU_HASH
+ Flags: [ SHF_ALLOC ]
+ Link: .dynsym
+ Header:
+ SymNdx: 0x2
+ Shift2: 0x0
+ BloomFilter: [ 0x0 ]
+ HashBuckets: [ 0x0, 0x2, 0x4 ]
+ HashValues: [ 0x0B885C68, 0x0B886991, 0x0B886DF4, 0x0B8860CB ]
+ - Name: .dynamic
+ Type: SHT_DYNAMIC
+ Flags: [ SHF_ALLOC ]
+ Link: .dynstr
+ Entries:
+ - Tag: DT_GNU_HASH
+ Value: 0x0000000000000000
+ - Tag: DT_NULL
+ Value: 0x0000000000000000
+DynamicSymbols:
+ - Name: ccc
+ Binding: STB_GLOBAL
+ - Name: aaa
+ Section: .dynamic
+ Binding: STB_GLOBAL
+ Value: 0x0000000000001000
+ - Name: ddd
+ Index: SHN_ABS
+ Binding: STB_GLOBAL
+ Value: 0x0000000000000001
+ - Name: eee
+ Section: .gnu.hash
+ Binding: STB_GLOBAL
+ - Name: bbb
+ Section: .dynamic
+ Binding: STB_WEAK
+ Value: 0x0000000000001001
+ProgramHeaders:
+ - Type: PT_LOAD
+ Flags: [ PF_R, PF_X ]
+ Sections:
+ - Section: .gnu.hash
+ - Section: .dynamic
+
+## Show that if there are no hash sections, we do not print anything.
+# RUN: yaml2obj --docnum=5 %s -o %t4.so
+# RUN: llvm-readelf --hash-symbols %t4.so \
+# RUN: | FileCheck %s --check-prefix NO-HASH --allow-empty
+
+# NO-HASH-NOT: {{.}}
+
+## Sanity check that we can still find the dynamic symbols (i.e. the above test
+## doesn't pass due to a mistake in the dynamic section).
+# RUN: llvm-readelf --dyn-symbols %t4.so | FileCheck %s --check-prefix DYNSYMS
+
+# DYNSYMS: Symbol table '.dynsym' contains 2 entries:
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_DYN
+ Machine: EM_X86_64
+Sections:
+ - Name: .dynstr
+ Type: SHT_STRTAB
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 0x100
+ EntSize: 0x1
+ - Name: .dynsym
+ Type: SHT_DYNSYM
+ Flags: [ SHF_ALLOC ]
+ Link: .dynstr
+ Address: 0x100
+ AddressAlign: 0x100
+ EntSize: 0x18
+ - Name: .dynamic
+ Type: SHT_DYNAMIC
+ Flags: [ SHF_ALLOC ]
+ Address: 0x0000000000001000
+ Link: .dynstr
+ AddressAlign: 0x0000000000001000
+ EntSize: 0x0000000000000010
+ Entries:
+ - Tag: DT_STRTAB
+ Value: 0x0000000000000000
+ - Tag: DT_STRSZ
+ Value: 0x0000000000000009
+ - Tag: DT_SYMTAB
+ Value: 0x0000000000000100
+ - Tag: DT_SYMENT
+ Value: 0x0000000000000018
+ - Tag: DT_NULL
+ Value: 0x0000000000000000
+ - Name: .text.foo
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR, SHF_GROUP ]
+ Size: 0x40
+ Address: 0x2000
+ AddressAlign: 0x2000
+DynamicSymbols:
+ - Name: _Z3fooi
+ Binding: STB_GLOBAL
+ProgramHeaders:
+ - Type: PT_LOAD
+ Flags: [ PF_R, PF_X ]
+ VAddr: 0x0
+ PAddr: 0x0
+ Sections:
+ - Section: .dynsym
+ - Section: .dynstr
+ - Section: .dynamic
+ - Section: .text.foo
+ - Type: PT_DYNAMIC
+ Flags: [ PF_R ]
+ VAddr: 0x1000
+ PAddr: 0x1000
+ Sections:
+ - Section: .dynamic
+
+## Show that we report a warning for a hash table which contains an entry of
+## the bucket array pointing to a cycle.
+
+# RUN: yaml2obj --docnum=6 %s -o %t6.so
+# RUN: llvm-readelf --hash-symbols %t6.so 2>&1 | FileCheck %s -DFILE=%t6.so --check-prefix=BROKEN
+
+# BROKEN: Symbol table of .hash for image:
+# BROKEN-NEXT: Num Buc: Value Size Type Bind Vis Ndx Name
+# BROKEN-NEXT: 1 0: 00000000 0 NOTYPE LOCAL DEFAULT UND aaa
+# BROKEN: warning: '[[FILE]]': .hash section is invalid: bucket 1: a cycle was detected in the linked chain
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_DYN
+ Machine: EM_386
+Sections:
+ - Name: .hash
+ Type: SHT_HASH
+ Link: .dynsym
+ Bucket: [ 1 ]
+ Chain: [ 1, 1 ]
+ - Name: .dynamic
+ Type: SHT_DYNAMIC
+ Entries:
+## llvm-readelf will read the hash table from the file offset
+## p_offset + (p_vaddr - DT_HASH) = p_offset + (0 - 0) = p_offset,
+## which is the start of PT_LOAD, i.e. the file offset of .hash.
+ - Tag: DT_HASH
+ Value: 0x0
+DynamicSymbols:
+ - Name: aaa
+ - Name: bbb
+ProgramHeaders:
+ - Type: PT_LOAD
+ Sections:
+ - Section: .hash
+ - Section: .dynamic
diff --git a/llvm/test/tools/llvm-readobj/ELF/headers.test b/llvm/test/tools/llvm-readobj/ELF/headers.test
new file mode 100644
index 00000000000..cc05ece49fb
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/headers.test
@@ -0,0 +1,5 @@
+RUN: llvm-readelf -e %p/Inputs/trivial.obj.elf-i386 > %t.e
+RUN: llvm-readelf --headers %p/Inputs/trivial.obj.elf-i386 > %t.headers
+RUN: llvm-readelf -h -l -S %p/Inputs/trivial.obj.elf-i386 > %t.hlS
+RUN: cmp %t.e %t.headers
+RUN: cmp %t.e %t.hlS
diff --git a/llvm/test/tools/llvm-readobj/ELF/hex-dump-multi.s b/llvm/test/tools/llvm-readobj/ELF/hex-dump-multi.s
new file mode 100644
index 00000000000..33ef534e81e
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/hex-dump-multi.s
@@ -0,0 +1,21 @@
+# REQUIRES: x86-registered-target
+
+# RUN: llvm-mc -filetype=obj -triple x86_64 %s -o %t.o
+# RUN: llvm-readobj -x .a -x .b %t.o | FileCheck %s
+# RUN: llvm-readelf -x .a -x .b %t.o | FileCheck %s
+
+# CHECK: Hex dump of section '.a':
+# CHECK-NEXT: 0x00000000 00
+# CHECK-EMPTY:
+# CHECK-NEXT: Hex dump of section '.b':
+# CHECK-NEXT: 0x00000000 01
+# CHECK-EMPTY:
+# CHECK-NEXT: Hex dump of section '.a':
+# CHECK-NEXT: 0x00000000 02
+
+.section .a,"a",@progbits,unique,0
+.byte 0
+.section .b,"a",@progbits
+.byte 1
+.section .a,"a",@progbits,unique,1
+.byte 2
diff --git a/llvm/test/tools/llvm-readobj/ELF/hidden-versym.test b/llvm/test/tools/llvm-readobj/ELF/hidden-versym.test
new file mode 100644
index 00000000000..0dcee4ab09d
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/hidden-versym.test
@@ -0,0 +1,42 @@
+# RUN: yaml2obj %s -o %t
+# RUN: llvm-readelf -V %t | FileCheck %s --check-prefix=HIDDEN
+
+# HIDDEN: Version symbols section '.gnu.version' contains 2 entries:
+# HIDDEN-NEXT: Addr: 0000000000200210 Offset: 0x000040 Link: 5 (.dynsym)
+# HIDDEN-NEXT: 000: 0 (*local*) 3h(hiddensym)
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+ Entry: 0x0000000000201000
+Sections:
+ - Name: .gnu.version
+ Type: SHT_GNU_versym
+ Flags: [ SHF_ALLOC ]
+ Address: 0x0000000000200210
+ Link: .dynsym
+ AddressAlign: 0x0000000000000002
+ EntSize: 0x0000000000000002
+ Entries: [ 0, 0x8003 ]
+ - Name: .gnu.version_r
+ Type: SHT_GNU_verneed
+ Flags: [ SHF_ALLOC ]
+ Address: 0x0000000000200250
+ Link: .dynstr
+ AddressAlign: 0x0000000000000004
+ Info: 0x0000000000000001
+ Dependencies:
+ - Version: 1
+ File: somefile
+ Entries:
+ - Name: hiddensym
+ Hash: 1234
+ Flags: 0
+ Other: 3
+DynamicSymbols:
+ - Name: h
+ Binding: STB_GLOBAL
+...
diff --git a/llvm/test/tools/llvm-readobj/ELF/invalid-shstrndx.test b/llvm/test/tools/llvm-readobj/ELF/invalid-shstrndx.test
new file mode 100644
index 00000000000..f57f7e83c9a
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/invalid-shstrndx.test
@@ -0,0 +1,26 @@
+# RUN: yaml2obj %s -o %t
+# RUN: not llvm-readelf --headers -S 2>&1 %t | FileCheck %s -DFILE=%t --check-prefix=GNU
+# RUN: not llvm-readobj --headers -S 2>&1 %t | FileCheck %s -DFILE=%t --check-prefix=LLVM
+
+# GNU: ELF Header:
+# GNU: Section header string table index: 255
+# GNU-NEXT: There are 3 section headers, starting at offset 0x58:
+# GNU: Section Headers:
+# GNU-NEXT: [Nr] Name
+# GNU-EMPTY:
+# GNU-NEXT: error: '[[FILE]]': section header string table index 255 does not exist
+
+# LLVM: ElfHeader {
+# LLVM: StringTableSectionIndex: 255
+# LLVM-NEXT: }
+# LLVM-NEXT: Sections [
+# LLVM-EMPTY:
+# LLVM-NEXT: error: '[[FILE]]': section header string table index 255 does not exist
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+ SHStrNdx: 0xFF
diff --git a/llvm/test/tools/llvm-readobj/ELF/linker-options.test b/llvm/test/tools/llvm-readobj/ELF/linker-options.test
new file mode 100644
index 00000000000..488f2b16f2d
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/linker-options.test
@@ -0,0 +1,59 @@
+## Check that we can use the --elf-linker-options option
+## to dump SHT_LLVM_LINKER_OPTIONS sections.
+
+# RUN: yaml2obj --docnum=1 %s -o %t1
+# RUN: llvm-readobj --elf-linker-options %t1 2>&1 | FileCheck %s --check-prefix=CHECK -DFILE=%t1
+
+# CHECK: LinkerOptions [
+# CHECK: option 0: value 0
+# CHECK: option 1: value 1
+# CHECK-EMPTY:
+# CHECK-NEXT: warning: '[[FILE]]': SHT_LLVM_LINKER_OPTIONS section at index 2 is broken: an incomplete key-value pair was found. The last possible key was: "c"
+# CHECK-EMPTY:
+# CHECK-NEXT: warning: '[[FILE]]': SHT_LLVM_LINKER_OPTIONS section at index 4 is broken: the content is not null-terminated
+# CHECK-NEXT: option 3: value 3
+# CHECK-NEXT: ]
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+## Case 1: a correct case.
+ - Name: .linker-options.valid1
+ Type: SHT_LLVM_LINKER_OPTIONS
+ Options:
+ - Name: option 0
+ Value: value 0
+ - Name: option 1
+ Value: value 1
+## Case 2: check we do not attempt to dump data from outside the SHT_LLVM_LINKER_OPTIONS section
+## when it contains an incomplete key-value pair.
+ - Name: .linker-options.incomplete
+ Type: SHT_LLVM_LINKER_OPTIONS
+ Content: "610062006300" ## 'a', '\0', 'b', '\0', 'c', '\0'
+ - Type: Fill
+ Pattern: "FF"
+ Size: "1"
+## Case 3: in case of an empty section we dump nothing.
+ - Name: .linker-options.empty
+ Type: SHT_LLVM_LINKER_OPTIONS
+ Content: ""
+## Case 4: check we do not attempt to dump data from outside the SHT_LLVM_LINKER_OPTIONS section
+## when it is not null-terminated.
+ - Name: .linker-options.nonul
+ Type: SHT_LLVM_LINKER_OPTIONS
+ Content: "61"
+## Case 5: another correct case to show we do not stop dumping after reporting a warning.
+ - Name: .linker-options.valid2
+ Type: SHT_LLVM_LINKER_OPTIONS
+ Options:
+ - Name: option 3
+ Value: value 3
+
+## llvm-readelf doesn't support --elf-linker-options yet.
+# RUN: llvm-readelf --elf-linker-options %t1 2>&1 | FileCheck %s --check-prefix=READELF
+
+# READELF: printELFLinkerOptions not implemented!
diff --git a/llvm/test/tools/llvm-readobj/ELF/loadname.test b/llvm/test/tools/llvm-readobj/ELF/loadname.test
new file mode 100644
index 00000000000..d12076fd46c
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/loadname.test
@@ -0,0 +1,50 @@
+## Check we are able to dump library soname properly.
+
+# RUN: yaml2obj %s -o %t.o
+# RUN: llvm-readobj %t.o | FileCheck %s --check-prefix LLVM
+# RUN: llvm-readelf --dynamic-table %t.o | FileCheck %s --check-prefix GNU
+
+# LLVM: Format: ELF64-x86-64
+# LLVM-NEXT: Arch: x86_64
+# LLVM-NEXT: AddressSize: 64bit
+# LLVM-NEXT: LoadName: test.so
+
+# GNU: Dynamic section at offset 0x80 contains 4 entries:
+# GNU-NEXT: Tag Type Name/Value
+# GNU-NEXT: 0x0000000000000005 (STRTAB) 0x0
+# GNU-NEXT: 0x000000000000000a (STRSZ) 7 (bytes)
+# GNU-NEXT: 0x000000000000000e (SONAME) Library soname: [test.so]
+# GNU-NEXT: 0x0000000000000000 (NULL) 0x0
+
+!ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .dynstr
+ Type: SHT_STRTAB
+ Flags: [ SHF_ALLOC ]
+ Content: '746573742e736f00' ## "test.so"
+ - Name: .dynamic
+ Type: SHT_DYNAMIC
+ Flags: [ SHF_ALLOC ]
+ Link: .dynstr
+ Entries:
+ - Tag: DT_STRTAB
+ Value: 0x0000000000000000
+ - Tag: DT_STRSZ
+ Value: 0x0000000000000007
+ - Tag: DT_SONAME
+ Value: 0x0000000000000000
+ - Tag: DT_NULL
+ Value: 0x0000000000000000
+ProgramHeaders:
+ - Type: PT_LOAD
+ Flags: [ PF_R ]
+ VAddr: 0x0000
+ PAddr: 0x0000
+ Sections:
+ - Section: .dynstr
+ - Section: .dynamic
diff --git a/llvm/test/tools/llvm-readobj/ELF/machine-specific-section-types.test b/llvm/test/tools/llvm-readobj/ELF/machine-specific-section-types.test
new file mode 100644
index 00000000000..e564bf19987
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/machine-specific-section-types.test
@@ -0,0 +1,95 @@
+# Show that all machine-specific section types are properly printed for both LLVM and
+# GNU styles for ELF files with that machine type.
+
+# RUN: yaml2obj %s --docnum=1 -o %t-arm.o
+# RUN: llvm-readobj --section-headers %t-arm.o | FileCheck %s --check-prefix=ARM-LLVM
+# RUN: llvm-readelf --section-headers %t-arm.o | FileCheck %s --check-prefix=ARM-GNU
+
+# RUN: yaml2obj %s --docnum=2 -o %t-x86_64.o
+# RUN: llvm-readobj --section-headers %t-x86_64.o | FileCheck %s --check-prefix=X86-LLVM
+# RUN: llvm-readelf --section-headers %t-x86_64.o | FileCheck %s --check-prefix=X86-GNU
+
+# RUN: yaml2obj %s --docnum=3 -o %t-mips.o
+# RUN: llvm-readobj --section-headers %t-mips.o | FileCheck %s --check-prefix=MIPS-LLVM
+# RUN: llvm-readelf --section-headers %t-mips.o | FileCheck %s --check-prefix=MIPS-GNU
+
+# ARM-LLVM: Name: exidx
+# ARM-LLVM: Type: SHT_ARM_EXIDX
+# ARM-LLVM: Name: preemptmap
+# ARM-LLVM: Type: SHT_ARM_PREEMPTMAP
+# ARM-LLVM: Name: attributes
+# ARM-LLVM: Type: SHT_ARM_ATTRIBUTES
+# ARM-LLVM: Name: debugoverlay
+# ARM-LLVM: Type: SHT_ARM_DEBUGOVERLAY
+# ARM-LLVM: Name: overlaysection
+# ARM-LLVM: Type: SHT_ARM_OVERLAYSECTION
+
+# ARM-GNU: exidx ARM_EXIDX
+# ARM-GNU: preemptmap ARM_PREEMPTMAP
+# ARM-GNU: attributes ARM_ATTRIBUTES
+# ARM-GNU: debugoverlay ARM_DEBUGOVERLAY
+# ARM-GNU: overlaysection ARM_OVERLAYSECTION
+
+# X86-LLVM: Name: unwind
+# X86-LLVM: Type: SHT_X86_64_UNWIND
+
+# X86-GNU: unwind X86_64_UNWIND
+
+# MIPS-LLVM: Name: reginfo
+# MIPS-LLVM: Type: SHT_MIPS_REGINFO
+# MIPS-LLVM: Name: options
+# MIPS-LLVM: Type: SHT_MIPS_OPTIONS
+# MIPS-LLVM: Name: abiflags
+# MIPS-LLVM: Type: SHT_MIPS_ABIFLAGS
+# MIPS-LLVM: Name: dwarf
+# MIPS-LLVM: Type: SHT_MIPS_DWARF
+
+# MIPS-GNU: reginfo MIPS_REGINFO
+# MIPS-GNU: options MIPS_OPTIONS
+# MIPS-GNU: abiflags MIPS_ABIFLAGS
+# MIPS-GNU: dwarf MIPS_DWARF
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+Sections:
+ - Name: exidx
+ Type: SHT_ARM_EXIDX
+ - Name: preemptmap
+ Type: SHT_ARM_PREEMPTMAP
+ - Name: attributes
+ Type: SHT_ARM_ATTRIBUTES
+ - Name: debugoverlay
+ Type: SHT_ARM_DEBUGOVERLAY
+ - Name: overlaysection
+ Type: SHT_ARM_OVERLAYSECTION
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: unwind
+ Type: SHT_X86_64_UNWIND
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+Sections:
+ - Name: reginfo
+ Type: SHT_MIPS_REGINFO
+ - Name: options
+ Type: SHT_MIPS_OPTIONS
+ - Name: abiflags
+ Type: SHT_MIPS_ABIFLAGS
+ ISA: MIPS64
+ - Name: dwarf
+ Type: SHT_MIPS_DWARF
diff --git a/llvm/test/tools/llvm-readobj/ELF/malformed-pt-dynamic.test b/llvm/test/tools/llvm-readobj/ELF/malformed-pt-dynamic.test
new file mode 100644
index 00000000000..a6aa2915aa4
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/malformed-pt-dynamic.test
@@ -0,0 +1,47 @@
+# If the offset and/or size fields of the PT_DYNAMIC field become corrupted,
+# we should report a sensible message.
+
+# Creating such a malformed file is hard. The easiest way to simulate it is to
+# truncate the file. Note that the section headers must first be stripped or
+# llvm-readobj will fail to parse the file due to the section header table
+# offset pointing outside the file.
+
+# RUN: yaml2obj %s -o %t.base
+# RUN: llvm-objcopy --strip-sections %t.base %t.stripped
+
+# Test case where the size is too large to fit in the file, but the start is
+# within the file.
+# RUN: cp %t.stripped %t.truncated1
+# RUN: %python -c "with open(r'%t.truncated1', 'r+') as f: f.truncate(0x1001)"
+# RUN: llvm-readobj %t.truncated1 --dynamic-table 2>&1 | FileCheck -DFILE=%t.truncated1 %s
+
+# Test case where the offset is too large to be in the file.
+# RUN: cp %t.stripped %t.truncated2
+# RUN: %python -c "with open(r'%t.truncated2', 'r+') as f: f.truncate(0xFFF)"
+# RUN: llvm-readobj %t.truncated2 --dynamic-table 2>&1 | FileCheck -DFILE=%t.truncated2 %s
+
+# CHECK: warning: '[[FILE]]': PT_DYNAMIC segment offset + size exceeds the size of the file
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .dynamic
+ Type: SHT_DYNAMIC
+ Address: 0x1000
+ AddressAlign: 0x1000
+ Entries:
+ - Tag: DT_NULL
+ Value: 0
+ProgramHeaders:
+ - Type: PT_LOAD
+ VAddr: 0x1000
+ Sections:
+ - Section: .dynamic
+ - Type: PT_DYNAMIC
+ VAddr: 0x1000
+ Sections:
+ - Section: .dynamic
diff --git a/llvm/test/tools/llvm-readobj/ELF/many-sections.s b/llvm/test/tools/llvm-readobj/ELF/many-sections.s
new file mode 100644
index 00000000000..ae7ce34706c
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/many-sections.s
@@ -0,0 +1,57 @@
+## Here we simulate an object with more than ~65k sections and check how we dump it.
+## When an ELF object has SHN_LORESERVE (0xff00) or more sections, its e_shnum field
+## should be zero and sh_size of the section header at index 0 is used
+## to store the value. If the section name string table section index is
+## greater than or equal to SHN_LORESERVE, then e_shstrndx field
+## should have the value of SHN_XINDEX and sh_link of the section header
+## at index 0 is used to store the value.
+
+# RUN: yaml2obj --docnum=1 %s -o %t1
+# RUN: llvm-readelf --file-headers -S %t1 | FileCheck %s --check-prefix=GNU1
+# GNU1: Number of section headers: 0 (3)
+# GNU1: Section header string table index: 65535 (2)
+# GNU1: There are 3 section headers, starting at offset 0x58
+
+# RUN: llvm-readobj --file-headers %t1 | FileCheck %s --check-prefix=LLVM1
+# LLVM1: SectionHeaderCount: 0 (3)
+# LLVM1: StringTableSectionIndex: 65535 (2)
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+ SHNum: 0
+ SHStrNdx: 0xffff ## SHN_XINDEX
+Sections:
+ - Type: SHT_NULL
+ Link: .shstrtab
+ Size: 0x3
+
+## Another case is when e_shoff field set to zero, but not e_shstrndx.
+## We want to show that this corrupt case is handled correctly.
+
+# RUN: yaml2obj --docnum=2 %s -o %t2
+
+# RUN: llvm-readelf --file-headers %t2 | FileCheck %s --check-prefix=GNU2
+# GNU2: Number of section headers: 0
+# GNU2: Section header string table index: 65535 (corrupt: out of range)
+
+# RUN: llvm-readobj --file-headers %t2 | FileCheck %s --check-prefix=LLVM2
+# LLVM2: SectionHeaderCount: 0
+# LLVM2: StringTableSectionIndex: 65535 (corrupt: out of range)
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+ SHOff: 0
+ SHNum: 0
+ SHStrNdx: 0xffff ## SHN_XINDEX
+Sections:
+ - Type: SHT_NULL
+ Link: .shstrtab
+ Size: 0x3
diff --git a/llvm/test/tools/llvm-readobj/ELF/many-sections2.s b/llvm/test/tools/llvm-readobj/ELF/many-sections2.s
new file mode 100644
index 00000000000..60c42faea39
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/many-sections2.s
@@ -0,0 +1,24 @@
+# Tests that symbols whose section index is SHN_XINDEX are displayed
+# correctly. They should not be treated as processor/OS specific or
+# reserved.
+# REQUIRES: x86-registered-target
+# RUN: llvm-mc %s -filetype=obj -triple=x86_64-pc-linux -o %t
+# RUN: llvm-readelf -s %t | FileCheck %s
+
+.irp i, 0, 1, 2, 3, 4, 5, 6,
+ .irp j, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
+ .irp k, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
+ .irp l, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
+ .irp q, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
+ .section sec_\i\j\k\l\q
+ .globl sym_\i\j\k\l\q
+ sym_\i\j\k\l\q:
+ .endr
+ .endr
+ .endr
+ .endr
+.endr
+
+# CHECK: 65278: 0000000000000000 0 NOTYPE GLOBAL DEFAULT 65280 sym_65277
+# CHECK: 65310: 0000000000000000 0 NOTYPE GLOBAL DEFAULT 65312 sym_65309
+# CHECK: 65342: 0000000000000000 0 NOTYPE GLOBAL DEFAULT 65344 sym_65341
diff --git a/llvm/test/tools/llvm-readobj/ELF/merged.test b/llvm/test/tools/llvm-readobj/ELF/merged.test
new file mode 100644
index 00000000000..a6f567cda6c
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/merged.test
@@ -0,0 +1,13 @@
+# Check merged args produce identical output to when not merged.
+RUN: llvm-readelf -aeWhSrnudlVgIs %p/Inputs/trivial.obj.elf-i386 > %t.merged
+RUN: llvm-readelf -a -e -W -h -S -r -n -u -d -l -V -g -I -s %p/Inputs/trivial.obj.elf-i386 > %t.not-merged
+RUN: cmp %t.merged %t.not-merged
+RUN: FileCheck %s --input-file %t.merged
+
+# llvm-readobj does not support merged args, because it also supports some old
+# flags (-st, -sd, etc.), and it would be confusing if only some merged args
+# were supported.
+RUN: not llvm-readobj -aeWhSrnudlVgIs %p/Inputs/trivial.obj.elf-i386 2>&1 | FileCheck %s --check-prefix=UNKNOWN
+
+CHECK-NOT: Unknown command line argument
+UNKNOWN: for the --section-headers option: may only occur zero or one times!
diff --git a/llvm/test/tools/llvm-readobj/ELF/mips-abiflags.test b/llvm/test/tools/llvm-readobj/ELF/mips-abiflags.test
new file mode 100644
index 00000000000..54797bfa76f
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/mips-abiflags.test
@@ -0,0 +1,71 @@
+RUN: llvm-readobj -A %p/Inputs/abiflags.obj.elf-mipsel | \
+RUN: FileCheck -check-prefix=EL64 %s
+RUN: llvm-readobj -A %p/Inputs/abiflags.obj.elf-mips | \
+RUN: FileCheck -check-prefix=BE32 %s
+
+RUN: llvm-readelf -A %p/Inputs/abiflags.obj.elf-mipsel | \
+RUN: FileCheck -check-prefix=GNU-EL64 %s
+RUN: llvm-readelf -A %p/Inputs/abiflags.obj.elf-mips | \
+RUN: FileCheck -check-prefix=GNU-BE32 %s
+
+EL64: MIPS ABI Flags {
+EL64-NEXT: Version: 0
+EL64-NEXT: ISA: MIPS64r5
+EL64-NEXT: ISA Extension: Cavium Networks Octeon3 (0x13)
+EL64-NEXT: ASEs [ (0x103)
+EL64-NEXT: DSP (0x1)
+EL64-NEXT: DSPR2 (0x2)
+EL64-NEXT: VZ (0x100)
+EL64-NEXT: ]
+EL64-NEXT: FP ABI: Hard float (double precision) (0x1)
+EL64-NEXT: GPR size: 64
+EL64-NEXT: CPR1 size: 64
+EL64-NEXT: CPR2 size: 0
+EL64-NEXT: Flags 1 [ (0x1)
+EL64-NEXT: ODDSPREG (0x1)
+EL64-NEXT: ]
+EL64-NEXT: Flags 2: 0x0
+EL64-NEXT: }
+
+BE32: MIPS ABI Flags {
+BE32-NEXT: Version: 0
+BE32-NEXT: ISA: MIPS32r2
+BE32-NEXT: ISA Extension: None (0x0)
+BE32-NEXT: ASEs [ (0x803)
+BE32-NEXT: DSP (0x1)
+BE32-NEXT: DSPR2 (0x2)
+BE32-NEXT: microMIPS (0x800)
+BE32-NEXT: ]
+BE32-NEXT: FP ABI: Soft float (0x3)
+BE32-NEXT: GPR size: 32
+BE32-NEXT: CPR1 size: 0
+BE32-NEXT: CPR2 size: 0
+BE32-NEXT: Flags 1 [ (0x1)
+BE32-NEXT: ODDSPREG (0x1)
+BE32-NEXT: ]
+BE32-NEXT: Flags 2: 0x0
+BE32-NEXT: }
+
+GNU-EL64: MIPS ABI Flags Version: 0
+GNU-EL64-EMPTY:
+GNU-EL64-NEXT: ISA: MIPS64r5
+GNU-EL64-NEXT: GPR size: 64
+GNU-EL64-NEXT: CPR1 size: 64
+GNU-EL64-NEXT: CPR2 size: 0
+GNU-EL64-NEXT: FP ABI: Hard float (double precision)
+GNU-EL64-NEXT: ISA Extension: Cavium Networks Octeon3
+GNU-EL64-NEXT: ASEs: DSP, DSPR2, VZ
+GNU-EL64-NEXT: FLAGS 1: 00000001
+GNU-EL64-NEXT: FLAGS 2: 00000000
+
+GNU-BE32: MIPS ABI Flags Version: 0
+GNU-BE32-EMPTY:
+GNU-BE32-NEXT: ISA: MIPS32r2
+GNU-BE32-NEXT: GPR size: 32
+GNU-BE32-NEXT: CPR1 size: 0
+GNU-BE32-NEXT: CPR2 size: 0
+GNU-BE32-NEXT: FP ABI: Soft float
+GNU-BE32-NEXT: ISA Extension: None
+GNU-BE32-NEXT: ASEs: DSP, DSPR2, microMIPS
+GNU-BE32-NEXT: FLAGS 1: 00000001
+GNU-BE32-NEXT: FLAGS 2: 00000000
diff --git a/llvm/test/tools/llvm-readobj/ELF/mips-got-overlapped.test b/llvm/test/tools/llvm-readobj/ELF/mips-got-overlapped.test
new file mode 100644
index 00000000000..881c63b79a4
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/mips-got-overlapped.test
@@ -0,0 +1,45 @@
+# Check that llvm-readobj -A correctly shows .got section
+# content if there are some other zero-sized sections with the same
+# address as the .got. got-over.exe.elf-mips has zero-sized .data
+# section at the same offset .got section.
+
+RUN: llvm-readobj -A %p/Inputs/got-over.exe.elf-mips | FileCheck %s
+
+GOT-OBJ: Cannot find PLTGOT dynamic table tag.
+
+CHECK: Primary GOT {
+CHECK-NEXT: Canonical gp value: 0x418270
+CHECK-NEXT: Reserved entries [
+CHECK-NEXT: Entry {
+CHECK-NEXT: Address: 0x410280
+CHECK-NEXT: Access: -32752
+CHECK-NEXT: Initial: 0x0
+CHECK-NEXT: Purpose: Lazy resolver
+CHECK-NEXT: }
+CHECK-NEXT: Entry {
+CHECK-NEXT: Address: 0x410284
+CHECK-NEXT: Access: -32748
+CHECK-NEXT: Initial: 0x80000000
+CHECK-NEXT: Purpose: Module pointer (GNU extension)
+CHECK-NEXT: }
+CHECK-NEXT: ]
+CHECK-NEXT: Local entries [
+CHECK-NEXT: Entry {
+CHECK-NEXT: Address: 0x410288
+CHECK-NEXT: Access: -32744
+CHECK-NEXT: Initial: 0x4001B8
+CHECK-NEXT: }
+CHECK-NEXT: ]
+CHECK-NEXT: Global entries [
+CHECK-NEXT: Entry {
+CHECK-NEXT: Address: 0x41028C
+CHECK-NEXT: Access: -32740
+CHECK-NEXT: Initial: 0x0
+CHECK-NEXT: Value: 0x0
+CHECK-NEXT: Type: None
+CHECK-NEXT: Section: Undefined
+CHECK-NEXT: Name: _foo
+CHECK-NEXT: }
+CHECK-NEXT: ]
+CHECK-NEXT: Number of TLS and multi-GOT entries: 0
+CHECK-NEXT: }
diff --git a/llvm/test/tools/llvm-readobj/ELF/mips-got.test b/llvm/test/tools/llvm-readobj/ELF/mips-got.test
new file mode 100644
index 00000000000..8ed35d4b68e
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/mips-got.test
@@ -0,0 +1,486 @@
+RUN: llvm-readobj -A %p/Inputs/dynamic-table-exe.mips | \
+RUN: FileCheck %s -check-prefix GOT-EXE
+RUN: llvm-readobj -A %p/Inputs/dynamic-table-so.mips | \
+RUN: FileCheck %s -check-prefix GOT-SO
+RUN: llvm-readobj -A %p/Inputs/got-tls.so.elf-mips64el | \
+RUN: FileCheck %s -check-prefix GOT-TLS
+RUN: llvm-readobj -A %p/Inputs/got-empty.exe.mipsel | \
+RUN: FileCheck %s -check-prefix GOT-EMPTY
+RUN: llvm-readobj -A %p/Inputs/got-static.exe.mips | \
+RUN: FileCheck %s -check-prefix GOT-STATIC
+
+RUN: llvm-readelf -A %p/Inputs/dynamic-table-exe.mips | \
+RUN: FileCheck %s --strict-whitespace -check-prefix GNU-GOT-EXE
+RUN: llvm-readelf -A %p/Inputs/dynamic-table-so.mips | \
+RUN: FileCheck %s --strict-whitespace -check-prefix GNU-GOT-SO
+RUN: llvm-readelf -A %p/Inputs/got-tls.so.elf-mips64el | \
+RUN: FileCheck %s --strict-whitespace -check-prefix GNU-GOT-TLS
+RUN: llvm-readelf -A %p/Inputs/got-empty.exe.mipsel | \
+RUN: FileCheck %s --strict-whitespace -check-prefix GNU-GOT-EMPTY
+RUN: llvm-readelf -A %p/Inputs/got-static.exe.mips | \
+RUN: FileCheck %s --strict-whitespace -check-prefix GNU-GOT-STATIC
+
+GOT-EXE: Primary GOT {
+GOT-EXE-NEXT: Canonical gp value: 0x418880
+GOT-EXE-NEXT: Reserved entries [
+GOT-EXE-NEXT: Entry {
+GOT-EXE-NEXT: Address: 0x410890
+GOT-EXE-NEXT: Access: -32752
+GOT-EXE-NEXT: Initial: 0x0
+GOT-EXE-NEXT: Purpose: Lazy resolver
+GOT-EXE-NEXT: }
+GOT-EXE-NEXT: Entry {
+GOT-EXE-NEXT: Address: 0x410894
+GOT-EXE-NEXT: Access: -32748
+GOT-EXE-NEXT: Initial: 0x80000000
+GOT-EXE-NEXT: Purpose: Module pointer (GNU extension)
+GOT-EXE-NEXT: }
+GOT-EXE-NEXT: ]
+GOT-EXE-NEXT: Local entries [
+GOT-EXE-NEXT: Entry {
+GOT-EXE-NEXT: Address: 0x410898
+GOT-EXE-NEXT: Access: -32744
+GOT-EXE-NEXT: Initial: 0x400418
+GOT-EXE-NEXT: }
+GOT-EXE-NEXT: Entry {
+GOT-EXE-NEXT: Address: 0x41089C
+GOT-EXE-NEXT: Access: -32740
+GOT-EXE-NEXT: Initial: 0x410840
+GOT-EXE-NEXT: }
+GOT-EXE-NEXT: Entry {
+GOT-EXE-NEXT: Address: 0x4108A0
+GOT-EXE-NEXT: Access: -32736
+GOT-EXE-NEXT: Initial: 0x0
+GOT-EXE-NEXT: }
+GOT-EXE-NEXT: ]
+GOT-EXE-NEXT: Global entries [
+GOT-EXE-NEXT: Entry {
+GOT-EXE-NEXT: Address: 0x4108A4
+GOT-EXE-NEXT: Access: -32732
+GOT-EXE-NEXT: Initial: 0x0
+GOT-EXE-NEXT: Value: 0x0
+GOT-EXE-NEXT: Type: Function (0x2)
+GOT-EXE-NEXT: Section: Undefined (0x0)
+GOT-EXE-NEXT: Name: __gmon_start__ (1)
+GOT-EXE-NEXT: }
+GOT-EXE-NEXT: ]
+GOT-EXE-NEXT: Number of TLS and multi-GOT entries: 0
+GOT-EXE-NEXT: }
+
+GOT-SO: Primary GOT {
+GOT-SO-NEXT: Canonical gp value: 0x188D0
+GOT-SO-NEXT: Reserved entries [
+GOT-SO-NEXT: Entry {
+GOT-SO-NEXT: Address: 0x108E0
+GOT-SO-NEXT: Access: -32752
+GOT-SO-NEXT: Initial: 0x0
+GOT-SO-NEXT: Purpose: Lazy resolver
+GOT-SO-NEXT: }
+GOT-SO-NEXT: Entry {
+GOT-SO-NEXT: Address: 0x108E4
+GOT-SO-NEXT: Access: -32748
+GOT-SO-NEXT: Initial: 0x80000000
+GOT-SO-NEXT: Purpose: Module pointer (GNU extension)
+GOT-SO-NEXT: }
+GOT-SO-NEXT: ]
+GOT-SO-NEXT: Local entries [
+GOT-SO-NEXT: Entry {
+GOT-SO-NEXT: Address: 0x108E8
+GOT-SO-NEXT: Access: -32744
+GOT-SO-NEXT: Initial: 0x108E0
+GOT-SO-NEXT: }
+GOT-SO-NEXT: Entry {
+GOT-SO-NEXT: Address: 0x108EC
+GOT-SO-NEXT: Access: -32740
+GOT-SO-NEXT: Initial: 0x10000
+GOT-SO-NEXT: }
+GOT-SO-NEXT: Entry {
+GOT-SO-NEXT: Address: 0x108F0
+GOT-SO-NEXT: Access: -32736
+GOT-SO-NEXT: Initial: 0x10920
+GOT-SO-NEXT: }
+GOT-SO-NEXT: Entry {
+GOT-SO-NEXT: Address: 0x108F4
+GOT-SO-NEXT: Access: -32732
+GOT-SO-NEXT: Initial: 0x108CC
+GOT-SO-NEXT: }
+GOT-SO-NEXT: Entry {
+GOT-SO-NEXT: Address: 0x108F8
+GOT-SO-NEXT: Access: -32728
+GOT-SO-NEXT: Initial: 0x0
+GOT-SO-NEXT: }
+GOT-SO-NEXT: Entry {
+GOT-SO-NEXT: Address: 0x108FC
+GOT-SO-NEXT: Access: -32724
+GOT-SO-NEXT: Initial: 0x0
+GOT-SO-NEXT: }
+GOT-SO-NEXT: Entry {
+GOT-SO-NEXT: Address: 0x10900
+GOT-SO-NEXT: Access: -32720
+GOT-SO-NEXT: Initial: 0x0
+GOT-SO-NEXT: }
+GOT-SO-NEXT: Entry {
+GOT-SO-NEXT: Address: 0x10904
+GOT-SO-NEXT: Access: -32716
+GOT-SO-NEXT: Initial: 0x0
+GOT-SO-NEXT: }
+GOT-SO-NEXT: ]
+GOT-SO-NEXT: Global entries [
+GOT-SO-NEXT: Entry {
+GOT-SO-NEXT: Address: 0x10908
+GOT-SO-NEXT: Access: -32712
+GOT-SO-NEXT: Initial: 0x0
+GOT-SO-NEXT: Value: 0x0
+GOT-SO-NEXT: Type: None (0x0)
+GOT-SO-NEXT: Section: Undefined (0x0)
+GOT-SO-NEXT: Name: _ITM_registerTMCloneTable (87)
+GOT-SO-NEXT: }
+GOT-SO-NEXT: Entry {
+GOT-SO-NEXT: Address: 0x1090C
+GOT-SO-NEXT: Access: -32708
+GOT-SO-NEXT: Initial: 0x0
+GOT-SO-NEXT: Value: 0x0
+GOT-SO-NEXT: Type: None (0x0)
+GOT-SO-NEXT: Section: Undefined (0x0)
+GOT-SO-NEXT: Name: _Jv_RegisterClasses (128)
+GOT-SO-NEXT: }
+GOT-SO-NEXT: Entry {
+GOT-SO-NEXT: Address: 0x10910
+GOT-SO-NEXT: Access: -32704
+GOT-SO-NEXT: Initial: 0x0
+GOT-SO-NEXT: Value: 0x0
+GOT-SO-NEXT: Type: Function (0x2)
+GOT-SO-NEXT: Section: Undefined (0x0)
+GOT-SO-NEXT: Name: __gmon_start__ (23)
+GOT-SO-NEXT: }
+GOT-SO-NEXT: Entry {
+GOT-SO-NEXT: Address: 0x10914
+GOT-SO-NEXT: Access: -32700
+GOT-SO-NEXT: Initial: 0x840
+GOT-SO-NEXT: Value: 0x840
+GOT-SO-NEXT: Type: Function (0x2)
+GOT-SO-NEXT: Section: Undefined (0x0)
+GOT-SO-NEXT: Name: puts@GLIBC_2.0 (162)
+GOT-SO-NEXT: }
+GOT-SO-NEXT: Entry {
+GOT-SO-NEXT: Address: 0x10918
+GOT-SO-NEXT: Access: -32696
+GOT-SO-NEXT: Initial: 0x0
+GOT-SO-NEXT: Value: 0x0
+GOT-SO-NEXT: Type: None (0x0)
+GOT-SO-NEXT: Section: Undefined (0x0)
+GOT-SO-NEXT: Name: _ITM_deregisterTMCloneTable (59)
+GOT-SO-NEXT: }
+GOT-SO-NEXT: Entry {
+GOT-SO-NEXT: Address: 0x1091C
+GOT-SO-NEXT: Access: -32692
+GOT-SO-NEXT: Initial: 0x0
+GOT-SO-NEXT: Value: 0x0
+GOT-SO-NEXT: Type: Function (0x2)
+GOT-SO-NEXT: Section: Undefined (0x0)
+GOT-SO-NEXT: Name: __cxa_finalize@GLIBC_2.2 (113)
+GOT-SO-NEXT: }
+GOT-SO-NEXT: ]
+GOT-SO-NEXT: Number of TLS and multi-GOT entries: 0
+GOT-SO-NEXT: }
+
+GOT-TLS: Primary GOT {
+GOT-TLS-NEXT: Canonical gp value: 0x18BF0
+GOT-TLS-NEXT: Reserved entries [
+GOT-TLS-NEXT: Entry {
+GOT-TLS-NEXT: Address: 0x10C00
+GOT-TLS-NEXT: Access: -32752
+GOT-TLS-NEXT: Initial: 0x0
+GOT-TLS-NEXT: Purpose: Lazy resolver
+GOT-TLS-NEXT: }
+GOT-TLS-NEXT: Entry {
+GOT-TLS-NEXT: Address: 0x10C08
+GOT-TLS-NEXT: Access: -32744
+GOT-TLS-NEXT: Initial: 0x8000000000000000
+GOT-TLS-NEXT: Purpose: Module pointer (GNU extension)
+GOT-TLS-NEXT: }
+GOT-TLS-NEXT: ]
+GOT-TLS-NEXT: Local entries [
+GOT-TLS-NEXT: Entry {
+GOT-TLS-NEXT: Address: 0x10C10
+GOT-TLS-NEXT: Access: -32736
+GOT-TLS-NEXT: Initial: 0x10000
+GOT-TLS-NEXT: }
+GOT-TLS-NEXT: Entry {
+GOT-TLS-NEXT: Address: 0x10C18
+GOT-TLS-NEXT: Access: -32728
+GOT-TLS-NEXT: Initial: 0x10C00
+GOT-TLS-NEXT: }
+GOT-TLS-NEXT: Entry {
+GOT-TLS-NEXT: Address: 0x10C20
+GOT-TLS-NEXT: Access: -32720
+GOT-TLS-NEXT: Initial: 0x10CB8
+GOT-TLS-NEXT: }
+GOT-TLS-NEXT: Entry {
+GOT-TLS-NEXT: Address: 0x10C28
+GOT-TLS-NEXT: Access: -32712
+GOT-TLS-NEXT: Initial: 0x10BF0
+GOT-TLS-NEXT: }
+GOT-TLS-NEXT: Entry {
+GOT-TLS-NEXT: Address: 0x10C30
+GOT-TLS-NEXT: Access: -32704
+GOT-TLS-NEXT: Initial: 0x0
+GOT-TLS-NEXT: }
+GOT-TLS-NEXT: Entry {
+GOT-TLS-NEXT: Address: 0x10C38
+GOT-TLS-NEXT: Access: -32696
+GOT-TLS-NEXT: Initial: 0x948
+GOT-TLS-NEXT: }
+GOT-TLS-NEXT: Entry {
+GOT-TLS-NEXT: Address: 0x10C40
+GOT-TLS-NEXT: Access: -32688
+GOT-TLS-NEXT: Initial: 0xA20
+GOT-TLS-NEXT: }
+GOT-TLS-NEXT: Entry {
+GOT-TLS-NEXT: Address: 0x10C48
+GOT-TLS-NEXT: Access: -32680
+GOT-TLS-NEXT: Initial: 0xAF0
+GOT-TLS-NEXT: }
+GOT-TLS-NEXT: Entry {
+GOT-TLS-NEXT: Address: 0x10C50
+GOT-TLS-NEXT: Access: -32672
+GOT-TLS-NEXT: Initial: 0x0
+GOT-TLS-NEXT: }
+GOT-TLS-NEXT: Entry {
+GOT-TLS-NEXT: Address: 0x10C58
+GOT-TLS-NEXT: Access: -32664
+GOT-TLS-NEXT: Initial: 0x0
+GOT-TLS-NEXT: }
+GOT-TLS-NEXT: Entry {
+GOT-TLS-NEXT: Address: 0x10C60
+GOT-TLS-NEXT: Access: -32656
+GOT-TLS-NEXT: Initial: 0x0
+GOT-TLS-NEXT: }
+GOT-TLS-NEXT: ]
+GOT-TLS-NEXT: Global entries [
+GOT-TLS-NEXT: Entry {
+GOT-TLS-NEXT: Address: 0x10C68
+GOT-TLS-NEXT: Access: -32648
+GOT-TLS-NEXT: Initial: 0x0
+GOT-TLS-NEXT: Value: 0x0
+GOT-TLS-NEXT: Type: None (0x0)
+GOT-TLS-NEXT: Section: Undefined (0x0)
+GOT-TLS-NEXT: Name: _ITM_registerTMCloneTable (78)
+GOT-TLS-NEXT: }
+GOT-TLS-NEXT: Entry {
+GOT-TLS-NEXT: Address: 0x10C70
+GOT-TLS-NEXT: Access: -32640
+GOT-TLS-NEXT: Initial: 0x0
+GOT-TLS-NEXT: Value: 0x0
+GOT-TLS-NEXT: Type: None (0x0)
+GOT-TLS-NEXT: Section: Undefined (0x0)
+GOT-TLS-NEXT: Name: _Jv_RegisterClasses (119)
+GOT-TLS-NEXT: }
+GOT-TLS-NEXT: Entry {
+GOT-TLS-NEXT: Address: 0x10C78
+GOT-TLS-NEXT: Access: -32632
+GOT-TLS-NEXT: Initial: 0x0
+GOT-TLS-NEXT: Value: 0x0
+GOT-TLS-NEXT: Type: Function (0x2)
+GOT-TLS-NEXT: Section: Undefined (0x0)
+GOT-TLS-NEXT: Name: __gmon_start__ (23)
+GOT-TLS-NEXT: }
+GOT-TLS-NEXT: Entry {
+GOT-TLS-NEXT: Address: 0x10C80
+GOT-TLS-NEXT: Access: -32624
+GOT-TLS-NEXT: Initial: 0xB60
+GOT-TLS-NEXT: Value: 0xB60
+GOT-TLS-NEXT: Type: Function (0x2)
+GOT-TLS-NEXT: Section: Undefined (0x0)
+GOT-TLS-NEXT: Name: __tls_get_addr@GLIBC_2.3 (150)
+GOT-TLS-NEXT: }
+GOT-TLS-NEXT: Entry {
+GOT-TLS-NEXT: Address: 0x10C88
+GOT-TLS-NEXT: Access: -32616
+GOT-TLS-NEXT: Initial: 0x0
+GOT-TLS-NEXT: Value: 0x0
+GOT-TLS-NEXT: Type: None (0x0)
+GOT-TLS-NEXT: Section: Undefined (0x0)
+GOT-TLS-NEXT: Name: _ITM_deregisterTMCloneTable (50)
+GOT-TLS-NEXT: }
+GOT-TLS-NEXT: Entry {
+GOT-TLS-NEXT: Address: 0x10C90
+GOT-TLS-NEXT: Access: -32608
+GOT-TLS-NEXT: Initial: 0x0
+GOT-TLS-NEXT: Value: 0x0
+GOT-TLS-NEXT: Type: Function (0x2)
+GOT-TLS-NEXT: Section: Undefined (0x0)
+GOT-TLS-NEXT: Name: __cxa_finalize@GLIBC_2.2 (104)
+GOT-TLS-NEXT: }
+GOT-TLS-NEXT: ]
+GOT-TLS-NEXT: Number of TLS and multi-GOT entries: 4
+GOT-TLS-NEXT: }
+
+GOT-EMPTY: Primary GOT {
+GOT-EMPTY-NEXT: Canonical gp value: 0x409FF0
+GOT-EMPTY-NEXT: Reserved entries [
+GOT-EMPTY-NEXT: Entry {
+GOT-EMPTY-NEXT: Address: 0x402000
+GOT-EMPTY-NEXT: Access: -32752
+GOT-EMPTY-NEXT: Initial: 0x0
+GOT-EMPTY-NEXT: Purpose: Lazy resolver
+GOT-EMPTY-NEXT: }
+GOT-EMPTY-NEXT: Entry {
+GOT-EMPTY-NEXT: Address: 0x402004
+GOT-EMPTY-NEXT: Access: -32748
+GOT-EMPTY-NEXT: Initial: 0x80000000
+GOT-EMPTY-NEXT: Purpose: Module pointer (GNU extension)
+GOT-EMPTY-NEXT: }
+GOT-EMPTY-NEXT: ]
+GOT-EMPTY-NEXT: Local entries [
+GOT-EMPTY-NEXT: ]
+GOT-EMPTY-NEXT: Global entries [
+GOT-EMPTY-NEXT: ]
+GOT-EMPTY-NEXT: Number of TLS and multi-GOT entries: 2
+GOT-EMPTY-NEXT: }
+
+GOT-STATIC: Static GOT {
+GOT-STATIC-NEXT: Canonical gp value: 0x418100
+GOT-STATIC-NEXT: Reserved entries [
+GOT-STATIC-NEXT: Entry {
+GOT-STATIC-NEXT: Address: 0x410110
+GOT-STATIC-NEXT: Access: -32752
+GOT-STATIC-NEXT: Initial: 0x0
+GOT-STATIC-NEXT: Purpose: Lazy resolver
+GOT-STATIC-NEXT: }
+GOT-STATIC-NEXT: Entry {
+GOT-STATIC-NEXT: Address: 0x410114
+GOT-STATIC-NEXT: Access: -32748
+GOT-STATIC-NEXT: Initial: 0x80000000
+GOT-STATIC-NEXT: Purpose: Module pointer (GNU extension)
+GOT-STATIC-NEXT: }
+GOT-STATIC-NEXT: ]
+GOT-STATIC-NEXT: Local entries [
+GOT-STATIC-NEXT: Entry {
+GOT-STATIC-NEXT: Address: 0x410118
+GOT-STATIC-NEXT: Access: -32744
+GOT-STATIC-NEXT: Initial: 0x400000
+GOT-STATIC-NEXT: }
+GOT-STATIC-NEXT: Entry {
+GOT-STATIC-NEXT: Address: 0x41011C
+GOT-STATIC-NEXT: Access: -32740
+GOT-STATIC-NEXT: Initial: 0x400100
+GOT-STATIC-NEXT: }
+GOT-STATIC-NEXT: Entry {
+GOT-STATIC-NEXT: Address: 0x410120
+GOT-STATIC-NEXT: Access: -32736
+GOT-STATIC-NEXT: Initial: 0x400104
+GOT-STATIC-NEXT: }
+GOT-STATIC-NEXT: ]
+GOT-STATIC-NEXT: }
+
+GNU-GOT-EXE: Primary GOT:
+GNU-GOT-EXE-NEXT: Canonical gp value: 00418880
+
+GNU-GOT-EXE: Reserved entries:
+GNU-GOT-EXE-NEXT: Address Access Initial Purpose
+GNU-GOT-EXE-NEXT: 00410890 -32752(gp) 00000000 Lazy resolver
+GNU-GOT-EXE-NEXT: 00410894 -32748(gp) 80000000 Module pointer (GNU extension)
+
+GNU-GOT-EXE: Local entries:
+GNU-GOT-EXE-NEXT: Address Access Initial
+GNU-GOT-EXE-NEXT: 00410898 -32744(gp) 00400418
+GNU-GOT-EXE-NEXT: 0041089c -32740(gp) 00410840
+GNU-GOT-EXE-NEXT: 004108a0 -32736(gp) 00000000
+
+GNU-GOT-EXE: Global entries:
+GNU-GOT-EXE-NEXT: Address Access Initial Sym.Val. Type Ndx Name
+GNU-GOT-EXE-NEXT: 004108a4 -32732(gp) 00000000 00000000 FUNC UND __gmon_start__
+
+GNU-GOT-EXE: PLT GOT:
+
+GNU-GOT-EXE: Reserved entries:
+GNU-GOT-EXE-NEXT: Address Initial Purpose
+GNU-GOT-EXE-NEXT: 00410854 00000000 PLT lazy resolver
+GNU-GOT-EXE-NEXT: 00410858 00000000 Module pointer
+
+GNU-GOT-EXE: Entries:
+GNU-GOT-EXE-NEXT: Address Initial Sym.Val. Type Ndx Name
+GNU-GOT-EXE-NEXT: 0041085c 00400800 00000000 FUNC UND puts
+GNU-GOT-EXE-NEXT: 00410860 00400800 00000000 FUNC UND __libc_start_main
+
+GNU-GOT-SO: Primary GOT:
+GNU-GOT-SO-NEXT: Canonical gp value: 000188d0
+
+GNU-GOT-SO: Reserved entries:
+GNU-GOT-SO-NEXT: Address Access Initial Purpose
+GNU-GOT-SO-NEXT: 000108e0 -32752(gp) 00000000 Lazy resolver
+GNU-GOT-SO-NEXT: 000108e4 -32748(gp) 80000000 Module pointer (GNU extension)
+
+GNU-GOT-SO: Local entries:
+GNU-GOT-SO-NEXT: Address Access Initial
+GNU-GOT-SO-NEXT: 000108e8 -32744(gp) 000108e0
+GNU-GOT-SO-NEXT: 000108ec -32740(gp) 00010000
+GNU-GOT-SO-NEXT: 000108f0 -32736(gp) 00010920
+GNU-GOT-SO-NEXT: 000108f4 -32732(gp) 000108cc
+GNU-GOT-SO-NEXT: 000108f8 -32728(gp) 00000000
+GNU-GOT-SO-NEXT: 000108fc -32724(gp) 00000000
+GNU-GOT-SO-NEXT: 00010900 -32720(gp) 00000000
+GNU-GOT-SO-NEXT: 00010904 -32716(gp) 00000000
+
+GNU-GOT-SO: Global entries:
+GNU-GOT-SO-NEXT: Address Access Initial Sym.Val. Type Ndx Name
+GNU-GOT-SO-NEXT: 00010908 -32712(gp) 00000000 00000000 NOTYPE UND _ITM_registerTMCloneTable
+GNU-GOT-SO-NEXT: 0001090c -32708(gp) 00000000 00000000 NOTYPE UND _Jv_RegisterClasses
+GNU-GOT-SO-NEXT: 00010910 -32704(gp) 00000000 00000000 FUNC UND __gmon_start__
+GNU-GOT-SO-NEXT: 00010914 -32700(gp) 00000840 00000840 FUNC UND puts
+GNU-GOT-SO-NEXT: 00010918 -32696(gp) 00000000 00000000 NOTYPE UND _ITM_deregisterTMCloneTable
+GNU-GOT-SO-NEXT: 0001091c -32692(gp) 00000000 00000000 FUNC UND __cxa_finalize
+
+GNU-GOT-TLS: Primary GOT:
+GNU-GOT-TLS-NEXT: Canonical gp value: 0000000000018bf0
+
+GNU-GOT-TLS: Reserved entries:
+GNU-GOT-TLS-NEXT: Address Access Initial Purpose
+GNU-GOT-TLS-NEXT: 0000000000010c00 -32752(gp) 0000000000000000 Lazy resolver
+GNU-GOT-TLS-NEXT: 0000000000010c08 -32744(gp) 8000000000000000 Module pointer (GNU extension)
+
+GNU-GOT-TLS: Local entries:
+GNU-GOT-TLS-NEXT: Address Access Initial
+GNU-GOT-TLS-NEXT: 0000000000010c10 -32736(gp) 0000000000010000
+GNU-GOT-TLS-NEXT: 0000000000010c18 -32728(gp) 0000000000010c00
+GNU-GOT-TLS-NEXT: 0000000000010c20 -32720(gp) 0000000000010cb8
+GNU-GOT-TLS-NEXT: 0000000000010c28 -32712(gp) 0000000000010bf0
+GNU-GOT-TLS-NEXT: 0000000000010c30 -32704(gp) 0000000000000000
+GNU-GOT-TLS-NEXT: 0000000000010c38 -32696(gp) 0000000000000948
+GNU-GOT-TLS-NEXT: 0000000000010c40 -32688(gp) 0000000000000a20
+GNU-GOT-TLS-NEXT: 0000000000010c48 -32680(gp) 0000000000000af0
+GNU-GOT-TLS-NEXT: 0000000000010c50 -32672(gp) 0000000000000000
+GNU-GOT-TLS-NEXT: 0000000000010c58 -32664(gp) 0000000000000000
+GNU-GOT-TLS-NEXT: 0000000000010c60 -32656(gp) 0000000000000000
+
+GNU-GOT-TLS: Global entries:
+GNU-GOT-TLS-NEXT: Address Access Initial Sym.Val. Type Ndx Name
+GNU-GOT-TLS-NEXT: 0000000000010c68 -32648(gp) 0000000000000000 0000000000000000 NOTYPE UND _ITM_registerTMCloneTable
+GNU-GOT-TLS-NEXT: 0000000000010c70 -32640(gp) 0000000000000000 0000000000000000 NOTYPE UND _Jv_RegisterClasses
+GNU-GOT-TLS-NEXT: 0000000000010c78 -32632(gp) 0000000000000000 0000000000000000 FUNC UND __gmon_start__
+GNU-GOT-TLS-NEXT: 0000000000010c80 -32624(gp) 0000000000000b60 0000000000000b60 FUNC UND __tls_get_addr
+GNU-GOT-TLS-NEXT: 0000000000010c88 -32616(gp) 0000000000000000 0000000000000000 NOTYPE UND _ITM_deregisterTMCloneTable
+GNU-GOT-TLS-NEXT: 0000000000010c90 -32608(gp) 0000000000000000 0000000000000000 FUNC UND __cxa_finalize
+
+GNU-GOTY : Primary GOT:
+GNU-GOT-EMPTY: Canonical gp value: 00409ff0
+
+GNU-GOTY : Reserved entries:
+GNU-GOT-EMPTY: Address Access Initial Purpose
+GNU-GOT-EMPTY: 00402000 -32752(gp) 00000000 Lazy resolver
+GNU-GOT-EMPTY: 00402004 -32748(gp) 80000000 Module pointer (GNU extension)
+
+GNU-GOT-STATIC: Static GOT:
+GNU-GOT-STATIC-NEXT: Canonical gp value: 00418100
+
+GNU-GOT-STATIC: Reserved entries:
+GNU-GOT-STATIC-NEXT: Address Access Initial Purpose
+GNU-GOT-STATIC-NEXT: 00410110 -32752(gp) 00000000 Lazy resolver
+GNU-GOT-STATIC-NEXT: 00410114 -32748(gp) 80000000 Module pointer (GNU extension)
+
+GNU-GOT-STATIC: Local entries:
+GNU-GOT-STATIC-NEXT: Address Access Initial
+GNU-GOT-STATIC-NEXT: 00410118 -32744(gp) 00400000
+GNU-GOT-STATIC-NEXT: 0041011c -32740(gp) 00400100
+GNU-GOT-STATIC-NEXT: 00410120 -32736(gp) 00400104
diff --git a/llvm/test/tools/llvm-readobj/ELF/mips-options-sec.test b/llvm/test/tools/llvm-readobj/ELF/mips-options-sec.test
new file mode 100644
index 00000000000..3636d56cfe6
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/mips-options-sec.test
@@ -0,0 +1,12 @@
+RUN: llvm-readobj -A %p/Inputs/options.obj.elf-mipsel | FileCheck %s
+
+CHECK: MIPS Options {
+CHECK-NEXT: ODK_REGINFO {
+CHECK-NEXT: GP: 0x0
+CHECK-NEXT: General Mask: 0xF2000017
+CHECK-NEXT: Co-Proc Mask0: 0x0
+CHECK-NEXT: Co-Proc Mask1: 0x0
+CHECK-NEXT: Co-Proc Mask2: 0x0
+CHECK-NEXT: Co-Proc Mask3: 0x0
+CHECK-NEXT: }
+CHECK-NEXT: }
diff --git a/llvm/test/tools/llvm-readobj/ELF/mips-options.test b/llvm/test/tools/llvm-readobj/ELF/mips-options.test
new file mode 100644
index 00000000000..d44b3c0096a
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/mips-options.test
@@ -0,0 +1,22 @@
+# Check DT_MIPS_OPTIONS .dynamic section tag reading
+
+RUN: llvm-readobj --dynamic-table %p/Inputs/mips-options.elf-mips64el | \
+RUN: FileCheck %s
+
+CHECK: DynamicSection [ (14 entries)
+CHECK-NEXT: Tag Type Name/Value
+CHECK-NEXT: 0x0000000000000004 HASH 0x158
+CHECK-NEXT: 0x0000000000000005 STRTAB 0x1C0
+CHECK-NEXT: 0x0000000000000006 SYMTAB 0x178
+CHECK-NEXT: 0x000000000000000A STRSZ 7 (bytes)
+CHECK-NEXT: 0x000000000000000B SYMENT 24 (bytes)
+CHECK-NEXT: 0x0000000070000001 MIPS_RLD_VERSION 1
+CHECK-NEXT: 0x0000000070000005 MIPS_FLAGS NOTPOT
+CHECK-NEXT: 0x0000000070000006 MIPS_BASE_ADDRESS 0x0
+CHECK-NEXT: 0x000000007000000A MIPS_LOCAL_GOTNO 2
+CHECK-NEXT: 0x0000000070000011 MIPS_SYMTABNO 3
+CHECK-NEXT: 0x0000000070000013 MIPS_GOTSYM 0x3
+CHECK-NEXT: 0x0000000000000003 PLTGOT 0x2000
+CHECK-NEXT: 0x0000000070000029 MIPS_OPTIONS 0x1000
+CHECK-NEXT: 0x0000000000000000 NULL 0x0
+CHECK-NEXT: ]
diff --git a/llvm/test/tools/llvm-readobj/ELF/mips-plt.test b/llvm/test/tools/llvm-readobj/ELF/mips-plt.test
new file mode 100644
index 00000000000..4e40ca6aa2c
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/mips-plt.test
@@ -0,0 +1,64 @@
+RUN: llvm-readobj -A %p/Inputs/got-plt.exe.elf-mipsel | FileCheck %s
+RUN: llvm-readelf -A %p/Inputs/got-plt.exe.elf-mipsel | FileCheck --check-prefix=GNU %s
+
+CHECK: PLT GOT {
+CHECK-NEXT: Reserved entries [
+CHECK-NEXT: Entry {
+CHECK-NEXT: Address: 0x410814
+CHECK-NEXT: Initial: 0x0
+CHECK-NEXT: Purpose: PLT lazy resolver
+CHECK-NEXT: }
+CHECK-NEXT: Entry {
+CHECK-NEXT: Address: 0x410818
+CHECK-NEXT: Initial: 0x0
+CHECK-NEXT: Purpose: Module pointer
+CHECK-NEXT: }
+CHECK-NEXT: ]
+CHECK-NEXT: Entries [
+CHECK-NEXT: Entry {
+CHECK-NEXT: Address: 0x41081C
+CHECK-NEXT: Initial: 0x4007C0
+CHECK-NEXT: Value: 0x0
+CHECK-NEXT: Type: Function (0x2)
+CHECK-NEXT: Section: Undefined (0x0)
+CHECK-NEXT: Name: puts@GLIBC_2.0 (71)
+CHECK-NEXT: }
+CHECK-NEXT: Entry {
+CHECK-NEXT: Address: 0x410820
+CHECK-NEXT: Initial: 0x4007C0
+CHECK-NEXT: Value: 0x0
+CHECK-NEXT: Type: Function (0x2)
+CHECK-NEXT: Section: Undefined (0x0)
+CHECK-NEXT: Name: __libc_start_main@GLIBC_2.0 (53)
+CHECK-NEXT: }
+CHECK-NEXT: ]
+CHECK-NEXT: }
+
+GNU: Primary GOT:
+GNU-NEXT: Canonical gp value: 00418840
+
+GNU: Reserved entries:
+GNU-NEXT: Address Access Initial Purpose
+GNU-NEXT: 00410850 -32752(gp) 00000000 Lazy resolver
+GNU-NEXT: 00410854 -32748(gp) 80000000 Module pointer (GNU extension)
+
+GNU: Local entries:
+GNU-NEXT: Address Access Initial
+GNU-NEXT: 00410858 -32744(gp) 004003d4
+GNU-NEXT: 0041085c -32740(gp) 00410800
+GNU-NEXT: 00410860 -32736(gp) 00000000
+
+GNU: Global entries:
+GNU-NEXT: Address Access Initial Sym.Val. Type Ndx Name
+GNU-NEXT: 00410864 -32732(gp) 00000000 00000000 FUNC UND __gmon_start__
+GNU-NEXT: PLT GOT:
+
+GNU: Reserved entries:
+GNU-NEXT: Address Initial Purpose
+GNU-NEXT: 00410814 00000000 PLT lazy resolver
+GNU-NEXT: 00410818 00000000 Module pointer
+
+GNU: Entries:
+GNU-NEXT: Address Initial Sym.Val. Type Ndx Name
+GNU-NEXT: 0041081c 004007c0 00000000 FUNC UND puts
+GNU-NEXT: 00410820 004007c0 00000000 FUNC UND __libc_start_main
diff --git a/llvm/test/tools/llvm-readobj/ELF/mips-reginfo.test b/llvm/test/tools/llvm-readobj/ELF/mips-reginfo.test
new file mode 100644
index 00000000000..20177a99d8c
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/mips-reginfo.test
@@ -0,0 +1,10 @@
+RUN: llvm-readobj -A %p/Inputs/reginfo.obj.elf-mipsel | FileCheck %s
+
+CHECK: MIPS RegInfo {
+CHECK-NEXT: GP: 0x7FEF
+CHECK-NEXT: General Mask: 0xB00001F6
+CHECK-NEXT: Co-Proc Mask0: 0x0
+CHECK-NEXT: Co-Proc Mask1: 0x0
+CHECK-NEXT: Co-Proc Mask2: 0x0
+CHECK-NEXT: Co-Proc Mask3: 0x0
+CHECK-NEXT: }
diff --git a/llvm/test/tools/llvm-readobj/ELF/mips-rld-map-rel.test b/llvm/test/tools/llvm-readobj/ELF/mips-rld-map-rel.test
new file mode 100644
index 00000000000..05e541120a6
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/mips-rld-map-rel.test
@@ -0,0 +1,24 @@
+# Check DT_MIPS_RLD_MAP_REL .dynamic section tag reading
+
+RUN: llvm-readobj --dynamic-table %p/Inputs/mips-rld-map-rel.elf-mipsel | \
+RUN: FileCheck %s
+
+CHECK: DynamicSection [ (16 entries)
+CHECK-NEXT: Tag Type Name/Value
+CHECK-NEXT: 0x00000004 HASH 0x220
+CHECK-NEXT: 0x00000005 STRTAB 0x2FC
+CHECK-NEXT: 0x00000006 SYMTAB 0x25C
+CHECK-NEXT: 0x0000000A STRSZ 72 (bytes)
+CHECK-NEXT: 0x0000000B SYMENT 16 (bytes)
+CHECK-NEXT: 0x70000035 MIPS_RLD_MAP_REL 0x101E0
+CHECK-NEXT: 0x00000015 DEBUG 0x0
+CHECK-NEXT: 0x00000003 PLTGOT 0x10390
+CHECK-NEXT: 0x70000001 MIPS_RLD_VERSION 1
+CHECK-NEXT: 0x70000005 MIPS_FLAGS NOTPOT
+CHECK-NEXT: 0x70000006 MIPS_BASE_ADDRESS 0x0
+CHECK-NEXT: 0x7000000A MIPS_LOCAL_GOTNO 2
+CHECK-NEXT: 0x70000011 MIPS_SYMTABNO 10
+CHECK-NEXT: 0x70000012 MIPS_UNREFEXTNO 15
+CHECK-NEXT: 0x70000013 MIPS_GOTSYM 0xA
+CHECK-NEXT: 0x00000000 NULL 0x0
+CHECK-NEXT: ]
diff --git a/llvm/test/tools/llvm-readobj/ELF/mips-st-other.test b/llvm/test/tools/llvm-readobj/ELF/mips-st-other.test
new file mode 100644
index 00000000000..c164004c141
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/mips-st-other.test
@@ -0,0 +1,25 @@
+RUN: llvm-readobj --symbols %p/Inputs/st-other.obj.elf-mips \
+RUN: | FileCheck -check-prefix=MREG %s
+RUN: llvm-readobj --symbols %p/Inputs/st-other.obj.elf-mips16 \
+RUN: | FileCheck -check-prefix=M16 %s
+
+MREG: Name: foo
+MREG-NEXT: Value: 0x0
+MREG-NEXT: Size: 0
+MREG-NEXT: Binding: Global
+MREG-NEXT: Type: None
+MREG-NEXT: Other [ (0x29)
+MREG-NEXT: STO_MIPS_PIC (0x20)
+MREG-NEXT: STO_MIPS_PLT (0x8)
+MREG-NEXT: STV_INTERNAL (0x1)
+MREG-NEXT: ]
+
+M16: Name: foo
+M16-NEXT: Value: 0x0
+M16-NEXT: Size: 0
+M16-NEXT: Binding: Global
+M16-NEXT: Type: None
+M16-NEXT: Other [ (0xF1)
+M16-NEXT: STO_MIPS_MIPS16 (0xF0)
+M16-NEXT: STV_INTERNAL (0x1)
+M16-NEXT: ]
diff --git a/llvm/test/tools/llvm-readobj/ELF/no-action.test b/llvm/test/tools/llvm-readobj/ELF/no-action.test
new file mode 100644
index 00000000000..964db74bf30
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/no-action.test
@@ -0,0 +1,50 @@
+## Show the behavior of llvm-readobj/llvm-readelf when no operations are requested.
+
+## Check the behavior on ET_EXEC input.
+
+# RUN: yaml2obj --docnum=1 %s -o %t.exe
+# RUN: llvm-readobj %t.exe | FileCheck %s -DFILE=%t.exe --check-prefix LLVM
+# RUN: llvm-readelf %t.exe | FileCheck %s -DFILE=%t.exe --check-prefix GNU --allow-empty
+
+# LLVM: File: [[FILE]]
+# LLVM: Format: ELF64-x86-64
+# LLVM: Arch: x86_64
+# LLVM: AddressSize: 64bit
+# LLVM: LoadName: <Not found>{{$}}
+# LLVM-EMPTY:
+# LLVM-NOT: {{.}}
+
+# GNU-NOT: {{.}}
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+
+## Check the behavior on ET_REL input.
+
+# RUN: yaml2obj --docnum=2 %s -o %t.o
+# RUN: llvm-readobj %t.o | FileCheck %s -DFILE=%t.o --check-prefix LLVM
+# RUN: llvm-readelf %t.o | FileCheck %s -DFILE=%t.o --check-prefix GNU --allow-empty
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+
+## Check the behavior on ET_DYN input.
+
+# RUN: yaml2obj --docnum=3 %s -o %t.so
+# RUN: llvm-readobj %t.so | FileCheck %s -DFILE=%t.so --check-prefix LLVM
+# RUN: llvm-readelf %t.so | FileCheck %s -DFILE=%t.so --check-prefix GNU --allow-empty
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_DYN
+ Machine: EM_X86_64
diff --git a/llvm/test/tools/llvm-readobj/ELF/no-phdrs.test b/llvm/test/tools/llvm-readobj/ELF/no-phdrs.test
new file mode 100644
index 00000000000..f01569596ac
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/no-phdrs.test
@@ -0,0 +1,24 @@
+# Show that llvm-readobj can handle no program headers when --program-headers
+# is requested, both for LLVM and GNU output.
+
+# RUN: yaml2obj %s -o %t
+# RUN: llvm-readobj %t --program-headers | FileCheck %s --check-prefix=LLVM
+# RUN: llvm-readelf %t --program-headers | FileCheck %s --check-prefix=GNU
+
+# LLVM: ProgramHeaders [
+# LLVM-NEXT: ]
+
+# GNU: There are 0 program headers
+# GNU: Program Headers:
+# GNU-NEXT: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
+# GNU-EMPTY:
+# GNU-NEXT: Section to Segment mapping:
+# GNU-NEXT: Segment Sections...
+# GNU-NEXT: None .strtab .shstrtab
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
diff --git a/llvm/test/tools/llvm-readobj/ELF/no-relocs.test b/llvm/test/tools/llvm-readobj/ELF/no-relocs.test
new file mode 100644
index 00000000000..c632e9751dd
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/no-relocs.test
@@ -0,0 +1,46 @@
+# Show that llvm-readobj can handle no relocations when --relocations is
+# requested, both for LLVM and GNU output, both for no relocation sections and
+# for empty relocation sections.
+
+# RUN: yaml2obj %s -o %t.no_relocs
+# RUN: llvm-readobj %t.no_relocs --relocations | FileCheck %s --check-prefix NO-RELOCS-LLVM
+# RUN: llvm-readelf %t.no_relocs --relocations | FileCheck %s --check-prefix NO-RELOCS-GNU
+
+# RUN: llvm-objcopy -R .rela.text -R .rel.text %t.no_relocs %t.no_sec
+# RUN: llvm-readobj %t.no_sec --relocations | FileCheck %s --check-prefix NO-SEC-LLVM
+# RUN: llvm-readelf %t.no_sec --relocations | FileCheck %s --check-prefix NO-SEC-GNU
+
+# NO-RELOCS-LLVM: Relocations [
+# NO-RELOCS-LLVM-NEXT: Section (2) .rela.text {
+# NO-RELOCS-LLVM-NEXT: }
+# NO-RELOCS-LLVM-NEXT: Section (3) .rel.text {
+# NO-RELOCS-LLVM-NEXT: }
+# NO-RELOCS-LLVM-NEXT: ]
+
+# NO-RELOCS-GNU: Relocation section '.rela.text' at offset {{.*}} contains 0 entries:
+# NO-RELOCS-GNU-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend
+# NO-RELOCS-GNU-EMPTY:
+# NO-RELOCS-GNU-NEXT: Relocation section '.rel.text' at offset {{.*}} contains 0 entries:
+# NO-RELOCS-GNU-NEXT: Offset Info Type Symbol's Value Symbol's Name
+# NO-RELOCS-GNU-EMPTY:
+
+# NO-SEC-LLVM: Relocations [
+# NO-SEC-LLVM-NEXT: ]
+
+# NO-SEC-GNU: There are no relocations in this file.
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ - Name: .rela.text
+ Type: SHT_RELA
+ Info: .text
+ - Name: .rel.text
+ Type: SHT_REL
+ Info: .text
diff --git a/llvm/test/tools/llvm-readobj/ELF/no-shdrs.test b/llvm/test/tools/llvm-readobj/ELF/no-shdrs.test
new file mode 100644
index 00000000000..4e21ae70e4d
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/no-shdrs.test
@@ -0,0 +1,33 @@
+# Show that llvm-readobj can handle ELF files where the section header table has
+# been stripped, both for GNU and LLVM style output.
+
+# RUN: yaml2obj %s -o %t.raw
+# RUN: llvm-objcopy --strip-sections %t.raw %t.o
+# RUN: llvm-readobj --file-headers --section-headers --symbols %t.o | FileCheck %s --check-prefix=LLVM
+# RUN: llvm-readelf --file-headers --section-headers --symbols %t.o | FileCheck %s --check-prefix=GNU --allow-empty
+
+# LLVM: SectionHeaderCount: 0
+# LLVM: StringTableSectionIndex: 0
+# LLVM: Sections [
+# LLVM-NEXT: ]
+# LLVM-NEXT: Symbols [
+# LLVM-NEXT: ]
+
+# GNU: Number of section headers: 0
+# GNU: Section header string table index: 0
+# GNU: There are 0 section headers
+# GNU-NOT: Symbol table '{{.*}}' contains {{.*}} entries
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+Symbols:
+ - Name: foobar
+ Section: .text
+ Binding: STB_GLOBAL
diff --git a/llvm/test/tools/llvm-readobj/ELF/non-dynamic-in-pt-dynamic.test b/llvm/test/tools/llvm-readobj/ELF/non-dynamic-in-pt-dynamic.test
new file mode 100644
index 00000000000..77dea95903e
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/non-dynamic-in-pt-dynamic.test
@@ -0,0 +1,172 @@
+## Show that llvm-readobj/llvm-readelf tools can dump the .dynamic section which
+## is not alone in PT_DYNAMIC segment.
+
+## In the first case .text is placed before .dynamic.
+## We check that we warn about this case.
+
+# RUN: yaml2obj --docnum=1 %s -o %t1.o
+# RUN: llvm-readobj --dynamic-table %t1.o 2>&1 \
+# RUN: | FileCheck %s --DFILE=%t1.o --check-prefixes=WARNING,LLVM
+# RUN: llvm-readelf --dynamic-table %t1.o 2>&1 \
+# RUN: | FileCheck %s --DFILE=%t1.o --check-prefixes=WARNING,GNU
+
+# WARNING: warning: '[[FILE]]': The SHT_DYNAMIC section '.dynamic' is not at the start of PT_DYNAMIC segment
+# WARNING: warning: '[[FILE]]': invalid section size (33) or entity size (16)
+# WARNING: warning: '[[FILE]]': SHT_DYNAMIC section header and PT_DYNAMIC program header disagree about the location of the dynamic table
+# WARNING: warning: '[[FILE]]': PT_DYNAMIC dynamic table is invalid: SHT_DYNAMIC will be used
+
+# LLVM: DynamicSection [ (2 entries)
+# LLVM-NEXT: Tag Type Name/Value
+# LLVM-NEXT: 0x0000000000000018 BIND_NOW 0x1
+# LLVM-NEXT: 0x0000000000000000 NULL 0x0
+# LLVM-NEXT: ]
+
+# GNU: Dynamic section at offset 0x{{.*}} contains 2 entries:
+# GNU-NEXT: Tag Type Name/Value
+# GNU-NEXT: 0x0000000000000018 (BIND_NOW) 0x1
+# GNU-NEXT: 0x0000000000000000 (NULL) 0x0
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [SHF_ALLOC]
+ Address: 0x1000
+ AddressAlign: 0x100
+ Content: "00"
+ - Name: .dynamic
+ Type: SHT_DYNAMIC
+ Flags: [SHF_ALLOC]
+ Address: 0x1001
+ Entries:
+ - Tag: DT_BIND_NOW
+ Value: 0x1
+ - Tag: DT_NULL
+ Value: 0x0
+ProgramHeaders:
+ - Type: PT_LOAD
+ VAddr: 0x1000
+ Sections:
+ - Section: .text
+ - Section: .dynamic
+ - Type: PT_DYNAMIC
+ VAddr: 0x1000
+ Sections:
+ - Section: .text
+ - Section: .dynamic
+
+## In this case .text goes after .dynamic and we don't display any warnings,
+## though the content of the .text is used for dumping the dynamic table.
+
+# RUN: yaml2obj --docnum=2 %s -o %t2.o
+# RUN: llvm-readobj --dynamic-table %t2.o 2>&1 | FileCheck %s --check-prefix=LLVM2
+# RUN: llvm-readelf --dynamic-table %t2.o 2>&1 | FileCheck %s --check-prefix=GNU2
+
+# LLVM2: DynamicSection [ (3 entries)
+# LLVM2-NEXT: Tag Type Name/Value
+# LLVM2-NEXT: 0x0000000000000018 BIND_NOW 0x1
+# LLVM2-NEXT: 0x0000000000000018 BIND_NOW 0x2
+# LLVM2-NEXT: 0x0000000000000000 NULL 0x0
+# LLVM2-NEXT: ]
+
+# GNU2: Dynamic section at offset 0x{{.*}} contains 3 entries:
+# GNU2-NEXT: Tag Type Name/Value
+# GNU2-NEXT: 0x0000000000000018 (BIND_NOW) 0x1
+# GNU2-NEXT: 0x0000000000000018 (BIND_NOW) 0x2
+# GNU2-NEXT: 0x0000000000000000 (NULL) 0x0
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .dynamic
+ Type: SHT_DYNAMIC
+ Flags: [SHF_ALLOC]
+ Address: 0x1000
+ AddressAlign: 0x1000
+ Entries:
+ - Tag: DT_BIND_NOW
+ Value: 0x1
+ - Tag: DT_BIND_NOW
+ Value: 0x2
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [SHF_ALLOC]
+ Address: 0x1100
+ AddressAlign: 0x100
+ Content: "00000000000000000000000000000000"
+ProgramHeaders:
+ - Type: PT_LOAD
+ VAddr: 0x1000
+ Sections:
+ - Section: .dynamic
+ - Section: .text
+ - Type: PT_DYNAMIC
+ VAddr: 0x1000
+ Sections:
+ - Section: .dynamic
+ - Section: .text
+
+## In this case .text goes after .dynamic, but (PT_DYNAMIC segment size % dynamic entry size != 0)
+## and we have to use the information from the section header instead.
+
+# RUN: yaml2obj --docnum=3 %s -o %t3.o
+# RUN: llvm-readobj --dynamic-table %t3.o 2>&1 | FileCheck %s --DFILE=%t3.o --check-prefixes=WARNING2,LLVM3
+# RUN: llvm-readelf --dynamic-table %t3.o 2>&1 | FileCheck %s --DFILE=%t3.o --check-prefixes=WARNING2,GNU3
+
+# WARNING2: warning: '[[FILE]]': invalid section size (257) or entity size (16)
+# WARNING2: warning: '[[FILE]]': PT_DYNAMIC dynamic table is invalid: SHT_DYNAMIC will be used
+
+# LLVM3: DynamicSection [ (2 entries)
+# LLVM3-NEXT: Tag Type Name/Value
+# LLVM3-NEXT: 0x0000000000000018 BIND_NOW 0x1
+# LLVM3-NEXT: 0x0000000000000000 NULL 0x0
+# LLVM3-NEXT: ]
+
+# GNU3: Dynamic section at offset 0x{{.*}} contains 2 entries:
+# GNU3-NEXT: Tag Type Name/Value
+# GNU3-NEXT: 0x0000000000000018 (BIND_NOW) 0x1
+# GNU3-NEXT: 0x0000000000000000 (NULL) 0x0
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .dynamic
+ Type: SHT_DYNAMIC
+ Flags: [SHF_ALLOC]
+ Address: 0x1000
+ AddressAlign: 0x1000
+ Entries:
+ - Tag: DT_BIND_NOW
+ Value: 0x1
+ - Tag: DT_NULL
+ Value: 0x0
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [SHF_ALLOC]
+ Address: 0x1100
+ AddressAlign: 0x100
+ Content: "00"
+ProgramHeaders:
+ - Type: PT_LOAD
+ VAddr: 0x1000
+ Sections:
+ - Section: .dynamic
+ - Section: .text
+ - Type: PT_DYNAMIC
+ VAddr: 0x1000
+ Sections:
+ - Section: .dynamic
+ - Section: .text
diff --git a/llvm/test/tools/llvm-readobj/ELF/note-amd.s b/llvm/test/tools/llvm-readobj/ELF/note-amd.s
new file mode 100644
index 00000000000..df82b16b782
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/note-amd.s
@@ -0,0 +1,104 @@
+// REQUIRES: x86-registered-target
+// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o %t.o
+
+// RUN: llvm-readobj --notes %t.o | FileCheck %s --check-prefix=LLVM
+// RUN: llvm-readelf --notes %t.o | FileCheck %s --check-prefix=GNU
+
+// GNU: Displaying notes found
+// GNU-NEXT: Owner Data size Description
+// GNU-NEXT: AMD 0x00000000 NT_AMD_AMDGPU_HSA_METADATA (HSA Metadata)
+// GNU-NEXT: HSA Metadata:
+// GNU-NEXT: {{^ +$}}
+// GNU-NEXT: AMD 0x00000000 NT_AMD_AMDGPU_ISA (ISA Version)
+// GNU-NEXT: ISA Version:
+// GNU-NEXT: {{^ +$}}
+// 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-NEXT: AMD 0x00000009 NT_AMD_AMDGPU_ISA (ISA Version)
+// GNU-NEXT: ISA Version:
+// GNU-NEXT: isa_blah
+// GNU-NEXT: Displaying notes found
+// GNU-NEXT: Owner Data size Description
+// GNU-NEXT: AMD 0x00000000 NT_AMD_AMDGPU_PAL_METADATA (PAL Metadata)
+
+// LLVM: Notes [
+// LLVM-NEXT: NoteSection {
+// LLVM-NEXT: Offset:
+// LLVM-NEXT: Size:
+// LLVM-NEXT: Note {
+// LLVM-NEXT: Owner: AMD
+// LLVM-NEXT: Data size: 0x0
+// LLVM-NEXT: Type: NT_AMD_AMDGPU_HSA_METADATA (HSA Metadata)
+// LLVM-NEXT: HSA Metadata:
+// LLVM-NEXT: }
+// LLVM-NEXT: Note {
+// LLVM-NEXT: Owner: AMD
+// LLVM-NEXT: Data size: 0x0
+// LLVM-NEXT: Type: NT_AMD_AMDGPU_ISA (ISA Version)
+// LLVM-NEXT: ISA Version:
+// LLVM-NEXT: }
+// LLVM-NEXT: }
+// LLVM-NEXT: NoteSection {
+// LLVM-NEXT: Offset:
+// LLVM-NEXT: Size:
+// LLVM-NEXT: Note {
+// LLVM-NEXT: Owner: AMD
+// LLVM-NEXT: Data size: 0xA
+// LLVM-NEXT: Type: NT_AMD_AMDGPU_HSA_METADATA (HSA Metadata)
+// LLVM-NEXT: HSA Metadata: meta_blah
+// LLVM-NEXT: }
+// LLVM-NEXT: Note {
+// LLVM-NEXT: Owner: AMD
+// LLVM-NEXT: Data size: 0x9
+// LLVM-NEXT: Type: NT_AMD_AMDGPU_ISA (ISA Version)
+// LLVM-NEXT: ISA Version: isa_blah
+// LLVM-NEXT: }
+// LLVM-NEXT: }
+// LLVM-NEXT: NoteSection {
+// LLVM-NEXT: Offset:
+// LLVM-NEXT: Size:
+// LLVM-NEXT: Note {
+// LLVM-NEXT: Owner: AMD
+// LLVM-NEXT: Data size: 0x0
+// LLVM-NEXT: Type: NT_AMD_AMDGPU_PAL_METADATA (PAL Metadata)
+// LLVM-NEXT: }
+// LLVM-NEXT: }
+// LLVM-NEXT: ]
+
+.section ".note.no.desc", "a"
+ .align 4
+ .long 4 /* namesz */
+ .long 0 /* descsz */
+ .long 10 /* type = NT_AMD_AMDGPU_HSA_METADATA */
+ .asciz "AMD"
+ .long 4 /* namesz */
+ .long 0 /* descsz */
+ .long 11 /* type = NT_AMD_AMDGPU_ISA */
+ .asciz "AMD"
+.section ".note.desc", "a"
+ .align 4
+ .long 4 /* namesz */
+ .long end.meta - begin.meta /* descsz */
+ .long 10 /* type = NT_AMD_AMDGPU_HSA_METADATA */
+ .asciz "AMD"
+begin.meta:
+ .asciz "meta_blah"
+end.meta:
+ .align 4
+ .long 4 /* namesz */
+ .long end.isa - begin.isa /* descsz */
+ .long 11 /* type = NT_AMD_AMDGPU_ISA */
+ .asciz "AMD"
+begin.isa:
+ .asciz "isa_blah"
+end.isa:
+ .align 4
+.section ".note.other", "a"
+ .align 4
+ .long 4 /* namesz */
+ .long 0 /* descsz */
+ .long 12 /* type = NT_AMD_AMDGPU_PAL_METADATA */
+ .asciz "AMD"
diff --git a/llvm/test/tools/llvm-readobj/ELF/note-amdgpu.test b/llvm/test/tools/llvm-readobj/ELF/note-amdgpu.test
new file mode 100644
index 00000000000..51440dd4a5b
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/note-amdgpu.test
@@ -0,0 +1,85 @@
+# RUN: yaml2obj %s > %t.o
+# RUN: llvm-readobj --notes %t.o | FileCheck %s --check-prefix=LLVM
+# RUN: llvm-readelf --notes %t.o | FileCheck %s --check-prefix=GNU
+
+# GNU: Displaying notes found
+# GNU-NEXT: Owner Data size Description
+# GNU-NEXT: AMDGPU 0x000000e6 NT_AMDGPU_METADATA (AMDGPU Metadata)
+# GNU-NEXT: AMDGPU Metadata:
+# GNU-NEXT: ---
+# GNU-NEXT: amdhsa.kernels:
+# GNU-NEXT: - .group_segment_fixed_size: 2
+# GNU-NEXT: .kernarg_segment_align: 4
+# GNU-NEXT: .kernarg_segment_size: 1
+# GNU-NEXT: .max_flat_workgroup_size: 8
+# GNU-NEXT: .name: foo
+# GNU-NEXT: .private_segment_fixed_size: 3
+# GNU-NEXT: .sgpr_count: 6
+# GNU-NEXT: .symbol: foo
+# GNU-NEXT: .vgpr_count: 7
+# GNU-NEXT: .wavefront_size: 5
+# GNU-NEXT: amdhsa.version:
+# GNU-NEXT: - 1
+# GNU-NEXT: - 0
+# GNU-NEXT: ...
+
+# LLVM: Notes [
+# LLVM-NEXT: NoteSection {
+# LLVM-NEXT: Offset:
+# LLVM-NEXT: Size:
+# LLVM-NEXT: Note {
+# LLVM-NEXT: Owner: AMDGPU
+# LLVM-NEXT: Data size: 0xE6
+# LLVM-NEXT: Type: NT_AMDGPU_METADATA (AMDGPU Metadata)
+# LLVM-NEXT: AMDGPU Metadata: ---
+# LLVM-NEXT: amdhsa.kernels:
+# LLVM-NEXT: - .group_segment_fixed_size: 2
+# LLVM-NEXT: .kernarg_segment_align: 4
+# LLVM-NEXT: .kernarg_segment_size: 1
+# LLVM-NEXT: .max_flat_workgroup_size: 8
+# LLVM-NEXT: .name: foo
+# LLVM-NEXT: .private_segment_fixed_size: 3
+# LLVM-NEXT: .sgpr_count: 6
+# LLVM-NEXT: .symbol: foo
+# LLVM-NEXT: .vgpr_count: 7
+# LLVM-NEXT: .wavefront_size: 5
+# LLVM-NEXT: amdhsa.version:
+# LLVM-NEXT: - 1
+# LLVM-NEXT: - 0
+# LLVM-NEXT: ...
+# LLVM-EMPTY:
+# LLVM-NEXT: }
+# LLVM-NEXT: }
+# LLVM-NEXT: ]
+
+## Use yaml2obj instead of llvm-mc for more test portability. This was
+## generated by grabbing section data from an object built via:
+# $ llvm-mc -filetype=obj -triple amdgcn-amd-amdhsa -mattr=+code-object-v3 %s -o %t.o
+## On input:
+# .amdgpu_metadata
+# amdhsa.version:
+# - 1
+# - 0
+# amdhsa.kernels:
+# - .name: foo
+# .symbol: foo
+# .kernarg_segment_size: 1
+# .group_segment_fixed_size: 2
+# .private_segment_fixed_size: 3
+# .kernarg_segment_align: 4
+# .wavefront_size: 5
+# .sgpr_count: 6
+# .vgpr_count: 7
+# .max_flat_workgroup_size: 8
+# .end_amdgpu_metadata
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .note.foo
+ Type: SHT_NOTE
+ Content: 07000000E600000020000000414D44475055000082AE616D646873612E6B65726E656C73918AB92E67726F75705F7365676D656E745F66697865645F73697A6502B62E6B65726E6172675F7365676D656E745F616C69676E04B52E6B65726E6172675F7365676D656E745F73697A6501B82E6D61785F666C61745F776F726B67726F75705F73697A6508A52E6E616D65A3666F6FBB2E707269766174655F7365676D656E745F66697865645F73697A6503AB2E736770725F636F756E7406A72E73796D626F6CA3666F6FAB2E766770725F636F756E7407AF2E7761766566726F6E745F73697A6505AE616D646873612E76657273696F6E9201000000
diff --git a/llvm/test/tools/llvm-readobj/ELF/note-core-ntfile-bad.test b/llvm/test/tools/llvm-readobj/ELF/note-core-ntfile-bad.test
new file mode 100644
index 00000000000..24ee3453786
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/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 -DFILE=%t1.o %s --check-prefix=ERR-HEADER-SHORT
+# ERR-HEADER-SHORT: warning: '[[FILE]]': 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 -DFILE=%t2.o %s --check-prefix=ERR-NULL-TERM
+# ERR-NULL-TERM: warning: '[[FILE]]': 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 -DFILE=%t3.o %s --check-prefix=ERR-FILE-COUNT
+# ERR-FILE-COUNT: warning: '[[FILE]]': 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 -DFILE=%t4.o %s --check-prefix=ERR-FILE-END-EARLY
+# ERR-FILE-END-EARLY: warning: '[[FILE]]': 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/ELF/note-core-ntfile.test b/llvm/test/tools/llvm-readobj/ELF/note-core-ntfile.test
new file mode 100644
index 00000000000..b5dc684dc42
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/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/ELF/note-core.test b/llvm/test/tools/llvm-readobj/ELF/note-core.test
new file mode 100644
index 00000000000..314be84d7d7
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/note-core.test
@@ -0,0 +1,61 @@
+## Test that note values are interpreted correctly for core files.
+
+# 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
+
+--- !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
+
+# GNU: Displaying notes found
+# GNU-NEXT: Owner Data size Description
+# GNU-NEXT: CORE 0x00000000 NT_PRSTATUS (prstatus structure)
+# GNU-NEXT: CORE 0x00000000 NT_FPREGSET (floating point registers)
+# GNU-NEXT: CORE 0x00000000 NT_PRPSINFO (prpsinfo structure)
+# GNU-NEXT: CORE 0x00000000 NT_TASKSTRUCT (task structure)
+# GNU-NEXT: CORE 0x00000000 NT_AUXV (auxiliary vector)
+
+# LLVM: Notes [
+# LLVM-NEXT: NoteSection {
+# LLVM-NEXT: Offset:
+# LLVM-NEXT: Size:
+# LLVM-NEXT: Note {
+# LLVM-NEXT: Owner: CORE
+# LLVM-NEXT: Data size: 0x0
+# LLVM-NEXT: Type: NT_PRSTATUS (prstatus structure)
+# LLVM-NEXT: }
+# LLVM-NEXT: Note {
+# LLVM-NEXT: Owner: CORE
+# LLVM-NEXT: Data size: 0x0
+# LLVM-NEXT: Type: NT_FPREGSET (floating point registers)
+# LLVM-NEXT: }
+# LLVM-NEXT: Note {
+# LLVM-NEXT: Owner: CORE
+# LLVM-NEXT: Data size: 0x0
+# LLVM-NEXT: Type: NT_PRPSINFO (prpsinfo structure)
+# LLVM-NEXT: }
+# LLVM-NEXT: Note {
+# LLVM-NEXT: Owner: CORE
+# LLVM-NEXT: Data size: 0x0
+# LLVM-NEXT: Type: NT_TASKSTRUCT (task structure)
+# LLVM-NEXT: }
+# LLVM-NEXT: Note {
+# LLVM-NEXT: Owner: CORE
+# LLVM-NEXT: Data size: 0x0
+# LLVM-NEXT: Type: NT_AUXV (auxiliary vector)
+# LLVM-NEXT: }
+# LLVM-NEXT: }
+# LLVM-NEXT: ]
diff --git a/llvm/test/tools/llvm-readobj/ELF/note-freebsd.s b/llvm/test/tools/llvm-readobj/ELF/note-freebsd.s
new file mode 100644
index 00000000000..fbb7ac147d9
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/note-freebsd.s
@@ -0,0 +1,83 @@
+// REQUIRES: x86-registered-target
+// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o %t.o
+
+// RUN: llvm-readobj --notes %t.o | FileCheck %s --check-prefix=LLVM
+// RUN: llvm-readelf --notes %t.o | FileCheck %s --check-prefix=GNU
+
+// GNU: Displaying notes found
+// GNU-NEXT: Owner Data size Description
+// GNU-NEXT: FreeBSD 0x00000000 NT_THRMISC (thrmisc structure)
+// GNU-NEXT: FreeBSD 0x00000000 NT_PROCSTAT_PROC (proc data)
+// 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 {
+// LLVM-NEXT: Offset:
+// LLVM-NEXT: Size:
+// LLVM-NEXT: Note {
+// LLVM-NEXT: Owner: FreeBSD
+// LLVM-NEXT: Data size: 0x0
+// LLVM-NEXT: Type: NT_THRMISC (thrmisc structure)
+// LLVM-NEXT: }
+// LLVM-NEXT: Note {
+// LLVM-NEXT: Owner: FreeBSD
+// LLVM-NEXT: Data size: 0x0
+// LLVM-NEXT: Type: NT_PROCSTAT_PROC (proc data)
+// LLVM-NEXT: }
+// LLVM-NEXT: }
+// LLVM-NEXT: NoteSection {
+// LLVM-NEXT: Offset: 0x68
+// LLVM-NEXT: Size: 0x14
+// LLVM-NEXT: Note {
+// LLVM-NEXT: Owner: FreeBSD
+// LLVM-NEXT: Data size: 0x0
+// 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"
+ .align 4
+ .long 8 /* namesz */
+ .long 0 /* descsz */
+ .long 7 /* type = NT_FREEBSD_THRMISC */
+ .asciz "FreeBSD"
+ .long 8 /* namesz */
+ .long 0 /* descsz */
+ .long 8 /* type = NT_FREEBSD_PROC */
+ .asciz "FreeBSD"
+.section ".note.bar", "a"
+ .align 4
+ .long 8 /* namesz */
+ .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/ELF/note-generic.s b/llvm/test/tools/llvm-readobj/ELF/note-generic.s
new file mode 100644
index 00000000000..7b3b85fc56b
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/note-generic.s
@@ -0,0 +1,85 @@
+// REQUIRES: x86-registered-target
+// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o %t.o
+
+// RUN: llvm-readobj --notes %t.o | FileCheck %s --check-prefix=LLVM
+// RUN: llvm-readelf --notes %t.o | FileCheck %s --check-prefix=GNU
+
+// GNU: Displaying notes found at file offset 0x00000040 with length 0x00000010:
+// GNU-NEXT: Owner Data size Description
+// GNU-NEXT: XYZ 0x00000000 NT_VERSION (version)
+
+// GNU: Displaying notes found at file offset 0x00000050 with length 0x00000010:
+// GNU-NEXT: Owner Data size Description
+// GNU-NEXT: XYZ 0x00000000 NT_ARCH (architecture)
+
+// GNU: Displaying notes found at file offset 0x00000060 with length 0x00000010:
+// GNU-NEXT: Owner Data size Description
+// GNU-NEXT: XYZ 0x00000000 OPEN
+
+// GNU: Displaying notes found at file offset 0x00000070 with length 0x00000010:
+// GNU-NEXT: Owner Data size Description
+// GNU-NEXT: XYZ 0x00000000 func
+
+// LLVM: Notes [
+// LLVM-NEXT: NoteSection {
+// LLVM-NEXT: Offset: 0x40
+// LLVM-NEXT: Size: 0x10
+// LLVM-NEXT: Note {
+// LLVM-NEXT: Owner: XYZ
+// LLVM-NEXT: Data size: 0x0
+// LLVM-NEXT: Type: NT_VERSION (version)
+// LLVM-NEXT: }
+// LLVM-NEXT: }
+// LLVM-NEXT: NoteSection {
+// LLVM-NEXT: Offset: 0x50
+// LLVM-NEXT: Size: 0x10
+// LLVM-NEXT: Note {
+// LLVM-NEXT: Owner: XYZ
+// LLVM-NEXT: Data size: 0x0
+// LLVM-NEXT: Type: NT_ARCH (architecture)
+// LLVM-NEXT: }
+// LLVM-NEXT: }
+// LLVM-NEXT: NoteSection {
+// LLVM-NEXT: Offset: 0x60
+// LLVM-NEXT: Size: 0x10
+// LLVM-NEXT: Note {
+// LLVM-NEXT: Owner: XYZ
+// LLVM-NEXT: Data size: 0x0
+// LLVM-NEXT: Type: OPEN
+// LLVM-NEXT: }
+// LLVM-NEXT: }
+// LLVM-NEXT: NoteSection {
+// LLVM-NEXT: Offset: 0x70
+// LLVM-NEXT: Size: 0x10
+// LLVM-NEXT: Note {
+// LLVM-NEXT: Owner: XYZ
+// LLVM-NEXT: Data size: 0x0
+// LLVM-NEXT: Type: func
+// LLVM-NEXT: }
+// LLVM-NEXT: }
+// LLVM-NEXT: ]
+
+.section ".note.version", "a"
+ .align 4
+ .long 4 /* namesz */
+ .long 0 /* descsz */
+ .long 1 /* type = NT_VERSION */
+ .asciz "XYZ"
+.section ".note.arch", "a"
+ .align 4
+ .long 4 /* namesz */
+ .long 0 /* descsz */
+ .long 2 /* type = NT_ARCH*/
+ .asciz "XYZ"
+.section ".note.open", "a"
+ .align 4
+ .long 4 /* namesz */
+ .long 0 /* descsz */
+ .long 0x100 /* type = NT_GNU_BUILD_ATTRIBUTE_OPEN*/
+ .asciz "XYZ"
+.section ".note.func", "a"
+ .align 4
+ .long 4 /* namesz */
+ .long 0 /* descsz */
+ .long 0x101 /* type = NT_GNU_BUILD_ATTRIBUTE_FUNC*/
+ .asciz "XYZ"
diff --git a/llvm/test/tools/llvm-readobj/ELF/note-gnu-property.s b/llvm/test/tools/llvm-readobj/ELF/note-gnu-property.s
new file mode 100644
index 00000000000..931dce6ba8f
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/note-gnu-property.s
@@ -0,0 +1,157 @@
+// REQUIRES: x86-registered-target
+// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o %t
+// RUN: llvm-readelf --notes %t | FileCheck %s --check-prefix=GNU
+// RUN: llvm-readobj --elf-output-style LLVM --notes %t | FileCheck %s --check-prefix=LLVM
+
+// GNU: Displaying notes found at file offset 0x00000040 with length 0x000000f8:
+// GNU-NEXT: Owner Data size Description
+// GNU-NEXT: GNU 0x000000e8 NT_GNU_PROPERTY_TYPE_0 (property note)
+// GNU-NEXT: Properties: stack size: 0x100
+// GNU-NEXT: stack size: 0x100
+// GNU-NEXT: no copy on protected
+// GNU-NEXT: x86 feature: SHSTK
+// GNU-NEXT: x86 feature: IBT, SHSTK
+// GNU-NEXT: x86 feature: <None>
+// GNU-NEXT: x86 ISA needed: CMOV, SSE, SSE2, SSE3, SSSE3, SSE4_1, SSE4_2, AVX, AVX2, FMA, AVX512F, AVX512CD
+// GNU-NEXT: x86 ISA used: AVX512ER, AVX512PF, AVX512VL, AVX512DQ, AVX512BW, AVX512_4FMAPS, AVX512_4VNNIW, AVX512_BITALG, AVX512_IFMA, AVX512_VBMI, AVX512_VBMI2, AVX512_VNNI
+// GNU-NEXT: x86 feature needed: x86, x87, MMX, XMM, YMM
+// GNU-NEXT: x86 feature used: ZMM, FXSR, XSAVE, XSAVEOPT, XSAVEC
+// GNU-NEXT: <application-specific type 0xfefefefe>
+// GNU-NEXT: stack size: <corrupt length: 0x0>
+// GNU-NEXT: stack size: <corrupt length: 0x4>
+// GNU-NEXT: no copy on protected <corrupt length: 0x1>
+// GNU-NEXT: x86 feature: <corrupt length: 0x0>
+// GNU-NEXT: x86 feature: IBT, <unknown flags: 0xf000f000>
+// GNU-NEXT: <corrupt type (0x2) datasz: 0x1>
+
+// LLVM: Notes [
+// LLVM-NEXT: NoteSection {
+// LLVM-NEXT: Offset: 0x40
+// LLVM-NEXT: Size: 0xF8
+// LLVM-NEXT: Note {
+// LLVM-NEXT: Owner: GNU
+// LLVM-NEXT: Data size: 0xE8
+// LLVM-NEXT: Type: NT_GNU_PROPERTY_TYPE_0 (property note)
+// LLVM-NEXT: Property [
+// LLVM-NEXT: stack size: 0x100
+// LLVM-NEXT: stack size: 0x100
+// LLVM-NEXT: no copy on protected
+// LLVM-NEXT: x86 feature: SHSTK
+// LLVM-NEXT: x86 feature: IBT, SHSTK
+// LLVM-NEXT: x86 feature: <None>
+// LLVM-NEXT: x86 ISA needed: CMOV, SSE, SSE2, SSE3, SSSE3, SSE4_1, SSE4_2, AVX, AVX2, FMA, AVX512F, AVX512CD
+// LLVM-NEXT: x86 ISA used: AVX512ER, AVX512PF, AVX512VL, AVX512DQ, AVX512BW, AVX512_4FMAPS, AVX512_4VNNIW, AVX512_BITALG, AVX512_IFMA, AVX512_VBMI, AVX512_VBMI2, AVX512_VNNI
+// LLVM-NEXT: x86 feature needed: x86, x87, MMX, XMM, YMM
+// LLVM-NEXT: x86 feature used: ZMM, FXSR, XSAVE, XSAVEOPT, XSAVEC
+// LLVM-NEXT: <application-specific type 0xfefefefe>
+// LLVM-NEXT: stack size: <corrupt length: 0x0>
+// LLVM-NEXT: stack size: <corrupt length: 0x4>
+// LLVM-NEXT: no copy on protected <corrupt length: 0x1>
+// LLVM-NEXT: x86 feature: <corrupt length: 0x0>
+// LLVM-NEXT: x86 feature: IBT, <unknown flags: 0xf000f000>
+// LLVM-NEXT: <corrupt type (0x2) datasz: 0x1>
+// LLVM-NEXT: ]
+// LLVM-NEXT: }
+// LLVM-NEXT: }
+// LLVM-NEXT: ]
+
+.section ".note.gnu.property", "a"
+.align 4
+ .long 4 /* Name length is always 4 ("GNU") */
+ .long end - begin /* Data length */
+ .long 5 /* Type: NT_GNU_PROPERTY_TYPE_0 */
+ .asciz "GNU" /* Name */
+ .p2align 3
+begin:
+ .long 1 /* Type: GNU_PROPERTY_STACK_SIZE */
+ .long 8 /* Data size */
+ .quad 0x100 /* Data (stack size) */
+ .p2align 3 /* Align to 8 byte for 64 bit */
+
+ /* Test we handle alignment properly */
+ .long 1 /* Type: GNU_PROPERTY_STACK_SIZE */
+ .long 8 /* Data size */
+ .long 0x100 /* Data (stack size) */
+ .p2align 3 /* Align to 8 byte for 64 bit */
+
+ .long 2 /* Type: GNU_PROPERTY_NO_COPY_ON_PROTECTED */
+ .long 0 /* Data size */
+ .p2align 3 /* Align to 8 byte for 64 bit */
+
+ /* CET property note */
+ .long 0xc0000002 /* Type: GNU_PROPERTY_X86_FEATURE_1_AND */
+ .long 4 /* Data size */
+ .long 2 /* GNU_PROPERTY_X86_FEATURE_1_SHSTK */
+ .p2align 3 /* Align to 8 byte for 64 bit */
+
+ /* CET property note with padding */
+ .long 0xc0000002 /* Type: GNU_PROPERTY_X86_FEATURE_1_AND */
+ .long 4 /* Data size */
+ .long 3 /* Full CET support */
+ .p2align 3 /* Align to 8 byte for 64 bit */
+
+ .long 0xc0000002 /* Type: GNU_PROPERTY_X86_FEATURE_1_AND */
+ .long 4 /* Data size */
+ .long 0 /* Empty flags, not an error */
+ .p2align 3 /* Align to 8 byte for 64 bit */
+
+ .long 0xc0008000 /* Type: GNU_PROPERTY_X86_ISA_1_NEEDED */
+ .long 4 /* Data size */
+ .long 0x00000fff /* CMOV, ... */
+ .p2align 3 /* Align to 8 byte for 64 bit */
+
+ .long 0xc0010000 /* Type: GNU_PROPERTY_X86_ISA_1_USED */
+ .long 4 /* Data size */
+ .long 0x00fff000 /* AVX512_ER, ... */
+ .p2align 3 /* Align to 8 byte for 64 bit */
+
+ .long 0xc0008001 /* Type: GNU_PROPERTY_X86_FEATURE_2_NEEDED */
+ .long 4 /* Data size */
+ .long 0x0000001f /* X86, ... */
+ .p2align 3 /* Align to 8 byte for 64 bit */
+
+ .long 0xc0010001 /* Type: GNU_PROPERTY_X86_FEATURE_2_USED */
+ .long 4 /* Data size */
+ .long 0x000003e0 /* ZMM, ... */
+ .p2align 3 /* Align to 8 byte for 64 bit */
+
+ /* All notes below are broken. Test we are able to report them. */
+
+ /* Broken note type */
+ .long 0xfefefefe /* Invalid type for testing */
+ .long 0 /* Data size */
+ .p2align 3 /* Align to 8 byte for 64 bit */
+
+ /* GNU_PROPERTY_STACK_SIZE with zero stack size */
+ .long 1 /* Type: GNU_PROPERTY_STACK_SIZE */
+ .long 0 /* Data size */
+ .p2align 3 /* Align to 8 byte for 64 bit */
+
+ /* GNU_PROPERTY_STACK_SIZE with data size 4 (should be 8) */
+ .long 1 /* Type: GNU_PROPERTY_STACK_SIZE */
+ .long 4 /* Data size */
+ .long 0x100 /* Data (stack size) */
+ .p2align 3 /* Align to 8 byte for 64 bit */
+
+ /* GNU_PROPERTY_NO_COPY_ON_PROTECTED with pr_datasz and some data */
+ .long 2 /* Type: GNU_PROPERTY_NO_COPY_ON_PROTECTED */
+ .long 1 /* Data size (corrupted) */
+ .byte 1 /* Data */
+ .p2align 3 /* Align to 8 byte for 64 bit */
+
+ /* CET note with size zero */
+ .long 0xc0000002 /* Type: GNU_PROPERTY_X86_FEATURE_1_AND */
+ .long 0 /* Data size */
+ .p2align 3 /* Align to 8 byte for 64 bit */
+
+ /* CET note with bad flags */
+ .long 0xc0000002 /* Type: GNU_PROPERTY_X86_FEATURE_1_AND */
+ .long 4 /* Data size */
+ .long 0xf000f001 /* GNU_PROPERTY_X86_FEATURE_1_IBT and bad bits */
+ .p2align 3 /* Align to 8 byte for 64 bit */
+
+ /* GNU_PROPERTY_NO_COPY_ON_PROTECTED with pr_datasz and without data */
+ .long 2 /* Type: GNU_PROPERTY_NO_COPY_ON_PROTECTED */
+ .long 1 /* Data size (corrupted) */
+ .p2align 3 /* Align to 8 byte for 64 bit */
+end:
diff --git a/llvm/test/tools/llvm-readobj/ELF/note-gnu-property2.s b/llvm/test/tools/llvm-readobj/ELF/note-gnu-property2.s
new file mode 100644
index 00000000000..899f6cdbd75
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/note-gnu-property2.s
@@ -0,0 +1,37 @@
+// REQUIRES: x86-registered-target
+// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o %t
+// RUN: llvm-readelf --notes %t | FileCheck %s --check-prefix=GNU
+// RUN: llvm-readobj --elf-output-style LLVM --notes %t | FileCheck %s --check-prefix=LLVM
+
+// GNU: Displaying notes found at file offset 0x00000040 with length 0x00000014:
+// GNU-NEXT: Owner Data size Description
+// GNU-NEXT: GNU 0x00000004 NT_GNU_PROPERTY_TYPE_0 (property note)
+// GNU-NEXT: Properties: <corrupted GNU_PROPERTY_TYPE_0>
+
+// LLVM: Notes [
+// LLVM-NEXT: NoteSection {
+// LLVM-NEXT: Offset: 0x40
+// LLVM-NEXT: Size: 0x14
+// LLVM-NEXT: Note {
+// LLVM-NEXT: Owner: GNU
+// LLVM-NEXT: Data size: 0x4
+// LLVM-NEXT: Type: NT_GNU_PROPERTY_TYPE_0 (property note)
+// LLVM-NEXT: Property [
+// LLVM-NEXT: <corrupted GNU_PROPERTY_TYPE_0>
+// LLVM-NEXT: ]
+// LLVM-NEXT: }
+// LLVM-NEXT: }
+// LLVM-NEXT: ]
+
+// Section below is broken, check we report that.
+
+.section ".note.gnu.property", "a"
+.align 4
+ .long 4 /* Name length is always 4 ("GNU") */
+ .long end - begin /* Data length */
+ .long 5 /* Type: NT_GNU_PROPERTY_TYPE_0 */
+ .asciz "GNU" /* Name */
+ .p2align 3
+begin:
+ .long 1 /* Type: GNU_PROPERTY_STACK_SIZE */
+end:
diff --git a/llvm/test/tools/llvm-readobj/ELF/note-unknown.s b/llvm/test/tools/llvm-readobj/ELF/note-unknown.s
new file mode 100644
index 00000000000..632db2880ea
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/note-unknown.s
@@ -0,0 +1,55 @@
+// REQUIRES: x86-registered-target
+// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o %t.o
+
+// RUN: llvm-readobj --notes %t.o | FileCheck %s --check-prefix=LLVM
+// RUN: llvm-readelf --notes %t.o | FileCheck %s --check-prefix=GNU
+
+// 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 {
+// LLVM-NEXT: Offset: 0x40
+// LLVM-NEXT: Size: 0x10
+// LLVM-NEXT: Note {
+// LLVM-NEXT: Owner: XYZ
+// LLVM-NEXT: Data size: 0x0
+// 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"
+ .align 4
+ .long 4 /* namesz */
+ .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:
diff --git a/llvm/test/tools/llvm-readobj/ELF/packed-relocs-empty.s b/llvm/test/tools/llvm-readobj/ELF/packed-relocs-empty.s
new file mode 100644
index 00000000000..28b35470de3
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/packed-relocs-empty.s
@@ -0,0 +1,12 @@
+// REQUIRES: x86-registered-target
+// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | llvm-readobj -r - | FileCheck %s
+
+// CHECK: Relocations [
+// CHECK-NEXT: Section (3) .rela.dyn {
+// CHECK-NEXT: }
+// CHECK-NEXT: ]
+
+.section .rela.dyn, "a", @0x60000001
+.ascii "APS2"
+.sleb128 0
+.sleb128 0
diff --git a/llvm/test/tools/llvm-readobj/ELF/packed-relocs-error1.s b/llvm/test/tools/llvm-readobj/ELF/packed-relocs-error1.s
new file mode 100644
index 00000000000..cfe2f8cf5bd
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/packed-relocs-error1.s
@@ -0,0 +1,7 @@
+// REQUIRES: x86-registered-target
+// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | not llvm-readobj -r - 2>&1 | FileCheck %s
+
+// CHECK: error: '<stdin>': invalid packed relocation header
+
+.section .rela.dyn, "a", @0x60000001
+.ascii "APS9"
diff --git a/llvm/test/tools/llvm-readobj/ELF/packed-relocs-error2.s b/llvm/test/tools/llvm-readobj/ELF/packed-relocs-error2.s
new file mode 100644
index 00000000000..6e8e9bf5bd1
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/packed-relocs-error2.s
@@ -0,0 +1,7 @@
+// REQUIRES: x86-registered-target
+// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | not llvm-readobj -r - 2>&1 | FileCheck %s
+
+// CHECK: error: '<stdin>': malformed sleb128, extends past end
+
+.section .rela.dyn, "a", @0x60000001
+.ascii "APS2"
diff --git a/llvm/test/tools/llvm-readobj/ELF/packed-relocs-error3.s b/llvm/test/tools/llvm-readobj/ELF/packed-relocs-error3.s
new file mode 100644
index 00000000000..8b18ca210aa
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/packed-relocs-error3.s
@@ -0,0 +1,9 @@
+// REQUIRES: x86-registered-target
+// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | not llvm-readobj -r - 2>&1 | FileCheck %s
+
+// CHECK: error: '<stdin>': malformed sleb128, extends past end
+
+.section .rela.dyn, "a", @0x60000001
+.ascii "APS2"
+.sleb128 4 // Number of relocations
+.sleb128 0 // Initial offset
diff --git a/llvm/test/tools/llvm-readobj/ELF/packed-relocs-error4.s b/llvm/test/tools/llvm-readobj/ELF/packed-relocs-error4.s
new file mode 100644
index 00000000000..05b95410898
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/packed-relocs-error4.s
@@ -0,0 +1,13 @@
+// REQUIRES: x86-registered-target
+// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | not llvm-readobj -r - 2>&1 | FileCheck %s
+
+// CHECK: error: '<stdin>': malformed sleb128, extends past end
+
+.section .rela.dyn, "a", @0x60000001
+.ascii "APS2"
+.sleb128 4 // Number of relocations
+.sleb128 0 // Initial offset
+
+.sleb128 2 // Number of relocations in group
+.sleb128 2 // RELOCATION_GROUPED_BY_OFFSET_DELTA_FLAG
+.sleb128 8 // offset delta
diff --git a/llvm/test/tools/llvm-readobj/ELF/packed-relocs-error5.s b/llvm/test/tools/llvm-readobj/ELF/packed-relocs-error5.s
new file mode 100644
index 00000000000..db2b0511478
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/packed-relocs-error5.s
@@ -0,0 +1,13 @@
+// REQUIRES: x86-registered-target
+// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | not llvm-readobj -r - 2>&1 | FileCheck %s
+
+// CHECK: error: '<stdin>': relocation group unexpectedly large
+
+.section .rela.dyn, "a", @0x60000001
+.ascii "APS2"
+.sleb128 4 // Number of relocations
+.sleb128 0 // Initial offset
+
+.sleb128 5 // Number of relocations in group
+.sleb128 2 // RELOCATION_GROUPED_BY_OFFSET_DELTA_FLAG
+.sleb128 8 // offset delta
diff --git a/llvm/test/tools/llvm-readobj/ELF/packed-relocs.test b/llvm/test/tools/llvm-readobj/ELF/packed-relocs.test
new file mode 100644
index 00000000000..4c1ddfcb40f
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/packed-relocs.test
@@ -0,0 +1,141 @@
+# The binary blobs in this file were created like this:
+# llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu Inputs/elf-packed-relocs1.s -o - | obj2yaml | grep Content:
+
+# RUN: yaml2obj -docnum 1 %s | llvm-readobj --relocations - | FileCheck --check-prefix=LLVM1 %s
+# LLVM1: Section (1) .rela.dyn {
+# LLVM1-NEXT: 0x1100 R_X86_64_RELATIVE - 0x0
+# LLVM1-NEXT: 0x1180 R_X86_64_RELATIVE - 0x0
+# LLVM1-NEXT: 0x1188 R_X86_64_64 sym1 0x0
+# LLVM1-NEXT: 0x1190 R_X86_64_64 sym2 0x0
+# LLVM1-NEXT: 0x1191 R_X86_64_64 sym1 0x8
+# LLVM1-NEXT: 0x1193 R_X86_64_64 sym2 0xC
+# LLVM1-NEXT: 0x1197 R_X86_64_64 sym1 0xA
+# LLVM1-NEXT: 0x119F R_X86_64_64 sym2 0xA
+# LLVM1-NEXT: }
+
+# RUN: yaml2obj -docnum 1 %s | llvm-readelf -relocations - | FileCheck --check-prefix=GNU1 %s
+# GNU1: Relocation section '.rela.dyn' at offset 0x40 contains 8 entries:
+# GNU1: 0000000000001100 0000000000000008 R_X86_64_RELATIVE 0
+# GNU1-NEXT: 0000000000001180 0000000000000008 R_X86_64_RELATIVE 0
+# GNU1-NEXT: 0000000000001188 0000000100000001 R_X86_64_64 0000000000000000 sym1 + 0
+# GNU1-NEXT: 0000000000001190 0000000200000001 R_X86_64_64 0000000000000000 sym2 + 0
+# GNU1-NEXT: 0000000000001191 0000000100000001 R_X86_64_64 0000000000000000 sym1 + 8
+# GNU1-NEXT: 0000000000001193 0000000200000001 R_X86_64_64 0000000000000000 sym2 + c
+# GNU1-NEXT: 0000000000001197 0000000100000001 R_X86_64_64 0000000000000000 sym1 + a
+# GNU1-NEXT: 000000000000119f 0000000200000001 R_X86_64_64 0000000000000000 sym2 + a
+
+# elf-packed-relocs1.s
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_DYN
+ Machine: EM_X86_64
+ Entry: 0x0000000000001000
+Sections:
+ - Name: .rela.dyn
+ Type: SHT_ANDROID_RELA
+ Flags: [ SHF_ALLOC ]
+ Address: 0x00000000000001C8
+ Link: .symtab
+ AddressAlign: 0x0000000000000001
+ Content: 41505332088020020108800280010202088180808010818080802002080181808080100802818080802004020C7E048180808010088180808020
+Symbols:
+ - Name: sym1
+ Binding: STB_GLOBAL
+ - Name: sym2
+ Binding: STB_GLOBAL
+...
+
+# RUN: yaml2obj -docnum 2 %s | llvm-readobj --relocations - | FileCheck --check-prefix=LLVM2 %s
+# LLVM2: Section (1) .rel.dyn {
+# LLVM2-NEXT: 0x1008 R_386_32 sym1 0x0
+# LLVM2-NEXT: 0x1010 R_386_GOT32 sym2 0x0
+# LLVM2-NEXT: 0x100C R_386_RELATIVE - 0x0
+# LLVM2-NEXT: 0x1008 R_386_RELATIVE - 0x0
+# LLVM2-NEXT: 0x1004 R_386_RELATIVE - 0x0
+# LLVM2-NEXT: 0x1000 R_386_RELATIVE - 0x0
+# LLVM2-NEXT: 0xFFC R_386_RELATIVE - 0x0
+# LLVM2-NEXT: 0xFF8 R_386_RELATIVE - 0x0
+# LLVM2-NEXT: 0xFF4 R_386_RELATIVE - 0x0
+# LLVM2-NEXT: 0xFF0 R_386_RELATIVE - 0x0
+# LLVM2-NEXT: }
+
+# RUN: yaml2obj -docnum 2 %s | llvm-readelf -relocations - | FileCheck --check-prefix=GNU2 %s
+# GNU2: Relocation section '.rel.dyn' at offset 0x34 contains 10 entries:
+# GNU2: 00001008 00000101 R_386_32 00000000 sym1
+# GNU2-NEXT: 00001010 00000203 R_386_GOT32 00000000 sym2
+# GNU2-NEXT: 0000100c 00000008 R_386_RELATIVE
+# GNU2-NEXT: 00001008 00000008 R_386_RELATIVE
+# GNU2-NEXT: 00001004 00000008 R_386_RELATIVE
+# GNU2-NEXT: 00001000 00000008 R_386_RELATIVE
+# GNU2-NEXT: 00000ffc 00000008 R_386_RELATIVE
+# GNU2-NEXT: 00000ff8 00000008 R_386_RELATIVE
+# GNU2-NEXT: 00000ff4 00000008 R_386_RELATIVE
+# GNU2-NEXT: 00000ff0 00000008 R_386_RELATIVE
+
+# elf-packed-relocs2.s
+--- !ELF
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_DYN
+ Machine: EM_386
+ Entry: 0x0000000000001000
+Sections:
+ - Name: .rel.dyn
+ Type: SHT_ANDROID_REL
+ Flags: [ SHF_ALLOC ]
+ Address: 0x00000000000001C8
+ Link: .symtab
+ AddressAlign: 0x0000000000000001
+ Content: 415053320A80200202088102830408037C08
+Symbols:
+ - Name: sym1
+ Binding: STB_GLOBAL
+ - Name: sym2
+ Binding: STB_GLOBAL
+...
+
+# RUN: yaml2obj -docnum 3 %s | llvm-readobj --relocations - | FileCheck --check-prefix=LLVM3 %s
+#
+# LLVM3: Section (1) .rela.dyn {
+# LLVM3-NEXT: 0x1100 R_X86_64_RELATIVE - 0x0
+# LLVM3-NEXT: 0x1180 R_X86_64_RELATIVE - 0x8
+# LLVM3-NEXT: 0x1200 R_X86_64_64 sym1 0x0
+# LLVM3-NEXT: 0x1208 R_X86_64_64 sym2 0x0
+# LLVM3-NEXT: 0x1210 R_X86_64_64 sym1 0x0
+# LLVM3-NEXT: 0x1218 R_X86_64_64 sym2 0x8
+# LLVM3-NEXT: }
+
+# RUN: yaml2obj -docnum 3 %s | llvm-readelf -relocations - | FileCheck --check-prefix=GNU3 %s
+# GNU3: Relocation section '.rela.dyn' at offset 0x40 contains 6 entries:
+# GNU3: 0000000000001100 0000000000000008 R_X86_64_RELATIVE 0
+# GNU3-NEXT: 0000000000001180 0000000000000008 R_X86_64_RELATIVE 8
+# GNU3-NEXT: 0000000000001200 0000000100000001 R_X86_64_64 0000000000000000 sym1 + 0
+# GNU3-NEXT: 0000000000001208 0000000200000001 R_X86_64_64 0000000000000000 sym2 + 0
+# GNU3-NEXT: 0000000000001210 0000000100000001 R_X86_64_64 0000000000000000 sym1 + 0
+# GNU3-NEXT: 0000000000001218 0000000200000001 R_X86_64_64 0000000000000000 sym2 + 8
+
+# elf-packed-relocs3.s
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_DYN
+ Machine: EM_X86_64
+ Entry: 0x0000000000001000
+Sections:
+ - Name: .rela.dyn
+ Type: SHT_ANDROID_RELA
+ Flags: [ SHF_ALLOC ]
+ Address: 0x00000000000001C8
+ Link: .symtab
+ AddressAlign: 0x0000000000000001
+ Content: 415053320680200208800208008001080802008001818080801008818080802002080881808080100008818080802008
+Symbols:
+ - Name: sym1
+ Binding: STB_GLOBAL
+ - Name: sym2
+ Binding: STB_GLOBAL
+...
diff --git a/llvm/test/tools/llvm-readobj/ELF/ppc64-glink.test b/llvm/test/tools/llvm-readobj/ELF/ppc64-glink.test
new file mode 100644
index 00000000000..ac361784e06
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/ppc64-glink.test
@@ -0,0 +1,11 @@
+# Check DT_PPC64_GLINK dynamic tag.
+
+RUN: llvm-readobj --dynamic-table %p/Inputs/ppc64.exe | FileCheck %s
+
+CHECK: Format: ELF64-ppc64
+CHECK: Arch: powerpc64le
+CHECK: AddressSize: 64bit
+
+CHECK: DynamicSection [ (25 entries)
+CHECK-NEXT: Tag Type Name/Value
+CHECK: 0x0000000070000000 PPC64_GLINK 0x10000830
diff --git a/llvm/test/tools/llvm-readobj/ELF/program-headers.test b/llvm/test/tools/llvm-readobj/ELF/program-headers.test
new file mode 100644
index 00000000000..119b3a4d9f0
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/program-headers.test
@@ -0,0 +1,170 @@
+# RUN: llvm-readobj --program-headers %p/../../../Object/Inputs/program-headers.elf-i386 \
+# RUN: | FileCheck %s -check-prefix ELF-I386
+# RUN: llvm-readobj -l %p/../../../Object/Inputs/program-headers.elf-i386 \
+# RUN: | FileCheck %s -check-prefix ELF-I386
+
+# ELF-I386: ProgramHeaders [
+# ELF-I386-NEXT: ProgramHeader {
+# ELF-I386-NEXT: Type: PT_LOAD (0x1)
+# ELF-I386-NEXT: Offset: 0x0
+# ELF-I386-NEXT: VirtualAddress: 0x8048000
+# ELF-I386-NEXT: PhysicalAddress: 0x8048000
+# ELF-I386-NEXT: FileSize: 308
+# ELF-I386-NEXT: MemSize: 308
+# ELF-I386-NEXT: Flags [ (0x5)
+# ELF-I386-NEXT: PF_R (0x4)
+# ELF-I386-NEXT: PF_X (0x1)
+# ELF-I386-NEXT: ]
+# ELF-I386-NEXT: Alignment: 4096
+# ELF-I386-NEXT: }
+# ELF-I386-NEXT: ProgramHeader {
+# ELF-I386-NEXT: Type: PT_GNU_STACK (0x6474E551)
+# ELF-I386-NEXT: Offset: 0x0
+# ELF-I386-NEXT: VirtualAddress: 0x0
+# ELF-I386-NEXT: PhysicalAddress: 0x0
+# ELF-I386-NEXT: FileSize: 0
+# ELF-I386-NEXT: MemSize: 0
+# ELF-I386-NEXT: Flags [ (0x6)
+# ELF-I386-NEXT: PF_R (0x4)
+# ELF-I386-NEXT: PF_W (0x2)
+# ELF-I386-NEXT: ]
+# ELF-I386-NEXT: Alignment: 4
+# ELF-I386-NEXT: }
+# ELF-I386-NEXT: ]
+
+# RUN: llvm-readobj -l %p/../../../Object/Inputs/program-headers.elf-x86-64 \
+# RUN: | FileCheck %s -check-prefix ELF-X86-64
+
+# ELF-X86-64: ProgramHeaders [
+# ELF-X86-64-NEXT: ProgramHeader {
+# ELF-X86-64-NEXT: Type: PT_LOAD (0x1)
+# ELF-X86-64-NEXT: Offset: 0x0
+# ELF-X86-64-NEXT: VirtualAddress: 0x400000
+# ELF-X86-64-NEXT: PhysicalAddress: 0x400000
+# ELF-X86-64-NEXT: FileSize: 312
+# ELF-X86-64-NEXT: MemSize: 312
+# ELF-X86-64-NEXT: Flags [ (0x5)
+# ELF-X86-64-NEXT: PF_R (0x4)
+# ELF-X86-64-NEXT: PF_X (0x1)
+# ELF-X86-64-NEXT: ]
+# ELF-X86-64-NEXT: Alignment: 2097152
+# ELF-X86-64-NEXT: }
+# ELF-X86-64-NEXT: ProgramHeader {
+# ELF-X86-64-NEXT: Type: PT_GNU_EH_FRAME (0x6474E550)
+# ELF-X86-64-NEXT: Offset: 0xF4
+# ELF-X86-64-NEXT: VirtualAddress: 0x4000F4
+# ELF-X86-64-NEXT: PhysicalAddress: 0x4000F4
+# ELF-X86-64-NEXT: FileSize: 20
+# ELF-X86-64-NEXT: MemSize: 20
+# ELF-X86-64-NEXT: Flags [ (0x4)
+# ELF-X86-64-NEXT: PF_R (0x4)
+# ELF-X86-64-NEXT: ]
+# ELF-X86-64-NEXT: Alignment: 4
+# ELF-X86-64-NEXT: }
+# ELF-X86-64-NEXT: ProgramHeader {
+# ELF-X86-64-NEXT: Type: PT_GNU_STACK (0x6474E551)
+# ELF-X86-64-NEXT: Offset: 0x0
+# ELF-X86-64-NEXT: VirtualAddress: 0x0
+# ELF-X86-64-NEXT: PhysicalAddress: 0x0
+# ELF-X86-64-NEXT: FileSize: 0
+# ELF-X86-64-NEXT: MemSize: 0
+# ELF-X86-64-NEXT: Flags [ (0x6)
+# ELF-X86-64-NEXT: PF_R (0x4)
+# ELF-X86-64-NEXT: PF_W (0x2)
+# ELF-X86-64-NEXT: ]
+# ELF-X86-64-NEXT: Alignment: 8
+# ELF-X86-64-NEXT: }
+# ELF-X86-64-NEXT: ]
+
+# RUN: llvm-readobj -l %p/../../../Object/Inputs/program-headers.mips \
+# RUN: | FileCheck %s -check-prefix ELF-MIPS
+
+# ELF-MIPS: Format: ELF32-mips
+# ELF-MIPS-NEXT: Arch: mips
+# ELF-MIPS-NEXT: AddressSize: 32bit
+# ELF-MIPS-NEXT: LoadName:
+# ELF-MIPS-NEXT: ProgramHeaders [
+# ELF-MIPS-NEXT: ProgramHeader {
+# ELF-MIPS-NEXT: Type: PT_MIPS_ABIFLAGS (0x70000003)
+# ELF-MIPS-NEXT: Offset: 0x98
+# ELF-MIPS-NEXT: VirtualAddress: 0x400098
+# ELF-MIPS-NEXT: PhysicalAddress: 0x400098
+# ELF-MIPS-NEXT: FileSize: 24
+# ELF-MIPS-NEXT: MemSize: 24
+# ELF-MIPS-NEXT: Flags [ (0x4)
+# ELF-MIPS-NEXT: PF_R (0x4)
+# ELF-MIPS-NEXT: ]
+# ELF-MIPS-NEXT: Alignment: 8
+# ELF-MIPS-NEXT: }
+# ELF-MIPS-NEXT: ProgramHeader {
+# ELF-MIPS-NEXT: Type: PT_MIPS_REGINFO (0x70000000)
+# ELF-MIPS-NEXT: Offset: 0xB0
+# ELF-MIPS-NEXT: VirtualAddress: 0x4000B0
+# ELF-MIPS-NEXT: PhysicalAddress: 0x4000B0
+# ELF-MIPS-NEXT: FileSize: 24
+# ELF-MIPS-NEXT: MemSize: 24
+# ELF-MIPS-NEXT: Flags [ (0x4)
+# ELF-MIPS-NEXT: PF_R (0x4)
+# ELF-MIPS-NEXT: ]
+# ELF-MIPS-NEXT: Alignment: 4
+# ELF-MIPS-NEXT: }
+# ELF-MIPS-NEXT: ProgramHeader {
+# ELF-MIPS-NEXT: Type: PT_LOAD (0x1)
+# ELF-MIPS-NEXT: Offset: 0x0
+# ELF-MIPS-NEXT: VirtualAddress: 0x400000
+# ELF-MIPS-NEXT: PhysicalAddress: 0x400000
+# ELF-MIPS-NEXT: FileSize: 224
+# ELF-MIPS-NEXT: MemSize: 224
+# ELF-MIPS-NEXT: Flags [ (0x5)
+# ELF-MIPS-NEXT: PF_R (0x4)
+# ELF-MIPS-NEXT: PF_X (0x1)
+# ELF-MIPS-NEXT: ]
+# ELF-MIPS-NEXT: Alignment: 65536
+# ELF-MIPS-NEXT: }
+# ELF-MIPS-NEXT: ]
+
+# RUN: llvm-readobj -l %p/../../../Object/Inputs/program-headers.mips64 \
+# RUN: | FileCheck %s -check-prefix ELF-MIPS64
+
+# ELF-MIPS64: Format: ELF64-mips
+# ELF-MIPS64-NEXT: Arch: mips64
+# ELF-MIPS64-NEXT: AddressSize: 64bit
+# ELF-MIPS64-NEXT: LoadName:
+# ELF-MIPS64-NEXT: ProgramHeaders [
+# ELF-MIPS64-NEXT: ProgramHeader {
+# ELF-MIPS64-NEXT: Type: PT_LOAD (0x1)
+# ELF-MIPS64-NEXT: Offset: 0x0
+# ELF-MIPS64-NEXT: VirtualAddress: 0x120000000
+# ELF-MIPS64-NEXT: PhysicalAddress: 0x120000000
+# ELF-MIPS64-NEXT: FileSize: 136
+# ELF-MIPS64-NEXT: MemSize: 136
+# ELF-MIPS64-NEXT: Flags [ (0x5)
+# ELF-MIPS64-NEXT: PF_R (0x4)
+# ELF-MIPS64-NEXT: PF_X (0x1)
+# ELF-MIPS64-NEXT: ]
+# ELF-MIPS64-NEXT: Alignment: 65536
+# ELF-MIPS64-NEXT: }
+# ELF-MIPS64-NEXT: ]
+
+## Test that llvm-readobj dumps OpenBSD specific program headers.
+
+# RUN: yaml2obj %s -o %t
+# RUN: llvm-readobj -l %t | FileCheck %s --check-prefix=OPENBSD-X86-64
+
+# OPENBSD-X86-64: ProgramHeader {
+# OPENBSD-X86-64-NEXT: Type: PT_OPENBSD_RANDOMIZE
+# OPENBSD-X86-64: ProgramHeader {
+# OPENBSD-X86-64-NEXT: Type: PT_OPENBSD_WXNEEDED
+# OPENBSD-X86-64: ProgramHeader {
+# OPENBSD-X86-64-NEXT: Type: PT_OPENBSD_BOOTDATA
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+ProgramHeaders:
+ - Type: 0x65a3dbe6 ## PT_OPENBSD_RANDOMIZE
+ - Type: 0x65a3dbe7 ## PT_OPENBSD_WXNEEDED
+ - Type: 0x65a41be6 ## PT_OPENBSD_BOOTDATA
diff --git a/llvm/test/tools/llvm-readobj/ELF/pt-gnu-property.test b/llvm/test/tools/llvm-readobj/ELF/pt-gnu-property.test
new file mode 100644
index 00000000000..f47341115b5
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/pt-gnu-property.test
@@ -0,0 +1,17 @@
+# RUN: yaml2obj %s -o %t
+# RUN: llvm-readelf --program-headers %t | FileCheck %s --check-prefix=GNU
+# RUN: llvm-readobj --program-headers %t | FileCheck %s --check-prefix=LLVM
+
+# GNU: {{ }}GNU_PROPERTY{{ }}
+
+# LLVM: ProgramHeader {
+# LLVM-NEXT: Type: PT_GNU_PROPERTY (0x6474E553)
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_AARCH64
+ProgramHeaders:
+ - Type: PT_GNU_PROPERTY
diff --git a/llvm/test/tools/llvm-readobj/ELF/readelf-s-alias.test b/llvm/test/tools/llvm-readobj/ELF/readelf-s-alias.test
new file mode 100644
index 00000000000..b50d0e2442a
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/readelf-s-alias.test
@@ -0,0 +1,49 @@
+# In llvm-readobj, -s is an alias for --sections.
+RUN: llvm-readobj -S %p/Inputs/trivial.obj.elf-i386 \
+RUN: | FileCheck %s -check-prefix SEC
+RUN: llvm-readobj --sections %p/Inputs/trivial.obj.elf-i386 \
+RUN: | FileCheck %s -check-prefix SEC
+
+# In llvm-readelf, -s is an alias for --symbols.
+RUN: llvm-readelf -s %p/Inputs/trivial.obj.elf-i386 \
+RUN: | FileCheck %s -check-prefix SYM
+RUN: llvm-readelf --symbols %p/Inputs/trivial.obj.elf-i386 \
+RUN: | FileCheck %s -check-prefix SYM
+
+SEC: Sections [
+SEC-NEXT: Section {
+SEC-NEXT: Index: 0
+SEC-NEXT: Name: (0)
+SEC-NEXT: Type: SHT_NULL (0x0)
+SEC-NEXT: Flags [ (0x0)
+SEC-NEXT: ]
+SEC-NEXT: Address: 0x0
+SEC-NEXT: Offset: 0x0
+SEC-NEXT: Size: 0
+SEC-NEXT: Link: 0
+SEC-NEXT: Info: 0
+SEC-NEXT: AddressAlignment: 0
+SEC-NEXT: EntrySize: 0
+SEC-NEXT: }
+SEC-NEXT: Section {
+SEC-NEXT: Index: 1
+SEC-NEXT: Name: .text (5)
+SEC-NEXT: Type: SHT_PROGBITS (0x1)
+SEC-NEXT: Flags [ (0x6)
+SEC-NEXT: SHF_ALLOC (0x2)
+SEC-NEXT: SHF_EXECINSTR (0x4)
+SEC-NEXT: ]
+SEC-NEXT: Address: 0x0
+SEC-NEXT: Offset: 0x40
+SEC-NEXT: Size: 42
+SEC-NEXT: Link: 0
+SEC-NEXT: Info: 0
+SEC-NEXT: AddressAlignment: 16
+SEC-NEXT: EntrySize: 0
+SEC-NEXT: }
+
+SYM: Symbol table '.symtab' contains {{.*}} entries:
+SYM-NEXT: Num: Value Size Type Bind Vis Ndx Name
+SYM-NEXT: 0: {{.*}} NOTYPE {{.*}} UND
+SYM-NEXT: 1: {{.*}} FILE {{.*}} trivial.ll
+SYM-NEXT: 2: {{.*}} OBJECT {{.*}} .L.str
diff --git a/llvm/test/tools/llvm-readobj/ELF/reloc-negative-addend-no-sym.test b/llvm/test/tools/llvm-readobj/ELF/reloc-negative-addend-no-sym.test
new file mode 100644
index 00000000000..3a318d52175
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/reloc-negative-addend-no-sym.test
@@ -0,0 +1,73 @@
+# Show that llvm-readelf properly prints the addend for relocations that do not
+# have an associated symbol but have a negative addend.
+
+# RUN: yaml2obj %s -o %t
+# RUN: llvm-readelf --relocations %t | FileCheck %s --check-prefix=REL
+# RUN: llvm-readelf --dyn-relocations %t | FileCheck %s --check-prefix=DYN
+
+# REL: Relocation section '.rela.text' at offset {{.*}} contains 1 entries:
+# REL-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend
+# REL-NEXT: 0000000000000000 0000000000000000 R_X86_64_NONE ffffffffffffffff
+# REL-EMPTY:
+# REL-NEXT: Relocation section '.rela.dyn' at offset {{.*}} contains 1 entries:
+# REL-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend
+# REL-NEXT: 0000000000000008 0000000000000000 R_X86_64_NONE ffffffffffffffff
+
+# DYN: 'RELA' relocation section at offset {{.*}} contains 24 bytes:
+# DYN-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend
+# DYN-NEXT: 0000000000000008 0000000000000000 R_X86_64_NONE ffffffffffffffff
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x10
+ - Name: .rela.text
+ Type: SHT_RELA
+ Info: .text
+ Relocations:
+ - Offset: 0
+ Type: R_X86_64_NONE
+ Addend: -1
+ - Name: .dynamic
+ Type: SHT_DYNAMIC
+ Flags: [SHF_ALLOC]
+ Address: 0x1000
+ AddressAlign: 0x1000
+ Entries:
+ - Tag: DT_RELA
+ Value: 0x1100
+ - Tag: DT_RELASZ
+ Value: 24
+ - Tag: DT_RELAENT
+ Value: 24
+ - Tag: DT_NULL
+ Value: 0
+ - Name: .rela.dyn
+ Type: SHT_RELA
+ Flags: [SHF_ALLOC]
+ Info: .text
+ Address: 0x1100
+ AddressAlign: 0x100
+ Relocations:
+ - Offset: 8
+ Type: R_X86_64_NONE
+ Addend: -1
+DynamicSymbols:
+ - Name: force_dynsym
+ Binding: STB_GLOBAL
+ProgramHeaders:
+ - Type: PT_LOAD
+ VAddr: 0x1000
+ Sections:
+ - Section: .rela.dyn
+ - Section: .dynamic
+ - Type: PT_DYNAMIC
+ VAddr: 0x1000
+ Sections:
+ - Section: .dynamic
diff --git a/llvm/test/tools/llvm-readobj/ELF/reloc-no-sym.test b/llvm/test/tools/llvm-readobj/ELF/reloc-no-sym.test
new file mode 100644
index 00000000000..7c4aa593f24
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/reloc-no-sym.test
@@ -0,0 +1,26 @@
+## Check llvm-readobj is able to dump relocations that
+## do not use symbols.
+
+# RUN: yaml2obj %s -o %t
+# RUN: llvm-readobj -r %t | FileCheck %s
+
+# CHECK: Relocations [
+# CHECK-NEXT: Section (1) .rela.plt {
+# CHECK-NEXT: 0x12345678 R_X86_64_IRELATIVE - 0x87654321
+# CHECK-NEXT: }
+# CHECK-NEXT: ]
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .rela.plt
+ Type: SHT_RELA
+ Flags: [ SHF_ALLOC ]
+ Relocations:
+ - Offset: 0x12345678
+ Type: R_X86_64_IRELATIVE
+ Addend: 0x87654321
diff --git a/llvm/test/tools/llvm-readobj/ELF/reloc-symbol-with-versioning.test b/llvm/test/tools/llvm-readobj/ELF/reloc-symbol-with-versioning.test
new file mode 100644
index 00000000000..8fa191984d5
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/reloc-symbol-with-versioning.test
@@ -0,0 +1,108 @@
+# RUN: yaml2obj %s > %t.o
+# RUN: llvm-readobj --demangle -r %t.o | FileCheck %s --check-prefix LLVM
+# RUN: llvm-readelf --demangle -r %t.o | FileCheck %s --check-prefix GNU
+
+# GNU: Relocation section '.rela.plt' at offset {{.*}} contains 5 entries:
+# GNU-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend
+# GNU-NEXT: 0000000000013018 0000000100000007 R_X86_64_JUMP_SLOT 0000000000000000 f1@v3 + 0
+# GNU-NEXT: 0000000000013020 0000000200000007 R_X86_64_JUMP_SLOT 0000000000000000 f2@v2 + 0
+# GNU-NEXT: 0000000000013028 0000000300000007 R_X86_64_JUMP_SLOT 0000000000000000 g1@v1 + 0
+# GNU-NEXT: 0000000000013040 0000000400000007 R_X86_64_JUMP_SLOT 0000000000000000 f1()@v3 + 0
+# GNU-NEXT: 0000000000013058 0000000500000007 R_X86_64_JUMP_SLOT 0000000000000000 f3 + 0
+
+# LLVM: Relocations [
+# LLVM-NEXT: Section (3) .rela.plt {
+# LLVM-NEXT: 0x13018 R_X86_64_JUMP_SLOT f1@v3 0x0
+# LLVM-NEXT: 0x13020 R_X86_64_JUMP_SLOT f2@v2 0x0
+# LLVM-NEXT: 0x13028 R_X86_64_JUMP_SLOT g1@v1 0x0
+# LLVM-NEXT: 0x13040 R_X86_64_JUMP_SLOT f1()@v3 0x0
+# LLVM-NEXT: 0x13058 R_X86_64_JUMP_SLOT f3 0x0
+# LLVM-NEXT: }
+# LLVM-NEXT: ]
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+ Entry: 0x0000000000000000
+Sections:
+ - Name: .gnu.version
+ Type: SHT_GNU_versym
+ Flags: [ SHF_ALLOC ]
+ Link: .dynsym
+ AddressAlign: 0x0000000000000002
+ EntSize: 0x0000000000000002
+ Entries: [ 0, 2, 3, 4, 2 ]
+ - Name: .gnu.version_r
+ Type: SHT_GNU_verneed
+ Flags: [ SHF_ALLOC ]
+ Link: .dynstr
+ AddressAlign: 0x0000000000000004
+ Info: 0x0000000000000002
+ Dependencies:
+ - Version: 1
+ File: verneed1.so.0
+ Entries:
+ - Name: v2
+ Hash: 1938
+ Flags: 0
+ Other: 3
+ - Name: v3
+ Hash: 1939
+ Flags: 0
+ Other: 2
+ - Version: 1
+ File: verneed2.so.0
+ Entries:
+ - Name: v1
+ Hash: 1937
+ Flags: 0
+ Other: 4
+ - Name: .rela.plt
+ Type: SHT_RELA
+ Flags: [ SHF_ALLOC ]
+ Info: 0
+ Link: 7
+ AddressAlign: 0x0000000000000008
+ EntSize: 0x0000000000000018
+ Relocations:
+ - Offset: 0x0000000000013018
+ Symbol: f1
+ Type: R_X86_64_JUMP_SLOT
+ - Offset: 0x0000000000013020
+ Symbol: f2
+ Type: R_X86_64_JUMP_SLOT
+ - Offset: 0x0000000000013028
+ Symbol: g1
+ Type: R_X86_64_JUMP_SLOT
+ - Offset: 0x0000000000013040
+ Symbol: _Z2f1v
+ Type: R_X86_64_JUMP_SLOT
+ - Offset: 0x0000000000013058
+ Symbol: f3
+ Type: R_X86_64_JUMP_SLOT
+Symbols:
+ - Name: f1
+ Binding: STB_GLOBAL
+ - Name: f2
+ Binding: STB_GLOBAL
+ - Name: g1
+ Binding: STB_GLOBAL
+ - Name: _Z2f1v
+ Binding: STB_GLOBAL
+ - Name: f3
+ Binding: STB_GLOBAL
+DynamicSymbols:
+ - Name: f1
+ Binding: STB_GLOBAL
+ - Name: f2
+ Binding: STB_GLOBAL
+ - Name: g1
+ Binding: STB_GLOBAL
+ - Name: _Z2f1v
+ Binding: STB_GLOBAL
+ - Name: f3
+ Binding: STB_GLOBAL
+...
diff --git a/llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-aarch64.test b/llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-aarch64.test
new file mode 100644
index 00000000000..fdd3b97b6b2
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-aarch64.test
@@ -0,0 +1,392 @@
+## Test that llvm-readobj/llvm-readelf shows proper relocation type
+## names and values for aarch64 target.
+
+# RUN: yaml2obj %s -o %t-aarch64.o
+# RUN: llvm-readobj -r --expand-relocs %t-aarch64.o | FileCheck %s
+
+# CHECK: Type: R_AARCH64_NONE (0)
+# CHECK: Type: R_AARCH64_ABS64 (257)
+# CHECK: Type: R_AARCH64_ABS32 (258)
+# CHECK: Type: R_AARCH64_ABS16 (259)
+# CHECK: Type: R_AARCH64_PREL64 (260)
+# CHECK: Type: R_AARCH64_PREL32 (261)
+# CHECK: Type: R_AARCH64_PREL16 (262)
+# CHECK: Type: R_AARCH64_MOVW_UABS_G0 (263)
+# CHECK: Type: R_AARCH64_MOVW_UABS_G0_NC (264)
+# CHECK: Type: R_AARCH64_MOVW_UABS_G1 (265)
+# CHECK: Type: R_AARCH64_MOVW_UABS_G1_NC (266)
+# CHECK: Type: R_AARCH64_MOVW_UABS_G2 (267)
+# CHECK: Type: R_AARCH64_MOVW_UABS_G2_NC (268)
+# CHECK: Type: R_AARCH64_MOVW_UABS_G3 (269)
+# CHECK: Type: R_AARCH64_MOVW_SABS_G0 (270)
+# CHECK: Type: R_AARCH64_MOVW_SABS_G1 (271)
+# CHECK: Type: R_AARCH64_MOVW_SABS_G2 (272)
+# CHECK: Type: R_AARCH64_LD_PREL_LO19 (273)
+# CHECK: Type: R_AARCH64_ADR_PREL_LO21 (274)
+# CHECK: Type: R_AARCH64_ADR_PREL_PG_HI21 (275)
+# CHECK: Type: R_AARCH64_ADR_PREL_PG_HI21_NC (276)
+# CHECK: Type: R_AARCH64_ADD_ABS_LO12_NC (277)
+# CHECK: Type: R_AARCH64_LDST8_ABS_LO12_NC (278)
+# CHECK: Type: R_AARCH64_TSTBR14 (279)
+# CHECK: Type: R_AARCH64_CONDBR19 (280)
+# CHECK: Type: R_AARCH64_JUMP26 (282)
+# CHECK: Type: R_AARCH64_CALL26 (283)
+# CHECK: Type: R_AARCH64_LDST16_ABS_LO12_NC (284)
+# CHECK: Type: R_AARCH64_LDST32_ABS_LO12_NC (285)
+# CHECK: Type: R_AARCH64_LDST64_ABS_LO12_NC (286)
+# CHECK: Type: R_AARCH64_MOVW_PREL_G0 (287)
+# CHECK: Type: R_AARCH64_MOVW_PREL_G0_NC (288)
+# CHECK: Type: R_AARCH64_MOVW_PREL_G1 (289)
+# CHECK: Type: R_AARCH64_MOVW_PREL_G1_NC (290)
+# CHECK: Type: R_AARCH64_MOVW_PREL_G2 (291)
+# CHECK: Type: R_AARCH64_MOVW_PREL_G2_NC (292)
+# CHECK: Type: R_AARCH64_MOVW_PREL_G3 (293)
+# CHECK: Type: R_AARCH64_LDST128_ABS_LO12_NC (299)
+# CHECK: Type: R_AARCH64_MOVW_GOTOFF_G0 (300)
+# CHECK: Type: R_AARCH64_MOVW_GOTOFF_G0_NC (301)
+# CHECK: Type: R_AARCH64_MOVW_GOTOFF_G1 (302)
+# CHECK: Type: R_AARCH64_MOVW_GOTOFF_G1_NC (303)
+# CHECK: Type: R_AARCH64_MOVW_GOTOFF_G2 (304)
+# CHECK: Type: R_AARCH64_MOVW_GOTOFF_G2_NC (305)
+# CHECK: Type: R_AARCH64_MOVW_GOTOFF_G3 (306)
+# CHECK: Type: R_AARCH64_GOTREL64 (307)
+# CHECK: Type: R_AARCH64_GOTREL32 (308)
+# CHECK: Type: R_AARCH64_GOT_LD_PREL19 (309)
+# CHECK: Type: R_AARCH64_LD64_GOTOFF_LO15 (310)
+# CHECK: Type: R_AARCH64_ADR_GOT_PAGE (311)
+# CHECK: Type: R_AARCH64_LD64_GOT_LO12_NC (312)
+# CHECK: Type: R_AARCH64_LD64_GOTPAGE_LO15 (313)
+# CHECK: Type: R_AARCH64_TLSGD_ADR_PREL21 (512)
+# CHECK: Type: R_AARCH64_TLSGD_ADR_PAGE21 (513)
+# CHECK: Type: R_AARCH64_TLSGD_ADD_LO12_NC (514)
+# CHECK: Type: R_AARCH64_TLSGD_MOVW_G1 (515)
+# CHECK: Type: R_AARCH64_TLSGD_MOVW_G0_NC (516)
+# CHECK: Type: R_AARCH64_TLSLD_ADR_PREL21 (517)
+# CHECK: Type: R_AARCH64_TLSLD_ADR_PAGE21 (518)
+# CHECK: Type: R_AARCH64_TLSLD_ADD_LO12_NC (519)
+# CHECK: Type: R_AARCH64_TLSLD_MOVW_G1 (520)
+# CHECK: Type: R_AARCH64_TLSLD_MOVW_G0_NC (521)
+# CHECK: Type: R_AARCH64_TLSLD_LD_PREL19 (522)
+# CHECK: Type: R_AARCH64_TLSLD_MOVW_DTPREL_G2 (523)
+# CHECK: Type: R_AARCH64_TLSLD_MOVW_DTPREL_G1 (524)
+# CHECK: Type: R_AARCH64_TLSLD_MOVW_DTPREL_G1_NC (525)
+# CHECK: Type: R_AARCH64_TLSLD_MOVW_DTPREL_G0 (526)
+# CHECK: Type: R_AARCH64_TLSLD_MOVW_DTPREL_G0_NC (527)
+# CHECK: Type: R_AARCH64_TLSLD_ADD_DTPREL_HI12 (528)
+# CHECK: Type: R_AARCH64_TLSLD_ADD_DTPREL_LO12 (529)
+# CHECK: Type: R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC (530)
+# CHECK: Type: R_AARCH64_TLSLD_LDST8_DTPREL_LO12 (531)
+# CHECK: Type: R_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC (532)
+# CHECK: Type: R_AARCH64_TLSLD_LDST16_DTPREL_LO12 (533)
+# CHECK: Type: R_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC (534)
+# CHECK: Type: R_AARCH64_TLSLD_LDST32_DTPREL_LO12 (535)
+# CHECK: Type: R_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC (536)
+# CHECK: Type: R_AARCH64_TLSLD_LDST64_DTPREL_LO12 (537)
+# CHECK: Type: R_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC (538)
+# CHECK: Type: R_AARCH64_TLSIE_MOVW_GOTTPREL_G1 (539)
+# CHECK: Type: R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC (540)
+# CHECK: Type: R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21 (541)
+# CHECK: Type: R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC (542)
+# CHECK: Type: R_AARCH64_TLSIE_LD_GOTTPREL_PREL19 (543)
+# CHECK: Type: R_AARCH64_TLSLE_MOVW_TPREL_G2 (544)
+# CHECK: Type: R_AARCH64_TLSLE_MOVW_TPREL_G1 (545)
+# CHECK: Type: R_AARCH64_TLSLE_MOVW_TPREL_G1_NC (546)
+# CHECK: Type: R_AARCH64_TLSLE_MOVW_TPREL_G0 (547)
+# CHECK: Type: R_AARCH64_TLSLE_MOVW_TPREL_G0_NC (548)
+# CHECK: Type: R_AARCH64_TLSLE_ADD_TPREL_HI12 (549)
+# CHECK: Type: R_AARCH64_TLSLE_ADD_TPREL_LO12 (550)
+# CHECK: Type: R_AARCH64_TLSLE_ADD_TPREL_LO12_NC (551)
+# CHECK: Type: R_AARCH64_TLSLE_LDST8_TPREL_LO12 (552)
+# CHECK: Type: R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC (553)
+# CHECK: Type: R_AARCH64_TLSLE_LDST16_TPREL_LO12 (554)
+# CHECK: Type: R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC (555)
+# CHECK: Type: R_AARCH64_TLSLE_LDST32_TPREL_LO12 (556)
+# CHECK: Type: R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC (557)
+# CHECK: Type: R_AARCH64_TLSLE_LDST64_TPREL_LO12 (558)
+# CHECK: Type: R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC (559)
+# CHECK: Type: R_AARCH64_TLSDESC_LD_PREL19 (560)
+# CHECK: Type: R_AARCH64_TLSDESC_ADR_PREL21 (561)
+# CHECK: Type: R_AARCH64_TLSDESC_ADR_PAGE21 (562)
+# CHECK: Type: R_AARCH64_TLSDESC_LD64_LO12 (563)
+# CHECK: Type: R_AARCH64_TLSDESC_ADD_LO12 (564)
+# CHECK: Type: R_AARCH64_TLSDESC_OFF_G1 (565)
+# CHECK: Type: R_AARCH64_TLSDESC_OFF_G0_NC (566)
+# CHECK: Type: R_AARCH64_TLSDESC_LDR (567)
+# CHECK: Type: R_AARCH64_TLSDESC_ADD (568)
+# CHECK: Type: R_AARCH64_TLSDESC_CALL (569)
+# CHECK: Type: R_AARCH64_TLSLE_LDST128_TPREL_LO12 (570)
+# CHECK: Type: R_AARCH64_TLSLE_LDST128_TPREL_LO12_NC (571)
+# CHECK: Type: R_AARCH64_TLSLD_LDST128_DTPREL_LO12 (572)
+# CHECK: Type: R_AARCH64_TLSLD_LDST128_DTPREL_LO12_NC (573)
+# CHECK: Type: R_AARCH64_COPY (1024)
+# CHECK: Type: R_AARCH64_GLOB_DAT (1025)
+# CHECK: Type: R_AARCH64_JUMP_SLOT (1026)
+# CHECK: Type: R_AARCH64_RELATIVE (1027)
+# CHECK: Type: R_AARCH64_TLS_DTPMOD64 (1028)
+# CHECK: Type: R_AARCH64_TLS_DTPREL64 (1029)
+# CHECK: Type: R_AARCH64_TLS_TPREL64 (1030)
+# CHECK: Type: R_AARCH64_TLSDESC (1031)
+# CHECK: Type: R_AARCH64_IRELATIVE (1032)
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_AARCH64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Content: 00
+ - Name: .rela.text
+ Type: SHT_RELA
+ AddressAlign: 0x0000000000000008
+ EntSize: 0x0000000000000018
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000000
+ Type: R_AARCH64_NONE
+ - Offset: 0x0000000000000004
+ Type: R_AARCH64_ABS64
+ - Offset: 0x0000000000000008
+ Type: R_AARCH64_ABS32
+ - Offset: 0x000000000000000C
+ Type: R_AARCH64_ABS16
+ - Offset: 0x0000000000000010
+ Type: R_AARCH64_PREL64
+ - Offset: 0x0000000000000014
+ Type: R_AARCH64_PREL32
+ - Offset: 0x0000000000000018
+ Type: R_AARCH64_PREL16
+ - Offset: 0x000000000000001C
+ Type: R_AARCH64_MOVW_UABS_G0
+ - Offset: 0x0000000000000020
+ Type: R_AARCH64_MOVW_UABS_G0_NC
+ - Offset: 0x0000000000000024
+ Type: R_AARCH64_MOVW_UABS_G1
+ - Offset: 0x0000000000000028
+ Type: R_AARCH64_MOVW_UABS_G1_NC
+ - Offset: 0x000000000000002C
+ Type: R_AARCH64_MOVW_UABS_G2
+ - Offset: 0x0000000000000030
+ Type: R_AARCH64_MOVW_UABS_G2_NC
+ - Offset: 0x0000000000000034
+ Type: R_AARCH64_MOVW_UABS_G3
+ - Offset: 0x0000000000000038
+ Type: R_AARCH64_MOVW_SABS_G0
+ - Offset: 0x000000000000003C
+ Type: R_AARCH64_MOVW_SABS_G1
+ - Offset: 0x0000000000000040
+ Type: R_AARCH64_MOVW_SABS_G2
+ - Offset: 0x0000000000000044
+ Type: R_AARCH64_LD_PREL_LO19
+ - Offset: 0x0000000000000048
+ Type: R_AARCH64_ADR_PREL_LO21
+ - Offset: 0x000000000000004C
+ Type: R_AARCH64_ADR_PREL_PG_HI21
+ - Offset: 0x0000000000000050
+ Type: R_AARCH64_ADR_PREL_PG_HI21_NC
+ - Offset: 0x0000000000000054
+ Type: R_AARCH64_ADD_ABS_LO12_NC
+ - Offset: 0x0000000000000058
+ Type: R_AARCH64_LDST8_ABS_LO12_NC
+ - Offset: 0x000000000000005C
+ Type: R_AARCH64_TSTBR14
+ - Offset: 0x0000000000000060
+ Type: R_AARCH64_CONDBR19
+ - Offset: 0x0000000000000064
+ Type: R_AARCH64_JUMP26
+ - Offset: 0x0000000000000068
+ Type: R_AARCH64_CALL26
+ - Offset: 0x000000000000006C
+ Type: R_AARCH64_LDST16_ABS_LO12_NC
+ - Offset: 0x0000000000000070
+ Type: R_AARCH64_LDST32_ABS_LO12_NC
+ - Offset: 0x0000000000000074
+ Type: R_AARCH64_LDST64_ABS_LO12_NC
+ - Offset: 0x0000000000000078
+ Type: R_AARCH64_MOVW_PREL_G0
+ - Offset: 0x000000000000007C
+ Type: R_AARCH64_MOVW_PREL_G0_NC
+ - Offset: 0x0000000000000080
+ Type: R_AARCH64_MOVW_PREL_G1
+ - Offset: 0x0000000000000084
+ Type: R_AARCH64_MOVW_PREL_G1_NC
+ - Offset: 0x0000000000000088
+ Type: R_AARCH64_MOVW_PREL_G2
+ - Offset: 0x000000000000008C
+ Type: R_AARCH64_MOVW_PREL_G2_NC
+ - Offset: 0x0000000000000090
+ Type: R_AARCH64_MOVW_PREL_G3
+ - Offset: 0x0000000000000094
+ Type: R_AARCH64_LDST128_ABS_LO12_NC
+ - Offset: 0x0000000000000098
+ Type: R_AARCH64_MOVW_GOTOFF_G0
+ - Offset: 0x000000000000009C
+ Type: R_AARCH64_MOVW_GOTOFF_G0_NC
+ - Offset: 0x00000000000000A0
+ Type: R_AARCH64_MOVW_GOTOFF_G1
+ - Offset: 0x00000000000000A4
+ Type: R_AARCH64_MOVW_GOTOFF_G1_NC
+ - Offset: 0x00000000000000A8
+ Type: R_AARCH64_MOVW_GOTOFF_G2
+ - Offset: 0x00000000000000AC
+ Type: R_AARCH64_MOVW_GOTOFF_G2_NC
+ - Offset: 0x00000000000000B0
+ Type: R_AARCH64_MOVW_GOTOFF_G3
+ - Offset: 0x00000000000000B4
+ Type: R_AARCH64_GOTREL64
+ - Offset: 0x00000000000000B8
+ Type: R_AARCH64_GOTREL32
+ - Offset: 0x00000000000000BC
+ Type: R_AARCH64_GOT_LD_PREL19
+ - Offset: 0x00000000000000C0
+ Type: R_AARCH64_LD64_GOTOFF_LO15
+ - Offset: 0x00000000000000C4
+ Type: R_AARCH64_ADR_GOT_PAGE
+ - Offset: 0x00000000000000C8
+ Type: R_AARCH64_LD64_GOT_LO12_NC
+ - Offset: 0x00000000000000CC
+ Type: R_AARCH64_LD64_GOTPAGE_LO15
+ - Offset: 0x00000000000000D0
+ Type: R_AARCH64_TLSGD_ADR_PREL21
+ - Offset: 0x00000000000000D4
+ Type: R_AARCH64_TLSGD_ADR_PAGE21
+ - Offset: 0x00000000000000D8
+ Type: R_AARCH64_TLSGD_ADD_LO12_NC
+ - Offset: 0x00000000000000DC
+ Type: R_AARCH64_TLSGD_MOVW_G1
+ - Offset: 0x00000000000000E0
+ Type: R_AARCH64_TLSGD_MOVW_G0_NC
+ - Offset: 0x00000000000000E4
+ Type: R_AARCH64_TLSLD_ADR_PREL21
+ - Offset: 0x00000000000000E8
+ Type: R_AARCH64_TLSLD_ADR_PAGE21
+ - Offset: 0x00000000000000EC
+ Type: R_AARCH64_TLSLD_ADD_LO12_NC
+ - Offset: 0x00000000000000F0
+ Type: R_AARCH64_TLSLD_MOVW_G1
+ - Offset: 0x00000000000000F4
+ Type: R_AARCH64_TLSLD_MOVW_G0_NC
+ - Offset: 0x00000000000000F8
+ Type: R_AARCH64_TLSLD_LD_PREL19
+ - Offset: 0x00000000000000FC
+ Type: R_AARCH64_TLSLD_MOVW_DTPREL_G2
+ - Offset: 0x0000000000000100
+ Type: R_AARCH64_TLSLD_MOVW_DTPREL_G1
+ - Offset: 0x0000000000000104
+ Type: R_AARCH64_TLSLD_MOVW_DTPREL_G1_NC
+ - Offset: 0x0000000000000108
+ Type: R_AARCH64_TLSLD_MOVW_DTPREL_G0
+ - Offset: 0x000000000000010C
+ Type: R_AARCH64_TLSLD_MOVW_DTPREL_G0_NC
+ - Offset: 0x0000000000000110
+ Type: R_AARCH64_TLSLD_ADD_DTPREL_HI12
+ - Offset: 0x0000000000000114
+ Type: R_AARCH64_TLSLD_ADD_DTPREL_LO12
+ - Offset: 0x0000000000000118
+ Type: R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC
+ - Offset: 0x000000000000011C
+ Type: R_AARCH64_TLSLD_LDST8_DTPREL_LO12
+ - Offset: 0x0000000000000120
+ Type: R_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC
+ - Offset: 0x0000000000000124
+ Type: R_AARCH64_TLSLD_LDST16_DTPREL_LO12
+ - Offset: 0x0000000000000128
+ Type: R_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC
+ - Offset: 0x000000000000012C
+ Type: R_AARCH64_TLSLD_LDST32_DTPREL_LO12
+ - Offset: 0x0000000000000130
+ Type: R_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC
+ - Offset: 0x0000000000000134
+ Type: R_AARCH64_TLSLD_LDST64_DTPREL_LO12
+ - Offset: 0x0000000000000138
+ Type: R_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC
+ - Offset: 0x000000000000013C
+ Type: R_AARCH64_TLSIE_MOVW_GOTTPREL_G1
+ - Offset: 0x0000000000000140
+ Type: R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC
+ - Offset: 0x0000000000000144
+ Type: R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21
+ - Offset: 0x0000000000000148
+ Type: R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC
+ - Offset: 0x000000000000014C
+ Type: R_AARCH64_TLSIE_LD_GOTTPREL_PREL19
+ - Offset: 0x0000000000000150
+ Type: R_AARCH64_TLSLE_MOVW_TPREL_G2
+ - Offset: 0x0000000000000154
+ Type: R_AARCH64_TLSLE_MOVW_TPREL_G1
+ - Offset: 0x0000000000000158
+ Type: R_AARCH64_TLSLE_MOVW_TPREL_G1_NC
+ - Offset: 0x000000000000015C
+ Type: R_AARCH64_TLSLE_MOVW_TPREL_G0
+ - Offset: 0x0000000000000160
+ Type: R_AARCH64_TLSLE_MOVW_TPREL_G0_NC
+ - Offset: 0x0000000000000164
+ Type: R_AARCH64_TLSLE_ADD_TPREL_HI12
+ - Offset: 0x0000000000000168
+ Type: R_AARCH64_TLSLE_ADD_TPREL_LO12
+ - Offset: 0x000000000000016C
+ Type: R_AARCH64_TLSLE_ADD_TPREL_LO12_NC
+ - Offset: 0x0000000000000170
+ Type: R_AARCH64_TLSLE_LDST8_TPREL_LO12
+ - Offset: 0x0000000000000174
+ Type: R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC
+ - Offset: 0x0000000000000178
+ Type: R_AARCH64_TLSLE_LDST16_TPREL_LO12
+ - Offset: 0x000000000000017C
+ Type: R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC
+ - Offset: 0x0000000000000180
+ Type: R_AARCH64_TLSLE_LDST32_TPREL_LO12
+ - Offset: 0x0000000000000184
+ Type: R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC
+ - Offset: 0x0000000000000188
+ Type: R_AARCH64_TLSLE_LDST64_TPREL_LO12
+ - Offset: 0x000000000000018C
+ Type: R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC
+ - Offset: 0x0000000000000190
+ Type: R_AARCH64_TLSDESC_LD_PREL19
+ - Offset: 0x0000000000000194
+ Type: R_AARCH64_TLSDESC_ADR_PREL21
+ - Offset: 0x0000000000000198
+ Type: R_AARCH64_TLSDESC_ADR_PAGE21
+ - Offset: 0x000000000000019C
+ Type: R_AARCH64_TLSDESC_LD64_LO12
+ - Offset: 0x00000000000001A0
+ Type: R_AARCH64_TLSDESC_ADD_LO12
+ - Offset: 0x00000000000001A4
+ Type: R_AARCH64_TLSDESC_OFF_G1
+ - Offset: 0x00000000000001A8
+ Type: R_AARCH64_TLSDESC_OFF_G0_NC
+ - Offset: 0x00000000000001AC
+ Type: R_AARCH64_TLSDESC_LDR
+ - Offset: 0x00000000000001B0
+ Type: R_AARCH64_TLSDESC_ADD
+ - Offset: 0x00000000000001B4
+ Type: R_AARCH64_TLSDESC_CALL
+ - Offset: 0x00000000000001B8
+ Type: R_AARCH64_TLSLE_LDST128_TPREL_LO12
+ - Offset: 0x00000000000001BC
+ Type: R_AARCH64_TLSLE_LDST128_TPREL_LO12_NC
+ - Offset: 0x00000000000001C0
+ Type: R_AARCH64_TLSLD_LDST128_DTPREL_LO12
+ - Offset: 0x00000000000001C4
+ Type: R_AARCH64_TLSLD_LDST128_DTPREL_LO12_NC
+ - Offset: 0x00000000000001C8
+ Type: R_AARCH64_COPY
+ - Offset: 0x00000000000001CC
+ Type: R_AARCH64_GLOB_DAT
+ - Offset: 0x00000000000001D0
+ Type: R_AARCH64_JUMP_SLOT
+ - Offset: 0x00000000000001D4
+ Type: R_AARCH64_RELATIVE
+ - Offset: 0x00000000000001D8
+ Type: R_AARCH64_TLS_DTPMOD64
+ - Offset: 0x00000000000001DC
+ Type: R_AARCH64_TLS_DTPREL64
+ - Offset: 0x00000000000001E0
+ Type: R_AARCH64_TLS_TPREL64
+ - Offset: 0x00000000000001E4
+ Type: R_AARCH64_TLSDESC
+ - Offset: 0x00000000000001E8
+ Type: R_AARCH64_IRELATIVE
diff --git a/llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-arm.test b/llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-arm.test
new file mode 100644
index 00000000000..ac6bda68587
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-arm.test
@@ -0,0 +1,419 @@
+## Test that llvm-readobj/llvm-readelf shows proper relocation type
+## names and values for arm target.
+
+# RUN: yaml2obj %s -o %t-arm.o
+# RUN: llvm-readobj -r --expand-relocs %t-arm.o | FileCheck %s
+
+# CHECK: Type: R_ARM_NONE (0)
+# CHECK: Type: R_ARM_PC24 (1)
+# CHECK: Type: R_ARM_ABS32 (2)
+# CHECK: Type: R_ARM_REL32 (3)
+# CHECK: Type: R_ARM_LDR_PC_G0 (4)
+# CHECK: Type: R_ARM_ABS16 (5)
+# CHECK: Type: R_ARM_ABS12 (6)
+# CHECK: Type: R_ARM_THM_ABS5 (7)
+# CHECK: Type: R_ARM_ABS8 (8)
+# CHECK: Type: R_ARM_SBREL32 (9)
+# CHECK: Type: R_ARM_THM_CALL (10)
+# CHECK: Type: R_ARM_THM_PC8 (11)
+# CHECK: Type: R_ARM_BREL_ADJ (12)
+# CHECK: Type: R_ARM_TLS_DESC (13)
+# CHECK: Type: R_ARM_THM_SWI8 (14)
+# CHECK: Type: R_ARM_XPC25 (15)
+# CHECK: Type: R_ARM_THM_XPC22 (16)
+# CHECK: Type: R_ARM_TLS_DTPMOD32 (17)
+# CHECK: Type: R_ARM_TLS_DTPOFF32 (18)
+# CHECK: Type: R_ARM_TLS_TPOFF32 (19)
+# CHECK: Type: R_ARM_COPY (20)
+# CHECK: Type: R_ARM_GLOB_DAT (21)
+# CHECK: Type: R_ARM_JUMP_SLOT (22)
+# CHECK: Type: R_ARM_RELATIVE (23)
+# CHECK: Type: R_ARM_GOTOFF32 (24)
+# CHECK: Type: R_ARM_BASE_PREL (25)
+# CHECK: Type: R_ARM_GOT_BREL (26)
+# CHECK: Type: R_ARM_CALL (28)
+# CHECK: Type: R_ARM_JUMP24 (29)
+# CHECK: Type: R_ARM_THM_JUMP24 (30)
+# CHECK: Type: R_ARM_BASE_ABS (31)
+# CHECK: Type: R_ARM_ALU_PCREL_7_0 (32)
+# CHECK: Type: R_ARM_ALU_PCREL_15_8 (33)
+# CHECK: Type: R_ARM_ALU_PCREL_23_15 (34)
+# CHECK: Type: R_ARM_LDR_SBREL_11_0_NC (35)
+# CHECK: Type: R_ARM_ALU_SBREL_19_12_NC (36)
+# CHECK: Type: R_ARM_ALU_SBREL_27_20_CK (37)
+# CHECK: Type: R_ARM_TARGET1 (38)
+# CHECK: Type: R_ARM_SBREL31 (39)
+# CHECK: Type: R_ARM_V4BX (40)
+# CHECK: Type: R_ARM_TARGET2 (41)
+# CHECK: Type: R_ARM_PREL31 (42)
+# CHECK: Type: R_ARM_MOVW_ABS_NC (43)
+# CHECK: Type: R_ARM_MOVT_ABS (44)
+# CHECK: Type: R_ARM_MOVW_PREL_NC (45)
+# CHECK: Type: R_ARM_MOVT_PREL (46)
+# CHECK: Type: R_ARM_THM_MOVW_ABS_NC (47)
+# CHECK: Type: R_ARM_THM_MOVT_ABS (48)
+# CHECK: Type: R_ARM_THM_MOVW_PREL_NC (49)
+# CHECK: Type: R_ARM_THM_MOVT_PREL (50)
+# CHECK: Type: R_ARM_THM_JUMP19 (51)
+# CHECK: Type: R_ARM_THM_JUMP6 (52)
+# CHECK: Type: R_ARM_THM_ALU_PREL_11_0 (53)
+# CHECK: Type: R_ARM_THM_PC12 (54)
+# CHECK: Type: R_ARM_ABS32_NOI (55)
+# CHECK: Type: R_ARM_REL32_NOI (56)
+# CHECK: Type: R_ARM_ALU_PC_G0_NC (57)
+# CHECK: Type: R_ARM_ALU_PC_G0 (58)
+# CHECK: Type: R_ARM_ALU_PC_G1_NC (59)
+# CHECK: Type: R_ARM_ALU_PC_G1 (60)
+# CHECK: Type: R_ARM_ALU_PC_G2 (61)
+# CHECK: Type: R_ARM_LDR_PC_G1 (62)
+# CHECK: Type: R_ARM_LDR_PC_G2 (63)
+# CHECK: Type: R_ARM_LDRS_PC_G0 (64)
+# CHECK: Type: R_ARM_LDRS_PC_G1 (65)
+# CHECK: Type: R_ARM_LDRS_PC_G2 (66)
+# CHECK: Type: R_ARM_LDC_PC_G0 (67)
+# CHECK: Type: R_ARM_LDC_PC_G1 (68)
+# CHECK: Type: R_ARM_LDC_PC_G2 (69)
+# CHECK: Type: R_ARM_ALU_SB_G0_NC (70)
+# CHECK: Type: R_ARM_ALU_SB_G0 (71)
+# CHECK: Type: R_ARM_ALU_SB_G1_NC (72)
+# CHECK: Type: R_ARM_ALU_SB_G1 (73)
+# CHECK: Type: R_ARM_ALU_SB_G2 (74)
+# CHECK: Type: R_ARM_LDR_SB_G0 (75)
+# CHECK: Type: R_ARM_LDR_SB_G1 (76)
+# CHECK: Type: R_ARM_LDR_SB_G2 (77)
+# CHECK: Type: R_ARM_LDRS_SB_G0 (78)
+# CHECK: Type: R_ARM_LDRS_SB_G1 (79)
+# CHECK: Type: R_ARM_LDRS_SB_G2 (80)
+# CHECK: Type: R_ARM_LDC_SB_G0 (81)
+# CHECK: Type: R_ARM_LDC_SB_G1 (82)
+# CHECK: Type: R_ARM_LDC_SB_G2 (83)
+# CHECK: Type: R_ARM_MOVW_BREL_NC (84)
+# CHECK: Type: R_ARM_MOVT_BREL (85)
+# CHECK: Type: R_ARM_MOVW_BREL (86)
+# CHECK: Type: R_ARM_THM_MOVW_BREL_NC (87)
+# CHECK: Type: R_ARM_THM_MOVT_BREL (88)
+# CHECK: Type: R_ARM_THM_MOVW_BREL (89)
+# CHECK: Type: R_ARM_TLS_GOTDESC (90)
+# CHECK: Type: R_ARM_TLS_CALL (91)
+# CHECK: Type: R_ARM_TLS_DESCSEQ (92)
+# CHECK: Type: R_ARM_THM_TLS_CALL (93)
+# CHECK: Type: R_ARM_PLT32_ABS (94)
+# CHECK: Type: R_ARM_GOT_ABS (95)
+# CHECK: Type: R_ARM_GOT_PREL (96)
+# CHECK: Type: R_ARM_GOT_BREL12 (97)
+# CHECK: Type: R_ARM_GOTOFF12 (98)
+# CHECK: Type: R_ARM_GOTRELAX (99)
+# CHECK: Type: R_ARM_GNU_VTENTRY (100)
+# CHECK: Type: R_ARM_GNU_VTINHERIT (101)
+# CHECK: Type: R_ARM_THM_JUMP11 (102)
+# CHECK: Type: R_ARM_THM_JUMP8 (103)
+# CHECK: Type: R_ARM_TLS_GD32 (104)
+# CHECK: Type: R_ARM_TLS_LDM32 (105)
+# CHECK: Type: R_ARM_TLS_LDO32 (106)
+# CHECK: Type: R_ARM_TLS_IE32 (107)
+# CHECK: Type: R_ARM_TLS_LE32 (108)
+# CHECK: Type: R_ARM_TLS_LDO12 (109)
+# CHECK: Type: R_ARM_TLS_LE12 (110)
+# CHECK: Type: R_ARM_TLS_IE12GP (111)
+# CHECK: Type: R_ARM_PRIVATE_0 (112)
+# CHECK: Type: R_ARM_PRIVATE_1 (113)
+# CHECK: Type: R_ARM_PRIVATE_2 (114)
+# CHECK: Type: R_ARM_PRIVATE_3 (115)
+# CHECK: Type: R_ARM_PRIVATE_4 (116)
+# CHECK: Type: R_ARM_PRIVATE_5 (117)
+# CHECK: Type: R_ARM_PRIVATE_6 (118)
+# CHECK: Type: R_ARM_PRIVATE_7 (119)
+# CHECK: Type: R_ARM_PRIVATE_8 (120)
+# CHECK: Type: R_ARM_PRIVATE_9 (121)
+# CHECK: Type: R_ARM_PRIVATE_10 (122)
+# CHECK: Type: R_ARM_PRIVATE_11 (123)
+# CHECK: Type: R_ARM_PRIVATE_12 (124)
+# CHECK: Type: R_ARM_PRIVATE_13 (125)
+# CHECK: Type: R_ARM_PRIVATE_14 (126)
+# CHECK: Type: R_ARM_PRIVATE_15 (127)
+# CHECK: Type: R_ARM_ME_TOO (128)
+# CHECK: Type: R_ARM_THM_TLS_DESCSEQ16 (129)
+# CHECK: Type: R_ARM_THM_TLS_DESCSEQ32 (130)
+# CHECK: Type: R_ARM_IRELATIVE (160)
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Content: 00
+ - Name: .rel.text
+ Type: SHT_REL
+ AddressAlign: 0x0000000000000004
+ EntSize: 0x0000000000000008
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000000
+ Type: R_ARM_NONE
+ - Offset: 0x0000000000000004
+ Type: R_ARM_PC24
+ - Offset: 0x0000000000000008
+ Type: R_ARM_ABS32
+ - Offset: 0x000000000000000C
+ Type: R_ARM_REL32
+ - Offset: 0x0000000000000010
+ Type: R_ARM_LDR_PC_G0
+ - Offset: 0x0000000000000014
+ Type: R_ARM_ABS16
+ - Offset: 0x0000000000000018
+ Type: R_ARM_ABS12
+ - Offset: 0x000000000000001C
+ Type: R_ARM_THM_ABS5
+ - Offset: 0x0000000000000020
+ Type: R_ARM_ABS8
+ - Offset: 0x0000000000000024
+ Type: R_ARM_SBREL32
+ - Offset: 0x0000000000000028
+ Type: R_ARM_THM_CALL
+ - Offset: 0x000000000000002C
+ Type: R_ARM_THM_PC8
+ - Offset: 0x0000000000000030
+ Type: R_ARM_BREL_ADJ
+ - Offset: 0x0000000000000034
+ Type: R_ARM_TLS_DESC
+ - Offset: 0x0000000000000038
+ Type: R_ARM_THM_SWI8
+ - Offset: 0x000000000000003C
+ Type: R_ARM_XPC25
+ - Offset: 0x0000000000000040
+ Type: R_ARM_THM_XPC22
+ - Offset: 0x0000000000000044
+ Type: R_ARM_TLS_DTPMOD32
+ - Offset: 0x0000000000000048
+ Type: R_ARM_TLS_DTPOFF32
+ - Offset: 0x000000000000004C
+ Type: R_ARM_TLS_TPOFF32
+ - Offset: 0x0000000000000050
+ Type: R_ARM_COPY
+ - Offset: 0x0000000000000054
+ Type: R_ARM_GLOB_DAT
+ - Offset: 0x0000000000000058
+ Type: R_ARM_JUMP_SLOT
+ - Offset: 0x000000000000005C
+ Type: R_ARM_RELATIVE
+ - Offset: 0x0000000000000060
+ Type: R_ARM_GOTOFF32
+ - Offset: 0x0000000000000064
+ Type: R_ARM_BASE_PREL
+ - Offset: 0x0000000000000068
+ Type: R_ARM_GOT_BREL
+ - Offset: 0x000000000000006C
+ Type: R_ARM_PLT32
+ - Offset: 0x0000000000000070
+ Type: R_ARM_CALL
+ - Offset: 0x0000000000000074
+ Type: R_ARM_JUMP24
+ - Offset: 0x0000000000000078
+ Type: R_ARM_THM_JUMP24
+ - Offset: 0x000000000000007C
+ Type: R_ARM_BASE_ABS
+ - Offset: 0x0000000000000080
+ Type: R_ARM_ALU_PCREL_7_0
+ - Offset: 0x0000000000000084
+ Type: R_ARM_ALU_PCREL_15_8
+ - Offset: 0x0000000000000088
+ Type: R_ARM_ALU_PCREL_23_15
+ - Offset: 0x000000000000008C
+ Type: R_ARM_LDR_SBREL_11_0_NC
+ - Offset: 0x0000000000000090
+ Type: R_ARM_ALU_SBREL_19_12_NC
+ - Offset: 0x0000000000000094
+ Type: R_ARM_ALU_SBREL_27_20_CK
+ - Offset: 0x0000000000000098
+ Type: R_ARM_TARGET1
+ - Offset: 0x000000000000009C
+ Type: R_ARM_SBREL31
+ - Offset: 0x00000000000000A0
+ Type: R_ARM_V4BX
+ - Offset: 0x00000000000000A4
+ Type: R_ARM_TARGET2
+ - Offset: 0x00000000000000A8
+ Type: R_ARM_PREL31
+ - Offset: 0x00000000000000AC
+ Type: R_ARM_MOVW_ABS_NC
+ - Offset: 0x00000000000000B0
+ Type: R_ARM_MOVT_ABS
+ - Offset: 0x00000000000000B4
+ Type: R_ARM_MOVW_PREL_NC
+ - Offset: 0x00000000000000B8
+ Type: R_ARM_MOVT_PREL
+ - Offset: 0x00000000000000BC
+ Type: R_ARM_THM_MOVW_ABS_NC
+ - Offset: 0x00000000000000C0
+ Type: R_ARM_THM_MOVT_ABS
+ - Offset: 0x00000000000000C4
+ Type: R_ARM_THM_MOVW_PREL_NC
+ - Offset: 0x00000000000000C8
+ Type: R_ARM_THM_MOVT_PREL
+ - Offset: 0x00000000000000CC
+ Type: R_ARM_THM_JUMP19
+ - Offset: 0x00000000000000D0
+ Type: R_ARM_THM_JUMP6
+ - Offset: 0x00000000000000D4
+ Type: R_ARM_THM_ALU_PREL_11_0
+ - Offset: 0x00000000000000D8
+ Type: R_ARM_THM_PC12
+ - Offset: 0x00000000000000DC
+ Type: R_ARM_ABS32_NOI
+ - Offset: 0x00000000000000E0
+ Type: R_ARM_REL32_NOI
+ - Offset: 0x00000000000000E4
+ Type: R_ARM_ALU_PC_G0_NC
+ - Offset: 0x00000000000000E8
+ Type: R_ARM_ALU_PC_G0
+ - Offset: 0x00000000000000EC
+ Type: R_ARM_ALU_PC_G1_NC
+ - Offset: 0x00000000000000F0
+ Type: R_ARM_ALU_PC_G1
+ - Offset: 0x00000000000000F4
+ Type: R_ARM_ALU_PC_G2
+ - Offset: 0x00000000000000F8
+ Type: R_ARM_LDR_PC_G1
+ - Offset: 0x00000000000000FC
+ Type: R_ARM_LDR_PC_G2
+ - Offset: 0x0000000000000100
+ Type: R_ARM_LDRS_PC_G0
+ - Offset: 0x0000000000000104
+ Type: R_ARM_LDRS_PC_G1
+ - Offset: 0x0000000000000108
+ Type: R_ARM_LDRS_PC_G2
+ - Offset: 0x000000000000010C
+ Type: R_ARM_LDC_PC_G0
+ - Offset: 0x0000000000000110
+ Type: R_ARM_LDC_PC_G1
+ - Offset: 0x0000000000000114
+ Type: R_ARM_LDC_PC_G2
+ - Offset: 0x0000000000000118
+ Type: R_ARM_ALU_SB_G0_NC
+ - Offset: 0x000000000000011C
+ Type: R_ARM_ALU_SB_G0
+ - Offset: 0x0000000000000120
+ Type: R_ARM_ALU_SB_G1_NC
+ - Offset: 0x0000000000000124
+ Type: R_ARM_ALU_SB_G1
+ - Offset: 0x0000000000000128
+ Type: R_ARM_ALU_SB_G2
+ - Offset: 0x000000000000012C
+ Type: R_ARM_LDR_SB_G0
+ - Offset: 0x0000000000000130
+ Type: R_ARM_LDR_SB_G1
+ - Offset: 0x0000000000000134
+ Type: R_ARM_LDR_SB_G2
+ - Offset: 0x0000000000000138
+ Type: R_ARM_LDRS_SB_G0
+ - Offset: 0x000000000000013C
+ Type: R_ARM_LDRS_SB_G1
+ - Offset: 0x0000000000000140
+ Type: R_ARM_LDRS_SB_G2
+ - Offset: 0x0000000000000144
+ Type: R_ARM_LDC_SB_G0
+ - Offset: 0x0000000000000148
+ Type: R_ARM_LDC_SB_G1
+ - Offset: 0x000000000000014C
+ Type: R_ARM_LDC_SB_G2
+ - Offset: 0x0000000000000150
+ Type: R_ARM_MOVW_BREL_NC
+ - Offset: 0x0000000000000154
+ Type: R_ARM_MOVT_BREL
+ - Offset: 0x0000000000000158
+ Type: R_ARM_MOVW_BREL
+ - Offset: 0x000000000000015C
+ Type: R_ARM_THM_MOVW_BREL_NC
+ - Offset: 0x0000000000000160
+ Type: R_ARM_THM_MOVT_BREL
+ - Offset: 0x0000000000000164
+ Type: R_ARM_THM_MOVW_BREL
+ - Offset: 0x0000000000000168
+ Type: R_ARM_TLS_GOTDESC
+ - Offset: 0x000000000000016C
+ Type: R_ARM_TLS_CALL
+ - Offset: 0x0000000000000170
+ Type: R_ARM_TLS_DESCSEQ
+ - Offset: 0x0000000000000174
+ Type: R_ARM_THM_TLS_CALL
+ - Offset: 0x0000000000000178
+ Type: R_ARM_PLT32_ABS
+ - Offset: 0x000000000000017C
+ Type: R_ARM_GOT_ABS
+ - Offset: 0x0000000000000180
+ Type: R_ARM_GOT_PREL
+ - Offset: 0x0000000000000184
+ Type: R_ARM_GOT_BREL12
+ - Offset: 0x0000000000000188
+ Type: R_ARM_GOTOFF12
+ - Offset: 0x000000000000018C
+ Type: R_ARM_GOTRELAX
+ - Offset: 0x0000000000000190
+ Type: R_ARM_GNU_VTENTRY
+ - Offset: 0x0000000000000194
+ Type: R_ARM_GNU_VTINHERIT
+ - Offset: 0x0000000000000198
+ Type: R_ARM_THM_JUMP11
+ - Offset: 0x000000000000019C
+ Type: R_ARM_THM_JUMP8
+ - Offset: 0x00000000000001A0
+ Type: R_ARM_TLS_GD32
+ - Offset: 0x00000000000001A4
+ Type: R_ARM_TLS_LDM32
+ - Offset: 0x00000000000001A8
+ Type: R_ARM_TLS_LDO32
+ - Offset: 0x00000000000001AC
+ Type: R_ARM_TLS_IE32
+ - Offset: 0x00000000000001B0
+ Type: R_ARM_TLS_LE32
+ - Offset: 0x00000000000001B4
+ Type: R_ARM_TLS_LDO12
+ - Offset: 0x00000000000001B8
+ Type: R_ARM_TLS_LE12
+ - Offset: 0x00000000000001BC
+ Type: R_ARM_TLS_IE12GP
+ - Offset: 0x00000000000001C0
+ Type: R_ARM_PRIVATE_0
+ - Offset: 0x00000000000001C4
+ Type: R_ARM_PRIVATE_1
+ - Offset: 0x00000000000001C8
+ Type: R_ARM_PRIVATE_2
+ - Offset: 0x00000000000001CC
+ Type: R_ARM_PRIVATE_3
+ - Offset: 0x00000000000001D0
+ Type: R_ARM_PRIVATE_4
+ - Offset: 0x00000000000001D4
+ Type: R_ARM_PRIVATE_5
+ - Offset: 0x00000000000001D8
+ Type: R_ARM_PRIVATE_6
+ - Offset: 0x00000000000001DC
+ Type: R_ARM_PRIVATE_7
+ - Offset: 0x00000000000001E0
+ Type: R_ARM_PRIVATE_8
+ - Offset: 0x00000000000001E4
+ Type: R_ARM_PRIVATE_9
+ - Offset: 0x00000000000001E8
+ Type: R_ARM_PRIVATE_10
+ - Offset: 0x00000000000001EC
+ Type: R_ARM_PRIVATE_11
+ - Offset: 0x00000000000001F0
+ Type: R_ARM_PRIVATE_12
+ - Offset: 0x00000000000001F4
+ Type: R_ARM_PRIVATE_13
+ - Offset: 0x00000000000001F8
+ Type: R_ARM_PRIVATE_14
+ - Offset: 0x00000000000001FC
+ Type: R_ARM_PRIVATE_15
+ - Offset: 0x0000000000000200
+ Type: R_ARM_ME_TOO
+ - Offset: 0x0000000000000204
+ Type: R_ARM_THM_TLS_DESCSEQ16
+ - Offset: 0x0000000000000208
+ Type: R_ARM_THM_TLS_DESCSEQ32
+ - Offset: 0x000000000000020C
+ Type: R_ARM_IRELATIVE
diff --git a/llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-i386.test b/llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-i386.test
new file mode 100644
index 00000000000..8606f3fa8cb
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-i386.test
@@ -0,0 +1,237 @@
+## Test that llvm-readobj/llvm-readelf shows proper relocation type
+## names and values for i386 target.
+
+# RUN: yaml2obj %s -o %t-i386.o
+# RUN: llvm-readobj -r --expand-relocs %t-i386.o | FileCheck %s --check-prefix=LLVM
+# RUN: llvm-readelf -r --expand-relocs %t-i386.o | FileCheck %s --check-prefix=GNU
+
+# LLVM: Type: R_386_NONE (0)
+# LLVM: Type: R_386_32 (1)
+# LLVM: Type: R_386_PC32 (2)
+# LLVM: Type: R_386_GOT32 (3)
+# LLVM: Type: R_386_PLT32 (4)
+# LLVM: Type: R_386_COPY (5)
+# LLVM: Type: R_386_GLOB_DAT (6)
+# LLVM: Type: R_386_JUMP_SLOT (7)
+# LLVM: Type: R_386_RELATIVE (8)
+# LLVM: Type: R_386_GOTOFF (9)
+# LLVM: Type: R_386_GOTPC (10)
+# LLVM: Type: R_386_32PLT (11)
+# LLVM: Type: R_386_TLS_TPOFF (14)
+# LLVM: Type: R_386_TLS_IE (15)
+# LLVM: Type: R_386_TLS_GOTIE (16)
+# LLVM: Type: R_386_TLS_LE (17)
+# LLVM: Type: R_386_TLS_GD (18)
+# LLVM: Type: R_386_TLS_LDM (19)
+# LLVM: Type: R_386_16 (20)
+# LLVM: Type: R_386_PC16 (21)
+# LLVM: Type: R_386_8 (22)
+# LLVM: Type: R_386_PC8 (23)
+# LLVM: Type: R_386_TLS_GD_32 (24)
+# LLVM: Type: R_386_TLS_GD_PUSH (25)
+# LLVM: Type: R_386_TLS_GD_CALL (26)
+# LLVM: Type: R_386_TLS_GD_POP (27)
+# LLVM: Type: R_386_TLS_LDM_32 (28)
+# LLVM: Type: R_386_TLS_LDM_PUSH (29)
+# LLVM: Type: R_386_TLS_LDM_CALL (30)
+# LLVM: Type: R_386_TLS_LDM_POP (31)
+# LLVM: Type: R_386_TLS_LDO_32 (32)
+# LLVM: Type: R_386_TLS_IE_32 (33)
+# LLVM: Type: R_386_TLS_LE_32 (34)
+# LLVM: Type: R_386_TLS_DTPMOD32 (35)
+# LLVM: Type: R_386_TLS_DTPOFF32 (36)
+# LLVM: Type: R_386_TLS_TPOFF32 (37)
+# LLVM: Type: R_386_TLS_GOTDESC (39)
+# LLVM: Type: R_386_TLS_DESC_CALL (40)
+# LLVM: Type: R_386_TLS_DESC (41)
+# LLVM: Type: R_386_IRELATIVE (42)
+# LLVM: Type: R_386_GOT32X (43)
+
+# GNU: Relocation section '.rel.text' at offset 0x38 contains 41 entries:
+# GNU-NEXT: Offset Info Type Sym. Value Symbol's Name
+# GNU-NEXT: 00000002 00000100 R_386_NONE 00000000 foo
+# GNU-NEXT: 00000008 00000101 R_386_32 00000000 foo
+# GNU-NEXT: 0000000e 00000102 R_386_PC32 00000000 foo
+# GNU-NEXT: 00000014 00000103 R_386_GOT32 00000000 foo
+# GNU-NEXT: 0000001a 00000104 R_386_PLT32 00000000 foo
+# GNU-NEXT: 00000020 00000105 R_386_COPY 00000000 foo
+# GNU-NEXT: 00000026 00000106 R_386_GLOB_DAT 00000000 foo
+# GNU-NEXT: 0000002c 00000107 R_386_JUMP_SLOT 00000000 foo
+# GNU-NEXT: 00000032 00000108 R_386_RELATIVE 00000000 foo
+# GNU-NEXT: 00000038 00000109 R_386_GOTOFF 00000000 foo
+# GNU-NEXT: 0000003e 0000010a R_386_GOTPC 00000000 foo
+# GNU-NEXT: 00000044 0000010b R_386_32PLT 00000000 foo
+# GNU-NEXT: 0000004a 0000010e R_386_TLS_TPOFF 00000000 foo
+# GNU-NEXT: 00000050 0000010f R_386_TLS_IE 00000000 foo
+# GNU-NEXT: 00000056 00000110 R_386_TLS_GOTIE 00000000 foo
+# GNU-NEXT: 0000005c 00000111 R_386_TLS_LE 00000000 foo
+# GNU-NEXT: 00000062 00000112 R_386_TLS_GD 00000000 foo
+# GNU-NEXT: 00000068 00000113 R_386_TLS_LDM 00000000 foo
+# GNU-NEXT: 0000006e 00000114 R_386_16 00000000 foo
+# GNU-NEXT: 00000074 00000115 R_386_PC16 00000000 foo
+# GNU-NEXT: 0000007a 00000116 R_386_8 00000000 foo
+# GNU-NEXT: 00000080 00000117 R_386_PC8 00000000 foo
+# GNU-NEXT: 00000086 00000118 R_386_TLS_GD_32 00000000 foo
+# GNU-NEXT: 0000008c 00000119 R_386_TLS_GD_PUSH 00000000 foo
+# GNU-NEXT: 00000092 0000011a R_386_TLS_GD_CALL 00000000 foo
+# GNU-NEXT: 00000098 0000011b R_386_TLS_GD_POP 00000000 foo
+# GNU-NEXT: 0000009e 0000011c R_386_TLS_LDM_32 00000000 foo
+# GNU-NEXT: 000000a4 0000011d R_386_TLS_LDM_PUSH 00000000 foo
+# GNU-NEXT: 000000aa 0000011e R_386_TLS_LDM_CALL 00000000 foo
+# GNU-NEXT: 000000b0 0000011f R_386_TLS_LDM_POP 00000000 foo
+# GNU-NEXT: 000000b6 00000120 R_386_TLS_LDO_32 00000000 foo
+# GNU-NEXT: 000000bc 00000121 R_386_TLS_IE_32 00000000 foo
+# GNU-NEXT: 000000c2 00000122 R_386_TLS_LE_32 00000000 foo
+# GNU-NEXT: 000000c8 00000123 R_386_TLS_DTPMOD32 00000000 foo
+# GNU-NEXT: 000000ce 00000124 R_386_TLS_DTPOFF32 00000000 foo
+# GNU-NEXT: 000000d4 00000125 R_386_TLS_TPOFF32 00000000 foo
+# GNU-NEXT: 000000da 00000127 R_386_TLS_GOTDESC 00000000 foo
+# GNU-NEXT: 000000e0 00000128 R_386_TLS_DESC_CALL 00000000 foo
+# GNU-NEXT: 000000e6 00000129 R_386_TLS_DESC 00000000 foo
+# GNU-NEXT: 000000ec 0000012a R_386_IRELATIVE 00000000 foo
+# GNU-NEXT: 000000f2 0000012b R_386_GOT32X 00000000 foo
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_386
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Content: 00
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ EntSize: 0x0000000000000008
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000002
+ Type: R_386_NONE
+ Symbol: foo
+ - Offset: 0x0000000000000008
+ Type: R_386_32
+ Symbol: foo
+ - Offset: 0x000000000000000E
+ Type: R_386_PC32
+ Symbol: foo
+ - Offset: 0x0000000000000014
+ Type: R_386_GOT32
+ Symbol: foo
+ - Offset: 0x000000000000001A
+ Type: R_386_PLT32
+ Symbol: foo
+ - Offset: 0x0000000000000020
+ Type: R_386_COPY
+ Symbol: foo
+ - Offset: 0x0000000000000026
+ Type: R_386_GLOB_DAT
+ Symbol: foo
+ - Offset: 0x000000000000002C
+ Type: R_386_JUMP_SLOT
+ Symbol: foo
+ - Offset: 0x0000000000000032
+ Type: R_386_RELATIVE
+ Symbol: foo
+ - Offset: 0x0000000000000038
+ Type: R_386_GOTOFF
+ Symbol: foo
+ - Offset: 0x000000000000003E
+ Type: R_386_GOTPC
+ Symbol: foo
+ - Offset: 0x0000000000000044
+ Type: R_386_32PLT
+ Symbol: foo
+ - Offset: 0x000000000000004A
+ Type: R_386_TLS_TPOFF
+ Symbol: foo
+ - Offset: 0x0000000000000050
+ Type: R_386_TLS_IE
+ Symbol: foo
+ - Offset: 0x0000000000000056
+ Type: R_386_TLS_GOTIE
+ Symbol: foo
+ - Offset: 0x000000000000005C
+ Type: R_386_TLS_LE
+ Symbol: foo
+ - Offset: 0x0000000000000062
+ Type: R_386_TLS_GD
+ Symbol: foo
+ - Offset: 0x0000000000000068
+ Type: R_386_TLS_LDM
+ Symbol: foo
+ - Offset: 0x000000000000006E
+ Type: R_386_16
+ Symbol: foo
+ - Offset: 0x0000000000000074
+ Type: R_386_PC16
+ Symbol: foo
+ - Offset: 0x000000000000007A
+ Type: R_386_8
+ Symbol: foo
+ - Offset: 0x0000000000000080
+ Type: R_386_PC8
+ Symbol: foo
+ - Offset: 0x0000000000000086
+ Type: R_386_TLS_GD_32
+ Symbol: foo
+ - Offset: 0x000000000000008C
+ Type: R_386_TLS_GD_PUSH
+ Symbol: foo
+ - Offset: 0x0000000000000092
+ Type: R_386_TLS_GD_CALL
+ Symbol: foo
+ - Offset: 0x0000000000000098
+ Type: R_386_TLS_GD_POP
+ Symbol: foo
+ - Offset: 0x000000000000009E
+ Type: R_386_TLS_LDM_32
+ Symbol: foo
+ - Offset: 0x00000000000000A4
+ Type: R_386_TLS_LDM_PUSH
+ Symbol: foo
+ - Offset: 0x00000000000000AA
+ Type: R_386_TLS_LDM_CALL
+ Symbol: foo
+ - Offset: 0x00000000000000B0
+ Type: R_386_TLS_LDM_POP
+ Symbol: foo
+ - Offset: 0x00000000000000B6
+ Type: R_386_TLS_LDO_32
+ Symbol: foo
+ - Offset: 0x00000000000000BC
+ Type: R_386_TLS_IE_32
+ Symbol: foo
+ - Offset: 0x00000000000000C2
+ Type: R_386_TLS_LE_32
+ Symbol: foo
+ - Offset: 0x00000000000000C8
+ Type: R_386_TLS_DTPMOD32
+ Symbol: foo
+ - Offset: 0x00000000000000CE
+ Type: R_386_TLS_DTPOFF32
+ Symbol: foo
+ - Offset: 0x00000000000000D4
+ Type: R_386_TLS_TPOFF32
+ Symbol: foo
+ - Offset: 0x00000000000000DA
+ Type: R_386_TLS_GOTDESC
+ Symbol: foo
+ - Offset: 0x00000000000000E0
+ Type: R_386_TLS_DESC_CALL
+ Symbol: foo
+ - Offset: 0x00000000000000E6
+ Type: R_386_TLS_DESC
+ Symbol: foo
+ - Offset: 0x00000000000000EC
+ Type: R_386_IRELATIVE
+ Symbol: foo
+ - Offset: 0x00000000000000F2
+ Type: R_386_GOT32X
+ Symbol: foo
+Symbols:
+ - Name: foo
+ Binding: STB_GLOBAL
diff --git a/llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-lanai.test b/llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-lanai.test
new file mode 100644
index 00000000000..b5804c9aa57
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-lanai.test
@@ -0,0 +1,46 @@
+## Test that llvm-readobj/llvm-readelf shows proper relocation type
+## names and values for lanai target.
+
+# RUN: yaml2obj %s -o %t-lanai.o
+# RUN: llvm-readobj -r --expand-relocs %t-lanai.o | FileCheck %s
+
+# CHECK: Type: R_LANAI_NONE (0)
+# CHECK: Type: R_LANAI_21 (1)
+# CHECK: Type: R_LANAI_21_F (2)
+# CHECK: Type: R_LANAI_25 (3)
+# CHECK: Type: R_LANAI_32 (4)
+# CHECK: Type: R_LANAI_HI16 (5)
+# CHECK: Type: R_LANAI_LO16 (6)
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2MSB
+ Type: ET_REL
+ Machine: EM_LANAI
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 00
+ - Name: .rela.text
+ Type: SHT_RELA
+ AddressAlign: 0x0000000000000004
+ EntSize: 0x000000000000000C
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000000
+ Type: R_LANAI_NONE
+ - Offset: 0x0000000000000004
+ Type: R_LANAI_21
+ - Offset: 0x0000000000000008
+ Type: R_LANAI_21_F
+ - Offset: 0x000000000000000C
+ Type: R_LANAI_25
+ - Offset: 0x0000000000000010
+ Type: R_LANAI_32
+ - Offset: 0x0000000000000014
+ Type: R_LANAI_HI16
+ - Offset: 0x0000000000000018
+ Type: R_LANAI_LO16
diff --git a/llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-mips.test b/llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-mips.test
new file mode 100644
index 00000000000..16dfd2f77dd
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-mips.test
@@ -0,0 +1,180 @@
+## Test that llvm-readobj/llvm-readelf shows proper relocation type
+## names and values for mips target.
+
+# RUN: yaml2obj %s -o %t-mips.o
+# RUN: llvm-readobj -r --expand-relocs %t-mips.o | FileCheck %s
+
+# CHECK: Type: R_MIPS_NONE (0)
+# CHECK: Type: R_MIPS_16 (1)
+# CHECK: Type: R_MIPS_32 (2)
+# CHECK: Type: R_MIPS_REL32 (3)
+# CHECK: Type: R_MIPS_26 (4)
+# CHECK: Type: R_MIPS_HI16 (5)
+# CHECK: Type: R_MIPS_LO16 (6)
+# CHECK: Type: R_MIPS_GPREL16 (7)
+# CHECK: Type: R_MIPS_LITERAL (8)
+# CHECK: Type: R_MIPS_GOT16 (9)
+# CHECK: Type: R_MIPS_PC16 (10)
+# CHECK: Type: R_MIPS_CALL16 (11)
+# CHECK: Type: R_MIPS_GPREL32 (12)
+# CHECK: Type: R_MIPS_SHIFT5 (16)
+# CHECK: Type: R_MIPS_SHIFT6 (17)
+# CHECK: Type: R_MIPS_64 (18)
+# CHECK: Type: R_MIPS_GOT_DISP (19)
+# CHECK: Type: R_MIPS_GOT_PAGE (20)
+# CHECK: Type: R_MIPS_GOT_OFST (21)
+# CHECK: Type: R_MIPS_GOT_HI16 (22)
+# CHECK: Type: R_MIPS_GOT_LO16 (23)
+# CHECK: Type: R_MIPS_SUB (24)
+# CHECK: Type: R_MIPS_INSERT_A (25)
+# CHECK: Type: R_MIPS_INSERT_B (26)
+# CHECK: Type: R_MIPS_DELETE (27)
+# CHECK: Type: R_MIPS_HIGHER (28)
+# CHECK: Type: R_MIPS_HIGHEST (29)
+# CHECK: Type: R_MIPS_CALL_HI16 (30)
+# CHECK: Type: R_MIPS_CALL_LO16 (31)
+# CHECK: Type: R_MIPS_SCN_DISP (32)
+# CHECK: Type: R_MIPS_REL16 (33)
+# CHECK: Type: R_MIPS_ADD_IMMEDIATE (34)
+# CHECK: Type: R_MIPS_PJUMP (35)
+# CHECK: Type: R_MIPS_RELGOT (36)
+# CHECK: Type: R_MIPS_JALR (37)
+# CHECK: Type: R_MIPS_TLS_DTPMOD32 (38)
+# CHECK: Type: R_MIPS_TLS_DTPREL32 (39)
+# CHECK: Type: R_MIPS_TLS_DTPMOD64 (40)
+# CHECK: Type: R_MIPS_TLS_DTPREL64 (41)
+# CHECK: Type: R_MIPS_TLS_GD (42)
+# CHECK: Type: R_MIPS_TLS_LDM (43)
+# CHECK: Type: R_MIPS_TLS_DTPREL_HI16 (44)
+# CHECK: Type: R_MIPS_TLS_DTPREL_LO16 (45)
+# CHECK: Type: R_MIPS_TLS_GOTTPREL (46)
+# CHECK: Type: R_MIPS_TLS_TPREL32 (47)
+# CHECK: Type: R_MIPS_TLS_TPREL64 (48)
+# CHECK: Type: R_MIPS_TLS_TPREL_HI16 (49)
+# CHECK: Type: R_MIPS_TLS_TPREL_LO16 (50)
+# CHECK: Type: R_MIPS_GLOB_DAT (51)
+# CHECK: Type: R_MIPS_COPY (126)
+# CHECK: Type: R_MIPS_JUMP_SLOT (127)
+# CHECK: Type: R_MIPS_NUM (218)
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2MSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_MIPS
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Content: 00
+ - Name: .rel.text
+ Type: SHT_REL
+ AddressAlign: 0x0000000000000004
+ EntSize: 0x0000000000000008
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000000
+ Type: R_MIPS_NONE
+ - Offset: 0x0000000000000004
+ Type: R_MIPS_16
+ - Offset: 0x0000000000000008
+ Type: R_MIPS_32
+ - Offset: 0x000000000000000C
+ Type: R_MIPS_REL32
+ - Offset: 0x0000000000000010
+ Type: R_MIPS_26
+ - Offset: 0x0000000000000014
+ Type: R_MIPS_HI16
+ - Offset: 0x0000000000000018
+ Type: R_MIPS_LO16
+ - Offset: 0x000000000000001C
+ Type: R_MIPS_GPREL16
+ - Offset: 0x0000000000000020
+ Type: R_MIPS_LITERAL
+ - Offset: 0x0000000000000024
+ Type: R_MIPS_GOT16
+ - Offset: 0x0000000000000028
+ Type: R_MIPS_PC16
+ - Offset: 0x000000000000002C
+ Type: R_MIPS_CALL16
+ - Offset: 0x0000000000000030
+ Type: R_MIPS_GPREL32
+ - Offset: 0x0000000000000034
+ Type: R_MIPS_SHIFT5
+ - Offset: 0x0000000000000038
+ Type: R_MIPS_SHIFT6
+ - Offset: 0x000000000000003C
+ Type: R_MIPS_64
+ - Offset: 0x0000000000000040
+ Type: R_MIPS_GOT_DISP
+ - Offset: 0x0000000000000044
+ Type: R_MIPS_GOT_PAGE
+ - Offset: 0x0000000000000048
+ Type: R_MIPS_GOT_OFST
+ - Offset: 0x000000000000004C
+ Type: R_MIPS_GOT_HI16
+ - Offset: 0x0000000000000050
+ Type: R_MIPS_GOT_LO16
+ - Offset: 0x0000000000000054
+ Type: R_MIPS_SUB
+ - Offset: 0x0000000000000058
+ Type: R_MIPS_INSERT_A
+ - Offset: 0x000000000000005C
+ Type: R_MIPS_INSERT_B
+ - Offset: 0x0000000000000060
+ Type: R_MIPS_DELETE
+ - Offset: 0x0000000000000064
+ Type: R_MIPS_HIGHER
+ - Offset: 0x0000000000000068
+ Type: R_MIPS_HIGHEST
+ - Offset: 0x000000000000006C
+ Type: R_MIPS_CALL_HI16
+ - Offset: 0x0000000000000070
+ Type: R_MIPS_CALL_LO16
+ - Offset: 0x0000000000000074
+ Type: R_MIPS_SCN_DISP
+ - Offset: 0x0000000000000078
+ Type: R_MIPS_REL16
+ - Offset: 0x000000000000007C
+ Type: R_MIPS_ADD_IMMEDIATE
+ - Offset: 0x0000000000000080
+ Type: R_MIPS_PJUMP
+ - Offset: 0x0000000000000084
+ Type: R_MIPS_RELGOT
+ - Offset: 0x0000000000000088
+ Type: R_MIPS_JALR
+ - Offset: 0x000000000000008C
+ Type: R_MIPS_TLS_DTPMOD32
+ - Offset: 0x0000000000000090
+ Type: R_MIPS_TLS_DTPREL32
+ - Offset: 0x0000000000000094
+ Type: R_MIPS_TLS_DTPMOD64
+ - Offset: 0x0000000000000098
+ Type: R_MIPS_TLS_DTPREL64
+ - Offset: 0x000000000000009C
+ Type: R_MIPS_TLS_GD
+ - Offset: 0x00000000000000A0
+ Type: R_MIPS_TLS_LDM
+ - Offset: 0x00000000000000A4
+ Type: R_MIPS_TLS_DTPREL_HI16
+ - Offset: 0x00000000000000A8
+ Type: R_MIPS_TLS_DTPREL_LO16
+ - Offset: 0x00000000000000AC
+ Type: R_MIPS_TLS_GOTTPREL
+ - Offset: 0x00000000000000B0
+ Type: R_MIPS_TLS_TPREL32
+ - Offset: 0x00000000000000B4
+ Type: R_MIPS_TLS_TPREL64
+ - Offset: 0x00000000000000B8
+ Type: R_MIPS_TLS_TPREL_HI16
+ - Offset: 0x00000000000000BC
+ Type: R_MIPS_TLS_TPREL_LO16
+ - Offset: 0x00000000000000C0
+ Type: R_MIPS_GLOB_DAT
+ - Offset: 0x00000000000000C4
+ Type: R_MIPS_COPY
+ - Offset: 0x00000000000000C8
+ Type: R_MIPS_JUMP_SLOT
+ - Offset: 0x00000000000000CC
+ Type: R_MIPS_NUM
diff --git a/llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-mips64.test b/llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-mips64.test
new file mode 100644
index 00000000000..f1fefb26974
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-mips64.test
@@ -0,0 +1,282 @@
+## Test that llvm-readobj/llvm-readelf shows proper relocation type
+## names and values for mips64 target.
+
+# RUN: yaml2obj %s -o %t-mips64.o
+# RUN: llvm-readobj -r --expand-relocs %t-mips64.o | FileCheck %s
+
+# CHECK: Type: R_MIPS_NONE/R_MIPS_NONE/R_MIPS_NONE (0)
+# CHECK: Type: R_MIPS_16/R_MIPS_16/R_MIPS_16 (65793)
+# CHECK: Type: R_MIPS_32/R_MIPS_32/R_MIPS_32 (131586)
+# CHECK: Type: R_MIPS_REL32/R_MIPS_REL32/R_MIPS_REL32 (197379)
+# CHECK: Type: R_MIPS_26/R_MIPS_26/R_MIPS_26 (263172)
+# CHECK: Type: R_MIPS_HI16/R_MIPS_HI16/R_MIPS_HI16 (328965)
+# CHECK: Type: R_MIPS_LO16/R_MIPS_LO16/R_MIPS_LO16 (394758)
+# CHECK: Type: R_MIPS_GPREL16/R_MIPS_GPREL16/R_MIPS_GPREL16 (460551)
+# CHECK: Type: R_MIPS_LITERAL/R_MIPS_LITERAL/R_MIPS_LITERAL (526344)
+# CHECK: Type: R_MIPS_GOT16/R_MIPS_GOT16/R_MIPS_GOT16 (592137)
+# CHECK: Type: R_MIPS_PC16/R_MIPS_PC16/R_MIPS_PC16 (657930)
+# CHECK: Type: R_MIPS_CALL16/R_MIPS_CALL16/R_MIPS_CALL16 (723723)
+# CHECK: Type: R_MIPS_GPREL32/R_MIPS_GPREL32/R_MIPS_GPREL32 (789516)
+# CHECK: Type: R_MIPS_SHIFT5/R_MIPS_SHIFT5/R_MIPS_SHIFT5 (1052688)
+# CHECK: Type: R_MIPS_SHIFT6/R_MIPS_SHIFT6/R_MIPS_SHIFT6 (1118481)
+# CHECK: Type: R_MIPS_64/R_MIPS_64/R_MIPS_64 (1184274)
+# CHECK: Type: R_MIPS_GOT_DISP/R_MIPS_GOT_DISP/R_MIPS_GOT_DISP (1250067)
+# CHECK: Type: R_MIPS_GOT_PAGE/R_MIPS_GOT_PAGE/R_MIPS_GOT_PAGE (1315860)
+# CHECK: Type: R_MIPS_GOT_OFST/R_MIPS_GOT_OFST/R_MIPS_GOT_OFST (1381653)
+# CHECK: Type: R_MIPS_GOT_HI16/R_MIPS_GOT_HI16/R_MIPS_GOT_HI16 (1447446)
+# CHECK: Type: R_MIPS_GOT_LO16/R_MIPS_GOT_LO16/R_MIPS_GOT_LO16 (1513239)
+# CHECK: Type: R_MIPS_SUB/R_MIPS_SUB/R_MIPS_SUB (1579032)
+# CHECK: Type: R_MIPS_INSERT_A/R_MIPS_INSERT_A/R_MIPS_INSERT_A (1644825)
+# CHECK: Type: R_MIPS_INSERT_B/R_MIPS_INSERT_B/R_MIPS_INSERT_B (1710618)
+# CHECK: Type: R_MIPS_DELETE/R_MIPS_DELETE/R_MIPS_DELETE (1776411)
+# CHECK: Type: R_MIPS_HIGHER/R_MIPS_HIGHER/R_MIPS_HIGHER (1842204)
+# CHECK: Type: R_MIPS_HIGHEST/R_MIPS_HIGHEST/R_MIPS_HIGHEST (1907997)
+# CHECK: Type: R_MIPS_CALL_HI16/R_MIPS_CALL_HI16/R_MIPS_CALL_HI16 (1973790)
+# CHECK: Type: R_MIPS_CALL_LO16/R_MIPS_CALL_LO16/R_MIPS_CALL_LO16 (2039583)
+# CHECK: Type: R_MIPS_SCN_DISP/R_MIPS_SCN_DISP/R_MIPS_SCN_DISP (2105376)
+# CHECK: Type: R_MIPS_REL16/R_MIPS_REL16/R_MIPS_REL16 (2171169)
+# CHECK: Type: R_MIPS_ADD_IMMEDIATE/R_MIPS_ADD_IMMEDIATE/R_MIPS_ADD_IMMEDIATE (2236962)
+# CHECK: Type: R_MIPS_PJUMP/R_MIPS_PJUMP/R_MIPS_PJUMP (2302755)
+# CHECK: Type: R_MIPS_RELGOT/R_MIPS_RELGOT/R_MIPS_RELGOT (2368548)
+# CHECK: Type: R_MIPS_JALR/R_MIPS_JALR/R_MIPS_JALR (2434341)
+# CHECK: Type: R_MIPS_TLS_DTPMOD32/R_MIPS_TLS_DTPMOD32/R_MIPS_TLS_DTPMOD32 (2500134)
+# CHECK: Type: R_MIPS_TLS_DTPREL32/R_MIPS_TLS_DTPREL32/R_MIPS_TLS_DTPREL32 (2565927)
+# CHECK: Type: R_MIPS_TLS_DTPMOD64/R_MIPS_TLS_DTPMOD64/R_MIPS_TLS_DTPMOD64 (2631720)
+# CHECK: Type: R_MIPS_TLS_DTPREL64/R_MIPS_TLS_DTPREL64/R_MIPS_TLS_DTPREL64 (2697513)
+# CHECK: Type: R_MIPS_TLS_GD/R_MIPS_TLS_GD/R_MIPS_TLS_GD (2763306)
+# CHECK: Type: R_MIPS_TLS_LDM/R_MIPS_TLS_LDM/R_MIPS_TLS_LDM (2829099)
+# CHECK: Type: R_MIPS_TLS_DTPREL_HI16/R_MIPS_TLS_DTPREL_HI16/R_MIPS_TLS_DTPREL_HI16 (2894892)
+# CHECK: Type: R_MIPS_TLS_DTPREL_LO16/R_MIPS_TLS_DTPREL_LO16/R_MIPS_TLS_DTPREL_LO16 (2960685)
+# CHECK: Type: R_MIPS_TLS_GOTTPREL/R_MIPS_TLS_GOTTPREL/R_MIPS_TLS_GOTTPREL (3026478)
+# CHECK: Type: R_MIPS_TLS_TPREL32/R_MIPS_TLS_TPREL32/R_MIPS_TLS_TPREL32 (3092271)
+# CHECK: Type: R_MIPS_TLS_TPREL64/R_MIPS_TLS_TPREL64/R_MIPS_TLS_TPREL64 (3158064)
+# CHECK: Type: R_MIPS_TLS_TPREL_HI16/R_MIPS_TLS_TPREL_HI16/R_MIPS_TLS_TPREL_HI16 (3223857)
+# CHECK: Type: R_MIPS_TLS_TPREL_LO16/R_MIPS_TLS_TPREL_LO16/R_MIPS_TLS_TPREL_LO16 (3289650)
+# CHECK: Type: R_MIPS_GLOB_DAT/R_MIPS_GLOB_DAT/R_MIPS_GLOB_DAT (3355443)
+# CHECK: Type: R_MIPS_COPY/R_MIPS_COPY/R_MIPS_COPY (8289918)
+# CHECK: Type: R_MIPS_JUMP_SLOT/R_MIPS_JUMP_SLOT/R_MIPS_JUMP_SLOT (8355711)
+# CHECK: Type: R_MIPS_NUM/R_MIPS_NUM/R_MIPS_NUM (14342874)
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_MIPS
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Content: 00
+ - Name: .rela.text
+ Type: SHT_RELA
+ AddressAlign: 0x0000000000000008
+ EntSize: 0x0000000000000018
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000000
+ Type: R_MIPS_NONE
+ - Offset: 0x0000000000000004
+ Type: R_MIPS_16
+ Type2: R_MIPS_16
+ Type3: R_MIPS_16
+ - Offset: 0x0000000000000008
+ Type: R_MIPS_32
+ Type2: R_MIPS_32
+ Type3: R_MIPS_32
+ - Offset: 0x000000000000000C
+ Type: R_MIPS_REL32
+ Type2: R_MIPS_REL32
+ Type3: R_MIPS_REL32
+ - Offset: 0x0000000000000010
+ Type: R_MIPS_26
+ Type2: R_MIPS_26
+ Type3: R_MIPS_26
+ - Offset: 0x0000000000000014
+ Type: R_MIPS_HI16
+ Type2: R_MIPS_HI16
+ Type3: R_MIPS_HI16
+ - Offset: 0x0000000000000018
+ Type: R_MIPS_LO16
+ Type2: R_MIPS_LO16
+ Type3: R_MIPS_LO16
+ - Offset: 0x000000000000001C
+ Type: R_MIPS_GPREL16
+ Type2: R_MIPS_GPREL16
+ Type3: R_MIPS_GPREL16
+ - Offset: 0x0000000000000020
+ Type: R_MIPS_LITERAL
+ Type2: R_MIPS_LITERAL
+ Type3: R_MIPS_LITERAL
+ - Offset: 0x0000000000000024
+ Type: R_MIPS_GOT16
+ Type2: R_MIPS_GOT16
+ Type3: R_MIPS_GOT16
+ - Offset: 0x0000000000000028
+ Type: R_MIPS_PC16
+ Type2: R_MIPS_PC16
+ Type3: R_MIPS_PC16
+ - Offset: 0x000000000000002C
+ Type: R_MIPS_CALL16
+ Type2: R_MIPS_CALL16
+ Type3: R_MIPS_CALL16
+ - Offset: 0x0000000000000030
+ Type: R_MIPS_GPREL32
+ Type2: R_MIPS_GPREL32
+ Type3: R_MIPS_GPREL32
+ - Offset: 0x0000000000000034
+ Type: R_MIPS_SHIFT5
+ Type2: R_MIPS_SHIFT5
+ Type3: R_MIPS_SHIFT5
+ - Offset: 0x0000000000000038
+ Type: R_MIPS_SHIFT6
+ Type2: R_MIPS_SHIFT6
+ Type3: R_MIPS_SHIFT6
+ - Offset: 0x000000000000003C
+ Type: R_MIPS_64
+ Type2: R_MIPS_64
+ Type3: R_MIPS_64
+ - Offset: 0x0000000000000040
+ Type: R_MIPS_GOT_DISP
+ Type2: R_MIPS_GOT_DISP
+ Type3: R_MIPS_GOT_DISP
+ - Offset: 0x0000000000000044
+ Type: R_MIPS_GOT_PAGE
+ Type2: R_MIPS_GOT_PAGE
+ Type3: R_MIPS_GOT_PAGE
+ - Offset: 0x0000000000000048
+ Type: R_MIPS_GOT_OFST
+ Type2: R_MIPS_GOT_OFST
+ Type3: R_MIPS_GOT_OFST
+ - Offset: 0x000000000000004C
+ Type: R_MIPS_GOT_HI16
+ Type2: R_MIPS_GOT_HI16
+ Type3: R_MIPS_GOT_HI16
+ - Offset: 0x0000000000000050
+ Type: R_MIPS_GOT_LO16
+ Type2: R_MIPS_GOT_LO16
+ Type3: R_MIPS_GOT_LO16
+ - Offset: 0x0000000000000054
+ Type: R_MIPS_SUB
+ Type2: R_MIPS_SUB
+ Type3: R_MIPS_SUB
+ - Offset: 0x0000000000000058
+ Type: R_MIPS_INSERT_A
+ Type2: R_MIPS_INSERT_A
+ Type3: R_MIPS_INSERT_A
+ - Offset: 0x000000000000005C
+ Type: R_MIPS_INSERT_B
+ Type2: R_MIPS_INSERT_B
+ Type3: R_MIPS_INSERT_B
+ - Offset: 0x0000000000000060
+ Type: R_MIPS_DELETE
+ Type2: R_MIPS_DELETE
+ Type3: R_MIPS_DELETE
+ - Offset: 0x0000000000000064
+ Type: R_MIPS_HIGHER
+ Type2: R_MIPS_HIGHER
+ Type3: R_MIPS_HIGHER
+ - Offset: 0x0000000000000068
+ Type: R_MIPS_HIGHEST
+ Type2: R_MIPS_HIGHEST
+ Type3: R_MIPS_HIGHEST
+ - Offset: 0x000000000000006C
+ Type: R_MIPS_CALL_HI16
+ Type2: R_MIPS_CALL_HI16
+ Type3: R_MIPS_CALL_HI16
+ - Offset: 0x0000000000000070
+ Type: R_MIPS_CALL_LO16
+ Type2: R_MIPS_CALL_LO16
+ Type3: R_MIPS_CALL_LO16
+ - Offset: 0x0000000000000074
+ Type: R_MIPS_SCN_DISP
+ Type2: R_MIPS_SCN_DISP
+ Type3: R_MIPS_SCN_DISP
+ - Offset: 0x0000000000000078
+ Type: R_MIPS_REL16
+ Type2: R_MIPS_REL16
+ Type3: R_MIPS_REL16
+ - Offset: 0x000000000000007C
+ Type: R_MIPS_ADD_IMMEDIATE
+ Type2: R_MIPS_ADD_IMMEDIATE
+ Type3: R_MIPS_ADD_IMMEDIATE
+ - Offset: 0x0000000000000080
+ Type: R_MIPS_PJUMP
+ Type2: R_MIPS_PJUMP
+ Type3: R_MIPS_PJUMP
+ - Offset: 0x0000000000000084
+ Type: R_MIPS_RELGOT
+ Type2: R_MIPS_RELGOT
+ Type3: R_MIPS_RELGOT
+ - Offset: 0x0000000000000088
+ Type: R_MIPS_JALR
+ Type2: R_MIPS_JALR
+ Type3: R_MIPS_JALR
+ - Offset: 0x000000000000008C
+ Type: R_MIPS_TLS_DTPMOD32
+ Type2: R_MIPS_TLS_DTPMOD32
+ Type3: R_MIPS_TLS_DTPMOD32
+ - Offset: 0x0000000000000090
+ Type: R_MIPS_TLS_DTPREL32
+ Type2: R_MIPS_TLS_DTPREL32
+ Type3: R_MIPS_TLS_DTPREL32
+ - Offset: 0x0000000000000094
+ Type: R_MIPS_TLS_DTPMOD64
+ Type2: R_MIPS_TLS_DTPMOD64
+ Type3: R_MIPS_TLS_DTPMOD64
+ - Offset: 0x0000000000000098
+ Type: R_MIPS_TLS_DTPREL64
+ Type2: R_MIPS_TLS_DTPREL64
+ Type3: R_MIPS_TLS_DTPREL64
+ - Offset: 0x000000000000009C
+ Type: R_MIPS_TLS_GD
+ Type2: R_MIPS_TLS_GD
+ Type3: R_MIPS_TLS_GD
+ - Offset: 0x00000000000000A0
+ Type: R_MIPS_TLS_LDM
+ Type2: R_MIPS_TLS_LDM
+ Type3: R_MIPS_TLS_LDM
+ - Offset: 0x00000000000000A4
+ Type: R_MIPS_TLS_DTPREL_HI16
+ Type2: R_MIPS_TLS_DTPREL_HI16
+ Type3: R_MIPS_TLS_DTPREL_HI16
+ - Offset: 0x00000000000000A8
+ Type: R_MIPS_TLS_DTPREL_LO16
+ Type2: R_MIPS_TLS_DTPREL_LO16
+ Type3: R_MIPS_TLS_DTPREL_LO16
+ - Offset: 0x00000000000000AC
+ Type: R_MIPS_TLS_GOTTPREL
+ Type2: R_MIPS_TLS_GOTTPREL
+ Type3: R_MIPS_TLS_GOTTPREL
+ - Offset: 0x00000000000000B0
+ Type: R_MIPS_TLS_TPREL32
+ Type2: R_MIPS_TLS_TPREL32
+ Type3: R_MIPS_TLS_TPREL32
+ - Offset: 0x00000000000000B4
+ Type: R_MIPS_TLS_TPREL64
+ Type2: R_MIPS_TLS_TPREL64
+ Type3: R_MIPS_TLS_TPREL64
+ - Offset: 0x00000000000000B8
+ Type: R_MIPS_TLS_TPREL_HI16
+ Type2: R_MIPS_TLS_TPREL_HI16
+ Type3: R_MIPS_TLS_TPREL_HI16
+ - Offset: 0x00000000000000BC
+ Type: R_MIPS_TLS_TPREL_LO16
+ Type2: R_MIPS_TLS_TPREL_LO16
+ Type3: R_MIPS_TLS_TPREL_LO16
+ - Offset: 0x00000000000000C0
+ Type: R_MIPS_GLOB_DAT
+ Type2: R_MIPS_GLOB_DAT
+ Type3: R_MIPS_GLOB_DAT
+ - Offset: 0x00000000000000C4
+ Type: R_MIPS_COPY
+ Type2: R_MIPS_COPY
+ Type3: R_MIPS_COPY
+ - Offset: 0x00000000000000C8
+ Type: R_MIPS_JUMP_SLOT
+ Type2: R_MIPS_JUMP_SLOT
+ Type3: R_MIPS_JUMP_SLOT
+ - Offset: 0x00000000000000CC
+ Type: R_MIPS_NUM
+ Type2: R_MIPS_NUM
+ Type3: R_MIPS_NUM
diff --git a/llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-ppc64.test b/llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-ppc64.test
new file mode 100644
index 00000000000..7e081b7e4e2
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-ppc64.test
@@ -0,0 +1,293 @@
+## Test that llvm-readobj shows proper relocation type
+## names and values for ppc64 target.
+
+# RUN: yaml2obj %s -o %t-ppc64.o
+# RUN: llvm-readobj -r --expand-relocs %t-ppc64.o | FileCheck %s
+
+# CHECK: Type: R_PPC64_NONE (0)
+# CHECK: Type: R_PPC64_ADDR32 (1)
+# CHECK: Type: R_PPC64_ADDR24 (2)
+# CHECK: Type: R_PPC64_ADDR16 (3)
+# CHECK: Type: R_PPC64_ADDR16_LO (4)
+# CHECK: Type: R_PPC64_ADDR16_HI (5)
+# CHECK: Type: R_PPC64_ADDR16_HA (6)
+# CHECK: Type: R_PPC64_ADDR14 (7)
+# CHECK: Type: R_PPC64_ADDR14_BRTAKEN (8)
+# CHECK: Type: R_PPC64_ADDR14_BRNTAKEN (9)
+# CHECK: Type: R_PPC64_REL24 (10)
+# CHECK: Type: R_PPC64_REL14 (11)
+# CHECK: Type: R_PPC64_REL14_BRTAKEN (12)
+# CHECK: Type: R_PPC64_REL14_BRNTAKEN (13)
+# CHECK: Type: R_PPC64_GOT16 (14)
+# CHECK: Type: R_PPC64_GOT16_LO (15)
+# CHECK: Type: R_PPC64_GOT16_HI (16)
+# CHECK: Type: R_PPC64_GOT16_HA (17)
+# CHECK: Type: R_PPC64_GLOB_DAT (20)
+# CHECK: Type: R_PPC64_JMP_SLOT (21)
+# CHECK: Type: R_PPC64_RELATIVE (22)
+# CHECK: Type: R_PPC64_REL32 (26)
+# CHECK: Type: R_PPC64_ADDR64 (38)
+# CHECK: Type: R_PPC64_ADDR16_HIGHER (39)
+# CHECK: Type: R_PPC64_ADDR16_HIGHERA (40)
+# CHECK: Type: R_PPC64_ADDR16_HIGHEST (41)
+# CHECK: Type: R_PPC64_ADDR16_HIGHESTA (42)
+# CHECK: Type: R_PPC64_REL64 (44)
+# CHECK: Type: R_PPC64_TOC16 (47)
+# CHECK: Type: R_PPC64_TOC16_LO (48)
+# CHECK: Type: R_PPC64_TOC16_HI (49)
+# CHECK: Type: R_PPC64_TOC16_HA (50)
+# CHECK: Type: R_PPC64_TOC (51)
+# CHECK: Type: R_PPC64_ADDR16_DS (56)
+# CHECK: Type: R_PPC64_ADDR16_LO_DS (57)
+# CHECK: Type: R_PPC64_GOT16_DS (58)
+# CHECK: Type: R_PPC64_GOT16_LO_DS (59)
+# CHECK: Type: R_PPC64_TOC16_DS (63)
+# CHECK: Type: R_PPC64_TOC16_LO_DS (64)
+# CHECK: Type: R_PPC64_TLS (67)
+# CHECK: Type: R_PPC64_DTPMOD64 (68)
+# CHECK: Type: R_PPC64_TPREL16 (69)
+# CHECK: Type: R_PPC64_TPREL16_LO (70)
+# CHECK: Type: R_PPC64_TPREL16_HI (71)
+# CHECK: Type: R_PPC64_TPREL16_HA (72)
+# CHECK: Type: R_PPC64_TPREL64 (73)
+# CHECK: Type: R_PPC64_DTPREL16 (74)
+# CHECK: Type: R_PPC64_DTPREL16_LO (75)
+# CHECK: Type: R_PPC64_DTPREL16_HI (76)
+# CHECK: Type: R_PPC64_DTPREL16_HA (77)
+# CHECK: Type: R_PPC64_DTPREL64 (78)
+# CHECK: Type: R_PPC64_GOT_TLSGD16 (79)
+# CHECK: Type: R_PPC64_GOT_TLSGD16_LO (80)
+# CHECK: Type: R_PPC64_GOT_TLSGD16_HI (81)
+# CHECK: Type: R_PPC64_GOT_TLSGD16_HA (82)
+# CHECK: Type: R_PPC64_GOT_TLSLD16 (83)
+# CHECK: Type: R_PPC64_GOT_TLSLD16_LO (84)
+# CHECK: Type: R_PPC64_GOT_TLSLD16_HI (85)
+# CHECK: Type: R_PPC64_GOT_TLSLD16_HA (86)
+# CHECK: Type: R_PPC64_GOT_TPREL16_DS (87)
+# CHECK: Type: R_PPC64_GOT_TPREL16_LO_DS (88)
+# CHECK: Type: R_PPC64_GOT_TPREL16_HI (89)
+# CHECK: Type: R_PPC64_GOT_TPREL16_HA (90)
+# CHECK: Type: R_PPC64_GOT_DTPREL16_DS (91)
+# CHECK: Type: R_PPC64_GOT_DTPREL16_LO_DS (92)
+# CHECK: Type: R_PPC64_GOT_DTPREL16_HI (93)
+# CHECK: Type: R_PPC64_GOT_DTPREL16_HA (94)
+# CHECK: Type: R_PPC64_TPREL16_DS (95)
+# CHECK: Type: R_PPC64_TPREL16_LO_DS (96)
+# CHECK: Type: R_PPC64_TPREL16_HIGHER (97)
+# CHECK: Type: R_PPC64_TPREL16_HIGHERA (98)
+# CHECK: Type: R_PPC64_TPREL16_HIGHEST (99)
+# CHECK: Type: R_PPC64_TPREL16_HIGHESTA (100)
+# CHECK: Type: R_PPC64_DTPREL16_DS (101)
+# CHECK: Type: R_PPC64_DTPREL16_LO_DS (102)
+# CHECK: Type: R_PPC64_DTPREL16_HIGHER (103)
+# CHECK: Type: R_PPC64_DTPREL16_HIGHERA (104)
+# CHECK: Type: R_PPC64_DTPREL16_HIGHEST (105)
+# CHECK: Type: R_PPC64_DTPREL16_HIGHESTA (106)
+# CHECK: Type: R_PPC64_TLSGD (107)
+# CHECK: Type: R_PPC64_TLSLD (108)
+# CHECK: Type: R_PPC64_ADDR16_HIGH (110)
+# CHECK: Type: R_PPC64_ADDR16_HIGHA (111)
+# CHECK: Type: R_PPC64_TPREL16_HIGH (112)
+# CHECK: Type: R_PPC64_TPREL16_HIGHA (113)
+# CHECK: Type: R_PPC64_DTPREL16_HIGH (114)
+# CHECK: Type: R_PPC64_DTPREL16_HIGHA (115)
+# CHECK: Type: R_PPC64_IRELATIVE (248)
+# CHECK: Type: R_PPC64_REL16 (249)
+# CHECK: Type: R_PPC64_REL16_LO (250)
+# CHECK: Type: R_PPC64_REL16_HI (251)
+# CHECK: Type: R_PPC64_REL16_HA (252)
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2MSB
+ Type: ET_REL
+ Machine: EM_PPC64
+Sections:
+ - Name: .rela.text
+ Type: SHT_RELA
+ Relocations:
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_NONE
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_ADDR32
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_ADDR24
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_ADDR16
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_ADDR16_LO
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_ADDR16_HI
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_ADDR16_HA
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_ADDR14
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_ADDR14_BRTAKEN
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_ADDR14_BRNTAKEN
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_REL24
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_REL14
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_REL14_BRTAKEN
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_REL14_BRNTAKEN
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_GOT16
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_GOT16_LO
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_GOT16_HI
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_GOT16_HA
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_GLOB_DAT
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_JMP_SLOT
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_RELATIVE
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_REL32
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_ADDR64
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_ADDR16_HIGHER
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_ADDR16_HIGHERA
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_ADDR16_HIGHEST
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_ADDR16_HIGHESTA
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_REL64
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_TOC16
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_TOC16_LO
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_TOC16_HI
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_TOC16_HA
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_TOC
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_ADDR16_DS
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_ADDR16_LO_DS
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_GOT16_DS
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_GOT16_LO_DS
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_TOC16_DS
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_TOC16_LO_DS
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_TLS
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_DTPMOD64
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_TPREL16
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_TPREL16_LO
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_TPREL16_HI
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_TPREL16_HA
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_TPREL64
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_DTPREL16
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_DTPREL16_LO
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_DTPREL16_HI
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_DTPREL16_HA
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_DTPREL64
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_GOT_TLSGD16
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_GOT_TLSGD16_LO
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_GOT_TLSGD16_HI
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_GOT_TLSGD16_HA
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_GOT_TLSLD16
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_GOT_TLSLD16_LO
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_GOT_TLSLD16_HI
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_GOT_TLSLD16_HA
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_GOT_TPREL16_DS
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_GOT_TPREL16_LO_DS
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_GOT_TPREL16_HI
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_GOT_TPREL16_HA
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_GOT_DTPREL16_DS
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_GOT_DTPREL16_LO_DS
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_GOT_DTPREL16_HI
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_GOT_DTPREL16_HA
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_TPREL16_DS
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_TPREL16_LO_DS
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_TPREL16_HIGHER
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_TPREL16_HIGHERA
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_TPREL16_HIGHEST
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_TPREL16_HIGHESTA
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_DTPREL16_DS
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_DTPREL16_LO_DS
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_DTPREL16_HIGHER
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_DTPREL16_HIGHERA
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_DTPREL16_HIGHEST
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_DTPREL16_HIGHESTA
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_TLSGD
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_TLSLD
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_ADDR16_HIGH
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_ADDR16_HIGHA
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_TPREL16_HIGH
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_TPREL16_HIGHA
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_DTPREL16_HIGH
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_DTPREL16_HIGHA
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_IRELATIVE
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_REL16
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_REL16_LO
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_REL16_HI
+ - Offset: 0x0000000000000000
+ Type: R_PPC64_REL16_HA
diff --git a/llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-x64.test b/llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-x64.test
new file mode 100644
index 00000000000..ad4e06fc955
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-x64.test
@@ -0,0 +1,232 @@
+## Test that llvm-readobj/llvm-readelf shows proper relocation type
+## names and values for x86_64 target.
+
+# RUN: yaml2obj %s -o %t-x86_64.o
+# RUN: llvm-readobj -r --expand-relocs %t-x86_64.o | FileCheck %s --check-prefix=LLVM
+# RUN: llvm-readelf -r --expand-relocs %t-x86_64.o | FileCheck %s --check-prefix=GNU
+
+# LLVM: Type: R_X86_64_NONE (0)
+# LLVM: Type: R_X86_64_64 (1)
+# LLVM: Type: R_X86_64_PC32 (2)
+# LLVM: Type: R_X86_64_GOT32 (3)
+# LLVM: Type: R_X86_64_PLT32 (4)
+# LLVM: Type: R_X86_64_COPY (5)
+# LLVM: Type: R_X86_64_GLOB_DAT (6)
+# LLVM: Type: R_X86_64_JUMP_SLOT (7)
+# LLVM: Type: R_X86_64_RELATIVE (8)
+# LLVM: Type: R_X86_64_GOTPCREL (9)
+# LLVM: Type: R_X86_64_32 (10)
+# LLVM: Type: R_X86_64_32S (11)
+# LLVM: Type: R_X86_64_16 (12)
+# LLVM: Type: R_X86_64_PC16 (13)
+# LLVM: Type: R_X86_64_8 (14)
+# LLVM: Type: R_X86_64_PC8 (15)
+# LLVM: Type: R_X86_64_DTPMOD64 (16)
+# LLVM: Type: R_X86_64_DTPOFF64 (17)
+# LLVM: Type: R_X86_64_TPOFF64 (18)
+# LLVM: Type: R_X86_64_TLSGD (19)
+# LLVM: Type: R_X86_64_TLSLD (20)
+# LLVM: Type: R_X86_64_DTPOFF32 (21)
+# LLVM: Type: R_X86_64_GOTTPOFF (22)
+# LLVM: Type: R_X86_64_TPOFF32 (23)
+# LLVM: Type: R_X86_64_PC64 (24)
+# LLVM: Type: R_X86_64_GOTOFF64 (25)
+# LLVM: Type: R_X86_64_GOTPC32 (26)
+# LLVM: Type: R_X86_64_GOT64 (27)
+# LLVM: Type: R_X86_64_GOTPCREL64 (28)
+# LLVM: Type: R_X86_64_GOTPC64 (29)
+# LLVM: Type: R_X86_64_GOTPLT64 (30)
+# LLVM: Type: R_X86_64_PLTOFF64 (31)
+# LLVM: Type: R_X86_64_SIZE32 (32)
+# LLVM: Type: R_X86_64_SIZE64 (33)
+# LLVM: Type: R_X86_64_GOTPC32_TLSDESC (34)
+# LLVM: Type: R_X86_64_TLSDESC_CALL (35)
+# LLVM: Type: R_X86_64_TLSDESC (36)
+# LLVM: Type: R_X86_64_IRELATIVE (37)
+# LLVM: Type: R_X86_64_GOTPCRELX (41)
+# LLVM: Type: R_X86_64_REX_GOTPCRELX (42)
+
+# GNU: Relocation section '.rela.text' at offset 0x48 contains 40 entries:
+# GNU-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend
+# GNU-NEXT: 0000000000000003 0000000100000000 R_X86_64_NONE 0000000000000000 foo + 0
+# GNU-NEXT: 000000000000000a 0000000100000001 R_X86_64_64 0000000000000000 foo + 0
+# GNU-NEXT: 0000000000000011 0000000100000002 R_X86_64_PC32 0000000000000000 foo + 0
+# GNU-NEXT: 0000000000000018 0000000100000003 R_X86_64_GOT32 0000000000000000 foo + 0
+# GNU-NEXT: 000000000000001f 0000000100000004 R_X86_64_PLT32 0000000000000000 foo + 0
+# GNU-NEXT: 0000000000000026 0000000100000005 R_X86_64_COPY 0000000000000000 foo + 0
+# GNU-NEXT: 000000000000002d 0000000100000006 R_X86_64_GLOB_DAT 0000000000000000 foo + 0
+# GNU-NEXT: 0000000000000034 0000000100000007 R_X86_64_JUMP_SLOT 0000000000000000 foo + 0
+# GNU-NEXT: 000000000000003b 0000000100000008 R_X86_64_RELATIVE 0000000000000000 foo + 0
+# GNU-NEXT: 0000000000000042 0000000100000009 R_X86_64_GOTPCREL 0000000000000000 foo + 0
+# GNU-NEXT: 0000000000000049 000000010000000a R_X86_64_32 0000000000000000 foo + 0
+# GNU-NEXT: 0000000000000050 000000010000000b R_X86_64_32S 0000000000000000 foo + 0
+# GNU-NEXT: 0000000000000057 000000010000000c R_X86_64_16 0000000000000000 foo + 0
+# GNU-NEXT: 000000000000005e 000000010000000d R_X86_64_PC16 0000000000000000 foo + 0
+# GNU-NEXT: 0000000000000065 000000010000000e R_X86_64_8 0000000000000000 foo + 0
+# GNU-NEXT: 000000000000006c 000000010000000f R_X86_64_PC8 0000000000000000 foo + 0
+# GNU-NEXT: 0000000000000073 0000000100000010 R_X86_64_DTPMOD64 0000000000000000 foo + 0
+# GNU-NEXT: 000000000000007a 0000000100000011 R_X86_64_DTPOFF64 0000000000000000 foo + 0
+# GNU-NEXT: 0000000000000081 0000000100000012 R_X86_64_TPOFF64 0000000000000000 foo + 0
+# GNU-NEXT: 0000000000000088 0000000100000013 R_X86_64_TLSGD 0000000000000000 foo + 0
+# GNU-NEXT: 000000000000008f 0000000100000014 R_X86_64_TLSLD 0000000000000000 foo + 0
+# GNU-NEXT: 0000000000000096 0000000100000015 R_X86_64_DTPOFF32 0000000000000000 foo + 0
+# GNU-NEXT: 000000000000009d 0000000100000016 R_X86_64_GOTTPOFF 0000000000000000 foo + 0
+# GNU-NEXT: 00000000000000a4 0000000100000017 R_X86_64_TPOFF32 0000000000000000 foo + 0
+# GNU-NEXT: 00000000000000ab 0000000100000018 R_X86_64_PC64 0000000000000000 foo + 0
+# GNU-NEXT: 00000000000000b2 0000000100000019 R_X86_64_GOTOFF64 0000000000000000 foo + 0
+# GNU-NEXT: 00000000000000b9 000000010000001a R_X86_64_GOTPC32 0000000000000000 foo + 0
+# GNU-NEXT: 00000000000000c0 000000010000001b R_X86_64_GOT64 0000000000000000 foo + 0
+# GNU-NEXT: 00000000000000c7 000000010000001c R_X86_64_GOTPCREL64 0000000000000000 foo + 0
+# GNU-NEXT: 00000000000000ce 000000010000001d R_X86_64_GOTPC64 0000000000000000 foo + 0
+# GNU-NEXT: 00000000000000d5 000000010000001e R_X86_64_GOTPLT64 0000000000000000 foo + 0
+# GNU-NEXT: 00000000000000dc 000000010000001f R_X86_64_PLTOFF64 0000000000000000 foo + 0
+# GNU-NEXT: 00000000000000e3 0000000100000020 R_X86_64_SIZE32 0000000000000000 foo + 0
+# GNU-NEXT: 00000000000000ea 0000000100000021 R_X86_64_SIZE64 0000000000000000 foo + 0
+# GNU-NEXT: 00000000000000f1 0000000100000022 R_X86_64_GOTPC32_TLSDESC 0000000000000000 foo + 0
+# GNU-NEXT: 00000000000000f8 0000000100000023 R_X86_64_TLSDESC_CALL 0000000000000000 foo + 0
+# GNU-NEXT: 00000000000000ff 0000000100000024 R_X86_64_TLSDESC 0000000000000000 foo + 0
+# GNU-NEXT: 0000000000000106 0000000100000025 R_X86_64_IRELATIVE 0000000000000000 foo + 0
+# GNU-NEXT: 000000000000010a 0000000100000029 R_X86_64_GOTPCRELX 0000000000000000 foo + 0
+# GNU-NEXT: 000000000000010e 000000010000002a R_X86_64_REX_GOTPCRELX 0000000000000000 foo + 0
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Content: 00
+ - Name: .rela.text
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 0x0000000000000008
+ EntSize: 0x0000000000000018
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000003
+ Type: R_X86_64_NONE
+ Symbol: foo
+ - Offset: 0x000000000000000A
+ Type: R_X86_64_64
+ Symbol: foo
+ - Offset: 0x0000000000000011
+ Type: R_X86_64_PC32
+ Symbol: foo
+ - Offset: 0x0000000000000018
+ Type: R_X86_64_GOT32
+ Symbol: foo
+ - Offset: 0x000000000000001F
+ Type: R_X86_64_PLT32
+ Symbol: foo
+ - Offset: 0x0000000000000026
+ Type: R_X86_64_COPY
+ Symbol: foo
+ - Offset: 0x000000000000002D
+ Type: R_X86_64_GLOB_DAT
+ Symbol: foo
+ - Offset: 0x0000000000000034
+ Type: R_X86_64_JUMP_SLOT
+ Symbol: foo
+ - Offset: 0x000000000000003B
+ Type: R_X86_64_RELATIVE
+ Symbol: foo
+ - Offset: 0x0000000000000042
+ Type: R_X86_64_GOTPCREL
+ Symbol: foo
+ - Offset: 0x0000000000000049
+ Type: R_X86_64_32
+ Symbol: foo
+ - Offset: 0x0000000000000050
+ Type: R_X86_64_32S
+ Symbol: foo
+ - Offset: 0x0000000000000057
+ Type: R_X86_64_16
+ Symbol: foo
+ - Offset: 0x000000000000005E
+ Type: R_X86_64_PC16
+ Symbol: foo
+ - Offset: 0x0000000000000065
+ Type: R_X86_64_8
+ Symbol: foo
+ - Offset: 0x000000000000006C
+ Type: R_X86_64_PC8
+ Symbol: foo
+ - Offset: 0x0000000000000073
+ Type: R_X86_64_DTPMOD64
+ Symbol: foo
+ - Offset: 0x000000000000007A
+ Type: R_X86_64_DTPOFF64
+ Symbol: foo
+ - Offset: 0x0000000000000081
+ Type: R_X86_64_TPOFF64
+ Symbol: foo
+ - Offset: 0x0000000000000088
+ Type: R_X86_64_TLSGD
+ Symbol: foo
+ - Offset: 0x000000000000008F
+ Type: R_X86_64_TLSLD
+ Symbol: foo
+ - Offset: 0x0000000000000096
+ Type: R_X86_64_DTPOFF32
+ Symbol: foo
+ - Offset: 0x000000000000009D
+ Type: R_X86_64_GOTTPOFF
+ Symbol: foo
+ - Offset: 0x00000000000000A4
+ Type: R_X86_64_TPOFF32
+ Symbol: foo
+ - Offset: 0x00000000000000AB
+ Type: R_X86_64_PC64
+ Symbol: foo
+ - Offset: 0x00000000000000B2
+ Type: R_X86_64_GOTOFF64
+ Symbol: foo
+ - Offset: 0x00000000000000B9
+ Type: R_X86_64_GOTPC32
+ Symbol: foo
+ - Offset: 0x00000000000000C0
+ Type: R_X86_64_GOT64
+ Symbol: foo
+ - Offset: 0x00000000000000C7
+ Type: R_X86_64_GOTPCREL64
+ Symbol: foo
+ - Offset: 0x00000000000000CE
+ Type: R_X86_64_GOTPC64
+ Symbol: foo
+ - Offset: 0x00000000000000D5
+ Type: R_X86_64_GOTPLT64
+ Symbol: foo
+ - Offset: 0x00000000000000DC
+ Type: R_X86_64_PLTOFF64
+ Symbol: foo
+ - Offset: 0x00000000000000E3
+ Type: R_X86_64_SIZE32
+ Symbol: foo
+ - Offset: 0x00000000000000EA
+ Type: R_X86_64_SIZE64
+ Symbol: foo
+ - Offset: 0x00000000000000F1
+ Type: R_X86_64_GOTPC32_TLSDESC
+ Symbol: foo
+ - Offset: 0x00000000000000F8
+ Type: R_X86_64_TLSDESC_CALL
+ Symbol: foo
+ - Offset: 0x00000000000000FF
+ Type: R_X86_64_TLSDESC
+ Symbol: foo
+ - Offset: 0x0000000000000106
+ Type: R_X86_64_IRELATIVE
+ Symbol: foo
+ - Offset: 0x000000000000010A
+ Type: R_X86_64_GOTPCRELX
+ Symbol: foo
+ - Offset: 0x000000000000010E
+ Type: R_X86_64_REX_GOTPCRELX
+ Symbol: foo
+Symbols:
+ - Name: foo
+ Binding: STB_GLOBAL
diff --git a/llvm/test/tools/llvm-readobj/ELF/reloc-zero-name-or-value.test b/llvm/test/tools/llvm-readobj/ELF/reloc-zero-name-or-value.test
new file mode 100644
index 00000000000..c6481badc14
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/reloc-zero-name-or-value.test
@@ -0,0 +1,109 @@
+# Show that the value field is omitted if a symbol has no name or value, but is
+# printed if one is present. Test for both static and dynamic relocation
+# printing.
+
+# RUN: yaml2obj %s -o %t
+# RUN: llvm-readelf --relocations --dyn-relocations %t | FileCheck %s
+
+# CHECK: Relocation section '.rela.text' at offset {{.*}} contains 3 entries:
+# CHECK-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend
+# CHECK-NEXT: 0000000000000000 0000000000000000 R_X86_64_NONE 1
+# CHECK-NEXT: 0000000000000000 0000000100000000 R_X86_64_NONE 0000000000000000 sym + 1
+# CHECK-NEXT: 0000000000000000 0000000200000000 R_X86_64_NONE 0000000000000123 456
+
+# CHECK: Relocation section '.rela.dyn' at offset {{.*}} contains 3 entries:
+# CHECK-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend
+# CHECK-NEXT: 0000000000000000 0000000000000000 R_X86_64_NONE 1
+# CHECK-NEXT: 0000000000000000 0000000100000000 R_X86_64_NONE 0000000000000000 sym + 1
+# CHECK-NEXT: 0000000000000000 0000000200000000 R_X86_64_NONE 0000000000000123 456
+
+# CHECK: 'RELA' relocation section at offset {{.*}} contains 72 bytes:
+# CHECK-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend
+# CHECK-NEXT: 0000000000000000 0000000000000000 R_X86_64_NONE 1
+# CHECK-NEXT: 0000000000000000 0000000100000000 R_X86_64_NONE 0000000000000000 sym + 1
+# CHECK-NEXT: 0000000000000000 0000000200000000 R_X86_64_NONE 0000000000000123 456
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x10
+ - Name: .rela.text
+ Type: SHT_RELA
+ Link: .symtab
+ Info: .text
+ Relocations:
+ - Offset: 0
+ Type: R_X86_64_NONE
+ Addend: 1
+ - Offset: 0
+ Type: R_X86_64_NONE
+ Addend: 1
+ Symbol: sym
+ - Offset: 0
+ Type: R_X86_64_NONE
+ Addend: 0x456
+ Symbol: 2
+ - Name: .dynamic
+ Type: SHT_DYNAMIC
+ Flags: [SHF_ALLOC]
+ Address: 0x1000
+ AddressAlign: 0x1000
+ Entries:
+ - Tag: DT_RELA
+ Value: 0x1100
+ - Tag: DT_RELASZ
+ Value: 72
+ - Tag: DT_RELAENT
+ Value: 24
+ - Tag: DT_NULL
+ Value: 0
+ - Name: .rela.dyn
+ Type: SHT_RELA
+ Flags: [SHF_ALLOC]
+ Info: .text
+ Address: 0x1100
+ AddressAlign: 0x100
+ Relocations:
+ - Offset: 0
+ Type: R_X86_64_NONE
+ Addend: 1
+ - Offset: 0
+ Type: R_X86_64_NONE
+ Addend: 1
+ Symbol: sym
+ - Offset: 0
+ Type: R_X86_64_NONE
+ Addend: 0x456
+ Symbol: 2
+Symbols:
+ - Name: sym
+ Value: 0
+ Section: .text
+ Binding: STB_GLOBAL
+ - Value: 0x123
+ Section: .text
+ Binding: STB_GLOBAL
+DynamicSymbols:
+ - Name: sym
+ Value: 0
+ Section: .text
+ Binding: STB_GLOBAL
+ - Value: 0x123
+ Section: .text
+ Binding: STB_GLOBAL
+ProgramHeaders:
+ - Type: PT_LOAD
+ VAddr: 0x1000
+ Sections:
+ - Section: .rela.dyn
+ - Section: .dynamic
+ - Type: PT_DYNAMIC
+ VAddr: 0x1000
+ Sections:
+ - Section: .dynamic
diff --git a/llvm/test/tools/llvm-readobj/ELF/relr-relocs.test b/llvm/test/tools/llvm-readobj/ELF/relr-relocs.test
new file mode 100644
index 00000000000..9d3b5de9928
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/relr-relocs.test
@@ -0,0 +1,174 @@
+# The binary blobs in this file were created like this:
+# llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu Inputs/elf-relr-relocs1.s -o - | obj2yaml | grep Content:
+
+# RUN: yaml2obj -docnum 1 %s \
+# RUN: | llvm-readobj --relocations --raw-relr - \
+# RUN: | FileCheck --check-prefix=RAW-LLVM1 %s
+# RAW-LLVM1: Section (1) .relr.dyn {
+# RAW-LLVM1-NEXT: 0x10D60
+# RAW-LLVM1-NEXT: 0x103
+# RAW-LLVM1-NEXT: 0x20000
+# RAW-LLVM1-NEXT: 0xF0501
+# RAW-LLVM1-NEXT: 0xA700550400009
+# RAW-LLVM1-NEXT: }
+
+# RUN: yaml2obj -docnum 1 %s \
+# RUN: | llvm-readobj --relocations - \
+# RUN: | FileCheck --check-prefix=LLVM1 %s
+# LLVM1: Section (1) .relr.dyn {
+# LLVM1-NEXT: 0x10D60 R_X86_64_RELATIVE - 0x0
+# LLVM1-NEXT: 0x10D68 R_X86_64_RELATIVE - 0x0
+# LLVM1-NEXT: 0x10DA0 R_X86_64_RELATIVE - 0x0
+# LLVM1-NEXT: 0x20000 R_X86_64_RELATIVE - 0x0
+# LLVM1-NEXT: 0x20040 R_X86_64_RELATIVE - 0x0
+# LLVM1-NEXT: 0x20050 R_X86_64_RELATIVE - 0x0
+# LLVM1-NEXT: 0x20080 R_X86_64_RELATIVE - 0x0
+# LLVM1-NEXT: 0x20088 R_X86_64_RELATIVE - 0x0
+# LLVM1-NEXT: 0x20090 R_X86_64_RELATIVE - 0x0
+# LLVM1-NEXT: 0x20098 R_X86_64_RELATIVE - 0x0
+# LLVM1-NEXT: 0x20210 R_X86_64_RELATIVE - 0x0
+# LLVM1-NEXT: 0x202A8 R_X86_64_RELATIVE - 0x0
+# LLVM1-NEXT: 0x202D8 R_X86_64_RELATIVE - 0x0
+# LLVM1-NEXT: 0x202E8 R_X86_64_RELATIVE - 0x0
+# LLVM1-NEXT: 0x202F8 R_X86_64_RELATIVE - 0x0
+# LLVM1-NEXT: 0x20308 R_X86_64_RELATIVE - 0x0
+# LLVM1-NEXT: 0x20358 R_X86_64_RELATIVE - 0x0
+# LLVM1-NEXT: 0x20360 R_X86_64_RELATIVE - 0x0
+# LLVM1-NEXT: 0x20368 R_X86_64_RELATIVE - 0x0
+# LLVM1-NEXT: 0x20380 R_X86_64_RELATIVE - 0x0
+# LLVM1-NEXT: 0x20390 R_X86_64_RELATIVE - 0x0
+# LLVM1-NEXT: }
+
+# RUN: yaml2obj -docnum 1 %s \
+# RUN: | llvm-readelf -relocations -raw-relr - \
+# RUN: | FileCheck --check-prefix=RAW-GNU1 %s
+# RAW-GNU1: Relocation section '.relr.dyn' at offset 0x40 contains 5 entries:
+# RAW-GNU1: 0000000000010d60
+# RAW-GNU1-NEXT: 0000000000000103
+# RAW-GNU1-NEXT: 0000000000020000
+# RAW-GNU1-NEXT: 00000000000f0501
+# RAW-GNU1-NEXT: 000a700550400009
+
+# RUN: yaml2obj -docnum 1 %s \
+# RUN: | llvm-readelf -relocations - \
+# RUN: | FileCheck --check-prefix=GNU1 %s
+# GNU1: Relocation section '.relr.dyn' at offset 0x40 contains 21 entries:
+# GNU1: 0000000000010d60 0000000000000008 R_X86_64_RELATIVE
+# GNU1-NEXT: 0000000000010d68 0000000000000008 R_X86_64_RELATIVE
+# GNU1-NEXT: 0000000000010da0 0000000000000008 R_X86_64_RELATIVE
+# GNU1-NEXT: 0000000000020000 0000000000000008 R_X86_64_RELATIVE
+# GNU1-NEXT: 0000000000020040 0000000000000008 R_X86_64_RELATIVE
+# GNU1-NEXT: 0000000000020050 0000000000000008 R_X86_64_RELATIVE
+# GNU1-NEXT: 0000000000020080 0000000000000008 R_X86_64_RELATIVE
+# GNU1-NEXT: 0000000000020088 0000000000000008 R_X86_64_RELATIVE
+# GNU1-NEXT: 0000000000020090 0000000000000008 R_X86_64_RELATIVE
+# GNU1-NEXT: 0000000000020098 0000000000000008 R_X86_64_RELATIVE
+# GNU1-NEXT: 0000000000020210 0000000000000008 R_X86_64_RELATIVE
+# GNU1-NEXT: 00000000000202a8 0000000000000008 R_X86_64_RELATIVE
+# GNU1-NEXT: 00000000000202d8 0000000000000008 R_X86_64_RELATIVE
+# GNU1-NEXT: 00000000000202e8 0000000000000008 R_X86_64_RELATIVE
+# GNU1-NEXT: 00000000000202f8 0000000000000008 R_X86_64_RELATIVE
+# GNU1-NEXT: 0000000000020308 0000000000000008 R_X86_64_RELATIVE
+# GNU1-NEXT: 0000000000020358 0000000000000008 R_X86_64_RELATIVE
+# GNU1-NEXT: 0000000000020360 0000000000000008 R_X86_64_RELATIVE
+# GNU1-NEXT: 0000000000020368 0000000000000008 R_X86_64_RELATIVE
+# GNU1-NEXT: 0000000000020380 0000000000000008 R_X86_64_RELATIVE
+# GNU1-NEXT: 0000000000020390 0000000000000008 R_X86_64_RELATIVE
+
+# elf-relr-relocs1.s
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_DYN
+ Machine: EM_X86_64
+ Entry: 0x0000000000001000
+Sections:
+ - Name: .relr.dyn
+ Type: SHT_RELR
+ Flags: [ SHF_ALLOC ]
+ Address: 0x00000000000001C8
+ Link: .symtab
+ AddressAlign: 0x0000000000000001
+ Content: 600D0100000000000301000000000000000002000000000001050F00000000000900405005700A00
+Symbols: []
+...
+
+# RUN: yaml2obj -docnum 2 %s \
+# RUN: | llvm-readobj --relocations --raw-relr - \
+# RUN: | FileCheck --check-prefix=RAW-LLVM2 %s
+# RAW-LLVM2: Section (1) .relr.dyn {
+# RAW-LLVM2-NEXT: 0x10D60
+# RAW-LLVM2-NEXT: 0x103
+# RAW-LLVM2-NEXT: 0x20000
+# RAW-LLVM2-NEXT: 0xF0501
+# RAW-LLVM2-NEXT: 0x50400009
+# RAW-LLVM2-NEXT: }
+
+# RUN: yaml2obj -docnum 2 %s \
+# RUN: | llvm-readobj --relocations - \
+# RUN: | FileCheck --check-prefix=LLVM2 %s
+# LLVM2: Section (1) .relr.dyn {
+# LLVM2-NEXT: 0x10D60 R_386_RELATIVE - 0x0
+# LLVM2-NEXT: 0x10D64 R_386_RELATIVE - 0x0
+# LLVM2-NEXT: 0x10D80 R_386_RELATIVE - 0x0
+# LLVM2-NEXT: 0x20000 R_386_RELATIVE - 0x0
+# LLVM2-NEXT: 0x20020 R_386_RELATIVE - 0x0
+# LLVM2-NEXT: 0x20028 R_386_RELATIVE - 0x0
+# LLVM2-NEXT: 0x20040 R_386_RELATIVE - 0x0
+# LLVM2-NEXT: 0x20044 R_386_RELATIVE - 0x0
+# LLVM2-NEXT: 0x20048 R_386_RELATIVE - 0x0
+# LLVM2-NEXT: 0x2004C R_386_RELATIVE - 0x0
+# LLVM2-NEXT: 0x20088 R_386_RELATIVE - 0x0
+# LLVM2-NEXT: 0x200D4 R_386_RELATIVE - 0x0
+# LLVM2-NEXT: 0x200EC R_386_RELATIVE - 0x0
+# LLVM2-NEXT: 0x200F4 R_386_RELATIVE - 0x0
+# LLVM2-NEXT: }
+
+# RUN: yaml2obj -docnum 2 %s \
+# RUN: | llvm-readelf -relocations -raw-relr - \
+# RUN: | FileCheck --check-prefix=RAW-GNU2 %s
+# RAW-GNU2: Relocation section '.relr.dyn' at offset 0x34 contains 5 entries:
+# RAW-GNU2: 00010d60
+# RAW-GNU2-NEXT: 00000103
+# RAW-GNU2-NEXT: 00020000
+# RAW-GNU2-NEXT: 000f0501
+# RAW-GNU2-NEXT: 50400009
+
+# RUN: yaml2obj -docnum 2 %s \
+# RUN: | llvm-readelf -relocations - \
+# RUN: | FileCheck --check-prefix=GNU2 %s
+# GNU2: Relocation section '.relr.dyn' at offset 0x34 contains 14 entries:
+# GNU2: 00010d60 00000008 R_386_RELATIVE
+# GNU2-NEXT: 00010d64 00000008 R_386_RELATIVE
+# GNU2-NEXT: 00010d80 00000008 R_386_RELATIVE
+# GNU2-NEXT: 00020000 00000008 R_386_RELATIVE
+# GNU2-NEXT: 00020020 00000008 R_386_RELATIVE
+# GNU2-NEXT: 00020028 00000008 R_386_RELATIVE
+# GNU2-NEXT: 00020040 00000008 R_386_RELATIVE
+# GNU2-NEXT: 00020044 00000008 R_386_RELATIVE
+# GNU2-NEXT: 00020048 00000008 R_386_RELATIVE
+# GNU2-NEXT: 0002004c 00000008 R_386_RELATIVE
+# GNU2-NEXT: 00020088 00000008 R_386_RELATIVE
+# GNU2-NEXT: 000200d4 00000008 R_386_RELATIVE
+# GNU2-NEXT: 000200ec 00000008 R_386_RELATIVE
+# GNU2-NEXT: 000200f4 00000008 R_386_RELATIVE
+
+# elf-relr-relocs2.s
+--- !ELF
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_DYN
+ Machine: EM_386
+ Entry: 0x00001000
+Sections:
+ - Name: .relr.dyn
+ Type: SHT_RELR
+ Flags: [ SHF_ALLOC ]
+ Address: 0x000001C8
+ Link: .symtab
+ AddressAlign: 0x00000001
+ Content: 600D0100030100000000020001050F0009004050
+Symbols: []
+...
diff --git a/llvm/test/tools/llvm-readobj/ELF/rpath.test b/llvm/test/tools/llvm-readobj/ELF/rpath.test
new file mode 100644
index 00000000000..75be5e2c668
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/rpath.test
@@ -0,0 +1,4 @@
+RUN: llvm-readobj --dynamic-table %p/Inputs/rpath.exe.elf-x86_64 \
+RUN: | FileCheck %s
+
+CHECK: 0x000000000000000F RPATH Library rpath: [/usr/local/lib]
diff --git a/llvm/test/tools/llvm-readobj/ELF/sec-compressed.test b/llvm/test/tools/llvm-readobj/ELF/sec-compressed.test
new file mode 100644
index 00000000000..5045c539289
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/sec-compressed.test
@@ -0,0 +1,9 @@
+RUN: llvm-readobj --sections \
+RUN: %p/Inputs/compression.zlib.style.elf-x86-64 | FileCheck %s
+
+CHECK: Section {
+CHECK: Name: .debug_info
+CHECK-NEXT: Type: SHT_PROGBITS
+CHECK-NEXT: Flags [
+CHECK-NEXT: SHF_COMPRESSED (0x800)
+CHECK-NEXT: ]
diff --git a/llvm/test/tools/llvm-readobj/ELF/sec-flags.test b/llvm/test/tools/llvm-readobj/ELF/sec-flags.test
new file mode 100644
index 00000000000..8507975918d
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/sec-flags.test
@@ -0,0 +1,67 @@
+# Check that llvm-readobj shows arch specific ELF section flags.
+
+# RUN: yaml2obj -docnum 1 %s > %t-hex.o
+# RUN: llvm-readobj -S %t-hex.o | FileCheck -check-prefix=HEX %s
+
+# HEX: Flags [ (0x10000000)
+# HEX-NEXT: SHF_HEX_GPREL (0x10000000)
+# HEX-NEXT: ]
+
+# hex.o
+--- !ELF
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_HEXAGON
+ Flags: []
+Sections:
+ - Name: .hex
+ Type: SHT_PROGBITS
+ Flags: [SHF_HEX_GPREL]
+ Size: 4
+
+# RUN: yaml2obj -docnum 2 %s > %t-mips.o
+# RUN: llvm-readobj -S %t-mips.o | FileCheck -check-prefix=MIPS %s
+
+# MIPS: Flags [ (0x38000000)
+# MIPS-NEXT: SHF_MIPS_GPREL (0x10000000)
+# MIPS-NEXT: SHF_MIPS_MERGE (0x20000000)
+# MIPS-NEXT: SHF_MIPS_NOSTRIP (0x8000000)
+# MIPS-NEXT: ]
+
+# mips.o
+--- !ELF
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: []
+Sections:
+ - Name: .mips
+ Type: SHT_PROGBITS
+ Flags: [SHF_MIPS_GPREL, SHF_MIPS_MERGE, SHF_MIPS_NOSTRIP]
+ Size: 4
+
+# RUN: yaml2obj -docnum 3 %s > %t-x86_64.o
+# RUN: llvm-readobj -S %t-x86_64.o | FileCheck -check-prefix=X86_64 %s
+
+# X86_64: Flags [ (0x10000000)
+# X86_64-NEXT: SHF_X86_64_LARGE (0x10000000)
+# X86_64-NEXT: ]
+
+# x86_64.o
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+ Flags: []
+Sections:
+ - Name: .x86_64
+ Type: SHT_PROGBITS
+ Flags: [SHF_X86_64_LARGE]
+ Size: 4
+...
diff --git a/llvm/test/tools/llvm-readobj/ELF/section-symbols.test b/llvm/test/tools/llvm-readobj/ELF/section-symbols.test
new file mode 100644
index 00000000000..b6357766fc2
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/section-symbols.test
@@ -0,0 +1,85 @@
+## ELF section symbols use the section names when printing. This test verifies
+## this and also that appropriate things are printed if the section is somehow
+## invalid.
+
+# RUN: yaml2obj %s -o %t1
+# RUN: llvm-readobj %t1 --symbols 2> %t.llvm.err1 | FileCheck %s --check-prefix=LLVM1
+# RUN: FileCheck %s --input-file %t.llvm.err1 --check-prefix=WARN1 --implicit-check-not=warning
+# RUN: llvm-readelf %t1 --symbols 2> %t.gnu.err1 | FileCheck %s --check-prefix=GNU1
+# RUN: FileCheck %s --input-file %t.gnu.err1 --check-prefix=WARN1 --implicit-check-not=warning
+
+# LLVM1: Name: (0)
+# LLVM1: Name: .foo (0)
+# LLVM1: Name: <section 67> (0)
+# LLVM1: Name: .bar (0)
+# LLVM1: Name: <section 66> (0)
+
+# GNU1: Symbol table '.symtab' contains 5 entries:
+# GNU1-NEXT: Num: {{.*}} Type {{.*}} Ndx Name
+# GNU1-NEXT: 0: {{.*}} NOTYPE {{.*}} UND {{$}}
+# GNU1-NEXT: 1: {{.*}} SECTION {{.*}} 1 .foo
+# GNU1-NEXT: 2: {{.*}} SECTION {{.*}} 67 <section 67>
+# GNU1-NEXT: 3: {{.*}} SECTION {{.*}} 2 .bar
+# GNU1-NEXT: 4: {{.*}} SECTION {{.*}} 66 <section 66>
+
+# WARN1: warning: '{{.*}}.tmp1': invalid section index: 67
+# WARN1: warning: '{{.*}}.tmp1': invalid section index: 66
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_386
+Sections:
+ - Name: .foo
+ Type: SHT_PROGBITS
+ - Name: .bar
+ Type: SHT_PROGBITS
+ - Name: .symtab_shndx
+ Type: SHT_SYMTAB_SHNDX
+ Link: .symtab
+ Entries: [ 0, 0, 0, 2, 0x42 ]
+Symbols:
+ - Name: ""
+ Section: .foo
+ Type: STT_SECTION
+ - Name: ""
+ Index: 0x43
+ Type: STT_SECTION
+ # Section symbol via SHT_SYMTAB_SHNDX.
+ - Name: ""
+ Index: SHN_XINDEX
+ Type: STT_SECTION
+ # Section symbol via SHT_SYMTAB_SHNDX with invalid index.
+ - Name: ""
+ Index: SHN_XINDEX
+ Type: STT_SECTION
+
+# RUN: yaml2obj %s --docnum=2 -o %t2
+# RUN: llvm-readobj %t2 --symbols 2> %t.llvm.err2 | FileCheck %s --check-prefix=LLVM2
+# RUN: FileCheck %s --input-file %t.llvm.err2 --check-prefix=WARN2 --implicit-check-not=warning
+# RUN: llvm-readelf %t2 --symbols 2> %t.gnu.err2 | FileCheck %s --check-prefix=GNU2
+# RUN: FileCheck %s --input-file %t.gnu.err2 --check-prefix=WARN2 --implicit-check-not=warning
+
+# LLVM2: Name: (0)
+# LLVM2: Name: <?> (0)
+
+# GNU2: Symbol table '.symtab' contains 2 entries:
+# GNU2-NEXT: Num: {{.*}} Type {{.*}} Ndx Name
+# GNU2-NEXT: 0: {{.*}} NOTYPE {{.*}} UND {{$}}
+# GNU2-NEXT: 1: {{.*}} SECTION {{.*}} RSV[0xffff] <?>
+
+# WARN2: warning: '{{.*}}.tmp2': extended symbol index (1) is past the end of the SHT_SYMTAB_SHNDX section of size 0
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_386
+Symbols:
+ # Section symbol via SHT_SYMTAB_SHNDX when SHT_SYMTAB_SHNDX is missing.
+ - Name: ""
+ Index: SHN_XINDEX
+ Type: STT_SECTION
diff --git a/llvm/test/tools/llvm-readobj/ELF/section-types.test b/llvm/test/tools/llvm-readobj/ELF/section-types.test
new file mode 100644
index 00000000000..8718f5894c6
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/section-types.test
@@ -0,0 +1,245 @@
+# Show that all regular section types are properly printed for both LLVM and
+# GNU styles.
+
+# RUN: yaml2obj %s -o %t-basic.o
+# RUN: llvm-readobj --section-headers %t-basic.o | FileCheck %s --check-prefix=LLVM
+# RUN: llvm-readelf --section-headers %t-basic.o | FileCheck %s --check-prefix=GNU
+
+# LLVM: Name: (0)
+# LLVM: Type: SHT_NULL
+# LLVM: Name: progbits
+# LLVM: Type: SHT_PROGBITS
+# LLVM: Name: rela
+# LLVM: Type: SHT_RELA
+# LLVM: Name: hash
+# LLVM: Type: SHT_HASH
+# LLVM: Name: dynamic
+# LLVM: Type: SHT_DYNAMIC
+# LLVM: Name: note
+# LLVM: Type: SHT_NOTE
+# LLVM: Name: nobits
+# LLVM: Type: SHT_NOBITS
+# LLVM: Name: rel
+# LLVM: Type: SHT_REL
+# LLVM: Name: shlib
+# LLVM: Type: SHT_SHLIB
+# LLVM: Name: dynsym
+# LLVM: Type: SHT_DYNSYM
+# LLVM: Name: init_array
+# LLVM: Type: SHT_INIT_ARRAY
+# LLVM: Name: fini_array
+# LLVM: Type: SHT_FINI_ARRAY
+# LLVM: Name: preinit_array
+# LLVM: Type: SHT_PREINIT_ARRAY
+# LLVM: Name: group
+# LLVM: Type: SHT_GROUP
+# LLVM: Name: symtab_shndx
+# LLVM: Type: SHT_SYMTAB_SHNDX
+# LLVM: Name: relr
+# LLVM: Type: SHT_RELR
+# LLVM: Name: android_rel
+# LLVM: Type: SHT_ANDROID_REL
+# LLVM: Name: android_rela
+# LLVM: Type: SHT_ANDROID_RELA
+# LLVM: Name: android_relr
+# LLVM: Type: SHT_ANDROID_RELR
+# LLVM: Name: llvm_odrtab
+# LLVM: Type: SHT_LLVM_ODRTAB
+# LLVM: Name: linker_options
+# LLVM: Type: SHT_LLVM_LINKER_OPTIONS
+# LLVM: Name: llvm_call_graph_profile
+# LLVM: Type: SHT_LLVM_CALL_GRAPH_PROFILE
+# LLVM: Name: llvm_addrsig
+# LLVM: Type: SHT_LLVM_ADDRSIG
+# LLVM: Name: .deplibs
+# LLVM: Type: SHT_LLVM_DEPENDENT_LIBRARIES
+# LLVM: Name: .llvm_sympart.f
+# LLVM: Type: SHT_LLVM_SYMPART
+# LLVM: Name: part1
+# LLVM: Type: SHT_LLVM_PART_EHDR
+# LLVM: Name: .phdrs
+# LLVM: Type: SHT_LLVM_PART_PHDR
+# LLVM: Name: gnu_attributes
+# LLVM: Type: SHT_GNU_ATTRIBUTES
+# LLVM: Name: gnu_hash
+# LLVM: Type: SHT_GNU_HASH
+# LLVM: Name: gnu_verdef
+# LLVM: Type: SHT_GNU_verdef
+# LLVM: Name: gnu_verneed
+# LLVM: Type: SHT_GNU_verneed
+# LLVM: Name: unknown
+# LLVM: Type: Unknown (0x1000)
+# LLVM: Name: loos
+# LLVM: Type: Unknown (0x60000000)
+# LLVM: Name: fooos
+# LLVM: Type: Unknown (0x60000F00)
+# LLVM: Name: hios
+# LLVM: Type: SHT_GNU_versym
+# LLVM: Name: loproc
+# LLVM: Type: Unknown (0x70000000)
+# LLVM: Name: fooproc
+# LLVM: Type: Unknown (0x70000F00)
+# LLVM: Name: hiproc
+# LLVM: Type: Unknown (0x7FFFFFFF)
+# LLVM: Name: louser
+# LLVM: Type: Unknown (0x80000000)
+# LLVM: Name: foouser
+# LLVM: Type: Unknown (0x80000F00)
+# LLVM: Name: hiuser
+# LLVM: Type: Unknown (0xFFFFFFFF)
+# LLVM: Name: .symtab
+# LLVM: Type: SHT_SYMTAB
+# LLVM: Name: .strtab
+# LLVM: Type: SHT_STRTAB
+
+# GNU: [ 0] NULL
+# GNU-NEXT: progbits PROGBITS
+# GNU-NEXT: rela RELA
+# GNU-NEXT: hash HASH
+# GNU-NEXT: dynamic DYNAMIC
+# GNU-NEXT: note NOTE
+# GNU-NEXT: nobits NOBITS
+# GNU-NEXT: rel REL
+# GNU-NEXT: shlib SHLIB
+# GNU-NEXT: dynsym DYNSYM
+# GNU-NEXT: init_array INIT_ARRAY
+# GNU-NEXT: fini_array FINI_ARRAY
+# GNU-NEXT: preinit_array PREINIT_ARRAY
+# GNU-NEXT: group GROUP
+# GNU-NEXT: symtab_shndx SYMTAB SECTION INDICES
+# GNU-NEXT: relr RELR
+# GNU-NEXT: android_rel ANDROID_REL
+# GNU-NEXT: android_rela ANDROID_RELA
+# GNU-NEXT: android_relr RELR
+# GNU-NEXT: llvm_odrtab LLVM_ODRTAB
+# GNU-NEXT: linker_options LLVM_LINKER_OPTIONS
+# GNU-NEXT: llvm_call_graph_profile LLVM_CALL_GRAPH_PROFILE
+# GNU-NEXT: llvm_addrsig LLVM_ADDRSIG
+# GNU-NEXT: .deplibs LLVM_DEPENDENT_LIBRARIES
+# GNU-NEXT: .llvm_sympart.f LLVM_SYMPART
+# GNU-NEXT: part1 LLVM_PART_EHDR
+# GNU-NEXT: .phdrs LLVM_PART_PHDR
+# GNU-NEXT: gnu_attributes ATTRIBUTES
+# GNU-NEXT: gnu_hash GNU_HASH
+# GNU-NEXT: gnu_verdef VERDEF
+# GNU-NEXT: gnu_verneed VERNEED
+# GNU-NEXT: unknown 0x1000: <unknown>
+# GNU-NEXT: loos LOOS+0x0
+# GNU-NEXT: fooos LOOS+0xF00
+# GNU-NEXT: hios VERSYM
+# GNU-NEXT: loproc LOPROC+0x0
+# GNU-NEXT: fooproc LOPROC+0xF00
+# GNU-NEXT: hiproc LOPROC+0xFFFFFFF
+# GNU-NEXT: louser LOUSER+0x0
+# GNU-NEXT: foouser LOUSER+0xF00
+# GNU-NEXT: hiuser LOUSER+0x7FFFFFFF
+# GNU-NEXT: .symtab SYMTAB
+# GNU-NEXT: .strtab STRTAB
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: progbits
+ Type: SHT_PROGBITS
+ - Name: rela
+ Type: SHT_RELA
+ Info: progbits
+ - Name: hash
+ Type: SHT_HASH
+ Content: ''
+ - Name: dynamic
+ Type: SHT_DYNAMIC
+ - Name: note
+ Type: SHT_NOTE
+ Notes: []
+ - Name: nobits
+ Type: SHT_NOBITS
+ - Name: rel
+ Type: SHT_REL
+ Info: progbits
+ - Name: shlib
+ Type: SHT_SHLIB
+ - Name: dynsym
+ Type: SHT_DYNSYM
+ Link: .strtab
+ - Name: init_array
+ Type: SHT_INIT_ARRAY
+ - Name: fini_array
+ Type: SHT_FINI_ARRAY
+ - Name: preinit_array
+ Type: SHT_PREINIT_ARRAY
+ - Name: group
+ Type: SHT_GROUP
+ Info: foo
+ Members:
+ - SectionOrType: 0
+ - Name: symtab_shndx
+ Type: SHT_SYMTAB_SHNDX
+ Link: .symtab
+ Entries: [ 0, 1 ]
+ - Name: relr
+ Type: SHT_RELR
+ - Name: android_rel
+ Type: SHT_ANDROID_REL
+ - Name: android_rela
+ Type: SHT_ANDROID_RELA
+ - Name: android_relr
+ Type: SHT_ANDROID_RELR
+ - Name: llvm_odrtab
+ Type: SHT_LLVM_ODRTAB
+ - Name: linker_options
+ Type: SHT_LLVM_LINKER_OPTIONS
+ - Name: llvm_call_graph_profile
+ Type: SHT_LLVM_CALL_GRAPH_PROFILE
+ - Name: llvm_addrsig
+ Type: SHT_LLVM_ADDRSIG
+ Symbols:
+ - Name: .deplibs
+ Type: SHT_LLVM_DEPENDENT_LIBRARIES
+ - Name: .llvm_sympart.f
+ Type: SHT_LLVM_SYMPART
+ - Name: part1
+ Type: SHT_LLVM_PART_EHDR
+ - Name: .phdrs
+ Type: SHT_LLVM_PART_PHDR
+ - Name: gnu_attributes
+ Type: SHT_GNU_ATTRIBUTES
+ - Name: gnu_hash
+ Type: SHT_GNU_HASH
+ Content: ""
+ - Name: gnu_verdef
+ Type: SHT_GNU_verdef
+ Info: 0
+ Entries:
+ - Name: gnu_verneed
+ Type: SHT_GNU_verneed
+ Info: 0
+ Dependencies:
+ - Name: unknown
+ Type: 0x1000
+ - Name: loos
+ Type: 0x60000000
+ - Name: fooos
+ Type: 0x60000F00
+ - Name: hios
+ Type: 0x6fffffff
+ Entries: []
+ - Name: loproc
+ Type: 0x70000000
+ - Name: fooproc
+ Type: 0x70000F00
+ - Name: hiproc
+ Type: 0x7fffffff
+ - Name: louser
+ Type: 0x80000000
+ - Name: foouser
+ Type: 0x80000F00
+ - Name: hiuser
+ Type: 0xffffffff
+Symbols:
+ - Name: foo
+ Binding: STB_GLOBAL
diff --git a/llvm/test/tools/llvm-readobj/ELF/stack-sizes.test b/llvm/test/tools/llvm-readobj/ELF/stack-sizes.test
new file mode 100644
index 00000000000..3d001b10495
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/stack-sizes.test
@@ -0,0 +1,666 @@
+## Check that we correctly display the contents of the .stack_sizes section
+## in a relocatable object file.
+
+# RUN: yaml2obj --docnum=1 %s > %t01
+# RUN: llvm-readelf --stack-sizes %t01 \
+# RUN: | FileCheck %s --check-prefix=RELOC-GNU --strict-whitespace --match-full-lines
+# RUN: llvm-readobj --stack-sizes %t01 | FileCheck %s --check-prefix=RELOC-LLVM
+
+# RELOC-GNU: Size Function
+# RELOC-GNU-NEXT: 16 referenced_by_symbol_foo
+# RELOC-GNU-NEXT: 32 referenced_via_section_bar
+# RELOC-GNU-NEXT: 8 separate_text_section_baz
+# RELOC-GNU-NOT:{{.}}
+
+# RELOC-LLVM: StackSizes [
+# RELOC-LLVM-NEXT: Entry {
+# RELOC-LLVM-NEXT: Function: referenced_by_symbol_foo
+# RELOC-LLVM-NEXT: Size: 0x10
+# RELOC-LLVM-NEXT: }
+# RELOC-LLVM-NEXT: Entry {
+# RELOC-LLVM-NEXT: Function: referenced_via_section_bar
+# RELOC-LLVM-NEXT: Size: 0x20
+# RELOC-LLVM-NEXT: }
+# RELOC-LLVM-NEXT: Entry {
+# RELOC-LLVM-NEXT: Function: separate_text_section_baz
+# RELOC-LLVM-NEXT: Size: 0x8
+# RELOC-LLVM-NEXT: }
+# RELOC-LLVM-NEXT: ]
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [SHF_ALLOC]
+ Size: 16
+ - Name: .text.baz
+ Type: SHT_PROGBITS
+ Flags: [SHF_ALLOC]
+ Size: 16
+ - Name: .stack_sizes
+ Type: SHT_PROGBITS
+ Entries:
+ - Size: 0x10
+ - Size: 0x20
+ Link: .text
+ - Name: '.stack_sizes [1]'
+ Type: SHT_PROGBITS
+ Entries:
+ - Address: 0x20
+ Size: 0x8
+ Link: .text.baz
+ - Name: .rela.stack_sizes
+ Type: SHT_RELA
+ Info: .stack_sizes
+ Relocations:
+## A symbol relative reference.
+ - Offset: 0
+ Symbol: referenced_by_symbol_foo
+ Type: R_X86_64_64
+## A section relative reference.
+ - Offset: 9
+ Addend: 16
+ Symbol: .text
+ Type: R_X86_64_64
+ - Name: '.rela.stack_sizes [1]'
+ Type: SHT_RELA
+ Info: '.stack_sizes [1]'
+ Relocations:
+ - Offset: 0
+ Symbol: separate_text_section_baz
+ Type: R_X86_64_64
+Symbols:
+ - Name: separate_text_section_baz
+ Section: .text.baz
+ Type: STT_FUNC
+ - Name: .text
+ Section: .text
+ Type: STT_SECTION
+ - Name: referenced_by_symbol_foo
+ Section: .text
+ Type: STT_FUNC
+ Binding: STB_GLOBAL
+ - Name: referenced_via_section_bar
+ Section: .text
+ Value: 0x10
+ Type: STT_FUNC
+ Binding: STB_GLOBAL
+
+## Check that we correctly report the stack sizes in an executable (non-relocatable)
+## object file.
+
+# RUN: yaml2obj --docnum=2 %s > %t02
+# RUN: llvm-readelf --stack-sizes %t02 \
+# RUN: | FileCheck %s --check-prefix=EXEC-GNU --strict-whitespace --match-full-lines
+# RUN: llvm-readobj --stack-sizes %t02 | FileCheck %s --check-prefix=EXEC-LLVM
+
+# EXEC-GNU: Size Function
+# EXEC-GNU-NEXT: 16 foo
+# EXEC-GNU-NEXT: 32 bar
+# EXEC-GNU-NOT:{{.}}
+
+# EXEC-LLVM: StackSizes [
+# EXEC-LLVM-NEXT: Entry {
+# EXEC-LLVM-NEXT: Function: foo
+# EXEC-LLVM-NEXT: Size: 0x10
+# EXEC-LLVM-NEXT: }
+# EXEC-LLVM-NEXT: Entry {
+# EXEC-LLVM-NEXT: Function: bar
+# EXEC-LLVM-NEXT: Size: 0x20
+# EXEC-LLVM-NEXT: }
+# EXEC-LLVM-NEXT: ]
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [SHF_ALLOC]
+ Size: 16
+ - Name: .stack_sizes
+ Type: SHT_PROGBITS
+ Entries:
+ - Address: 0x10
+ Size: 0x10
+ - Address: 0x20
+ Size: 0x20
+ Link: .text
+Symbols:
+ - Name: foo
+ Section: .text
+ Value: 0x10
+ Type: STT_FUNC
+ Binding: STB_GLOBAL
+ - Name: bar
+ Section: .text
+ Value: 0x20
+ Type: STT_FUNC
+ Binding: STB_GLOBAL
+
+## Check that we report an error when we find relocations whose offsets point outside
+## of the .stack_sizes section.
+
+# RUN: yaml2obj --docnum=3 %s > %t03
+# RUN: not llvm-readelf --stack-sizes %t03 2>&1 | FileCheck %s --check-prefix=SHORT -DFILE=%t03
+# RUN: not llvm-readobj --stack-sizes %t03 2>&1 | FileCheck %s --check-prefix=SHORT -DFILE=%t03
+
+# SHORT: error: '[[FILE]]': found invalid relocation offset into section .stack_sizes while trying to extract a stack size entry
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [SHF_ALLOC]
+ Size: 16
+ - Name: .stack_sizes
+ Type: SHT_PROGBITS
+ Content: "00"
+ Link: .text
+ - Name: .rela.stack_sizes
+ Type: SHT_RELA
+ Info: .stack_sizes
+ Relocations:
+ - Offset: 1
+ Symbol: foo
+ Type: R_X86_64_64
+Symbols:
+ - Name: foo
+ Section: .text
+ Type: STT_FUNC
+ Binding: STB_GLOBAL
+
+## Check that we warn about a function symbol that is not in the section
+## that is referenced by the stack sizes section's sh_link.
+
+# RUN: yaml2obj --docnum=4 %s > %t04
+# RUN: llvm-readelf --stack-sizes %t04 2> %t04-gnu.err | FileCheck %s --check-prefix=WRONGSECTION-GNU
+# RUN: FileCheck %s < %t04-gnu.err --check-prefix=WRONGSECTION-ERR -DFILE=%t04
+# RUN: llvm-readobj --stack-sizes %t04 2> %t04-llvm.err | FileCheck %s --check-prefix=WRONGSECTION-LLVM
+# RUN: FileCheck %s < %t04-llvm.err --check-prefix=WRONGSECTION-ERR -DFILE=%t04
+
+# RUN: llvm-readelf --stack-sizes --demangle %t04 2>&1 | FileCheck %s --check-prefix=WRONGSECTION-DEMANGLE-ERR -DFILE=%t04
+# RUN: llvm-readobj --stack-sizes --demangle %t04 2>&1 | FileCheck %s --check-prefix=WRONGSECTION-DEMANGLE-ERR -DFILE=%t04
+
+# WRONGSECTION-GNU: Size Function
+# WRONGSECTION-GNU-NEXT: 8 _Z3foof
+
+# WRONGSECTION-LLVM: StackSizes [
+# WRONGSECTION-LLVM-NEXT: Entry {
+# WRONGSECTION-LLVM-NEXT: Function: _Z3foof
+# WRONGSECTION-LLVM-NEXT: Size: 0x8
+# WRONGSECTION-LLVM-NEXT: }
+# WRONGSECTION-LLVM-NEXT: ]
+
+# WRONGSECTION-ERR: warning: '[[FILE]]': relocation symbol '_Z3foof' is not in the expected section
+# WRONGSECTION-DEMANGLE-ERR: warning: '[[FILE]]': relocation symbol 'foo(float)' is not in the expected section
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Size: 8
+ - Name: .text2
+ Type: SHT_PROGBITS
+ Size: 8
+ Flags: [SHF_ALLOC]
+ - Name: .stack_sizes
+ Type: SHT_PROGBITS
+ Entries:
+ - Size: 0x8
+ Link: .text2
+ - Name: .rela.stack_sizes
+ Type: SHT_RELA
+ Info: .stack_sizes
+ Relocations:
+ - Offset: 0
+ Symbol: _Z3foof
+ Type: R_X86_64_64
+Symbols:
+ - Name: _Z3foof
+ Section: .text
+ Type: STT_FUNC
+ Binding: STB_GLOBAL
+
+## Check that we report an error when a stack sizes section ends with an incomplete stack size entry.
+
+# RUN: yaml2obj --docnum=5 %s > %t05
+# RUN: not llvm-readelf --stack-sizes %t05 2>&1 | \
+# RUN: FileCheck %s --check-prefix=SUDDENEND -DFILE=%t05
+# RUN: not llvm-readobj --stack-sizes %t05 2>&1 | \
+# RUN: FileCheck %s --check-prefix=SUDDENEND -DFILE=%t05
+
+# SUDDENEND: error: '[[FILE]]': section .stack_sizes ended while trying to extract a stack size entry
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [SHF_ALLOC]
+ Size: 16
+ - Name: .stack_sizes
+ Type: SHT_PROGBITS
+ Content: "10000000"
+ Link: .text
+Symbols:
+ - Name: foo
+ Section: .text
+ Value: 0x10
+ Type: STT_FUNC
+ Binding: STB_GLOBAL
+
+## Check that we report an invalid stack size, which is represented by a ULEB that
+## ends in a byte with the high bit set.
+
+# RUN: yaml2obj --docnum=6 %s > %t06
+# RUN: not llvm-readelf --stack-sizes %t06 2>&1 | FileCheck %s --check-prefix=BADSIZE -DFILE=%t06
+# RUN: not llvm-readobj --stack-sizes %t06 2>&1 | FileCheck %s --check-prefix=BADSIZE -DFILE=%t06
+
+# BADSIZE: error: '[[FILE]]': could not extract a valid stack size in section .stack_sizes
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [SHF_ALLOC]
+ Size: 16
+ - Name: .stack_sizes
+ Type: SHT_PROGBITS
+ Content: "100000000000000080"
+ Link: .text
+Symbols:
+ - Name: foo
+ Section: .text
+ Value: 0x10
+ Type: STT_FUNC
+ Binding: STB_GLOBAL
+
+## Check that we report a warning when a relocation symbol does not belong to a
+## valid section. We expect a stack size entry with an unknown symbol in the
+## output.
+
+# RUN: yaml2obj --docnum=7 %s > %t07
+# RUN: llvm-readelf --stack-sizes %t07 2> %t07-gnu.err | FileCheck %s --check-prefix=BADSECTION-OUT-GNU
+# RUN: FileCheck %s < %t07-gnu.err --check-prefix=BADSECTION-ERR -DFILE=%t07
+# RUN: llvm-readobj --stack-sizes %t07 2> %t07-llvm.err | FileCheck %s --check-prefix=BADSECTION-OUT-LLVM
+# RUN: FileCheck %s < %t07-llvm.err --check-prefix=BADSECTION-ERR -DFILE=%t07
+
+# RUN: llvm-readelf --stack-sizes --demangle %t07 2>&1 | FileCheck %s --check-prefix=BADSECTION-DEMANGLE-ERR -DFILE=%t07
+# RUN: llvm-readobj --stack-sizes --demangle %t07 2>&1 | FileCheck %s --check-prefix=BADSECTION-DEMANGLE-ERR -DFILE=%t07
+
+# BADSECTION-OUT-GNU: Size Function
+# BADSECTION-OUT-GNU: 8 ?
+
+# BADSECTION-OUT-LLVM: StackSizes [
+# BADSECTION-OUT-LLVM-NEXT: Entry {
+# BADSECTION-OUT-LLVM-NEXT: Function: ?
+# BADSECTION-OUT-LLVM-NEXT: Size: 0x8
+# BADSECTION-OUT-LLVM-NEXT: }
+# BADSECTION-OUT-LLVM-NEXT: ]
+
+# BADSECTION-ERR: warning: '[[FILE]]': cannot identify the section for relocation symbol '_Z3foof'
+# BADSECTION-DEMANGLE-ERR: warning: '[[FILE]]': cannot identify the section for relocation symbol 'foo(float)'
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Size: 8
+ - Name: .stack_sizes
+ Type: SHT_PROGBITS
+ Link: .text
+ Entries:
+ - Size: 0x8
+ - Name: .rela.stack_sizes
+ Type: SHT_RELA
+ Info: .stack_sizes
+ Relocations:
+ - Offset: 0
+ Symbol: _Z3foof
+ Type: R_X86_64_64
+Symbols:
+ - Name: _Z3foof
+## An invalid section index.
+ Index: 10
+ Type: STT_FUNC
+ Binding: STB_GLOBAL
+
+## Check that we report a warning when a stack sizes section does not come with
+## a corresponding relocation section.
+
+# RUN: yaml2obj --docnum=8 %s > %t08
+# RUN: llvm-readelf --stack-sizes %t08 2> %t08-gnu.err | FileCheck %s --check-prefix=NORELOCSECTION-OUT-GNU
+# RUN: FileCheck %s < %t08-gnu.err --check-prefix=NORELOCSECTION-ERR -DFILE=%t08
+# RUN: llvm-readobj --stack-sizes %t08 2> %t08-llvm.err | FileCheck %s --check-prefix=NORELOCSECTION-OUT-LLVM
+# RUN: FileCheck %s < %t08-llvm.err --check-prefix=NORELOCSECTION-ERR -DFILE=%t08
+
+# NORELOCSECTION-OUT-GNU: Size Function
+# NORELOCSECTION-OUT-GNU-NOT: {{.}}
+
+# NORELOCSECTION-OUT-LLVM: StackSizes [
+# NORELOCSECTION-OUT-LLVM-NEXT: ]
+
+# NORELOCSECTION-ERR: warning: '[[FILE]]': section .stack_sizes does not have a corresponding relocation section
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Size: 8
+ - Name: .stack_sizes
+ Type: SHT_PROGBITS
+ Link: .text
+ Entries:
+ - Size: 0x1
+
+## Check that we handle multiple object files, separately and when they
+## are in an archive. This also checks whether we have blank lines between the
+## tables.
+
+# RUN: llvm-ar rc %t1.a %t01 %t02
+# RUN: llvm-readelf --stack-sizes %t01 %t02 \
+# RUN: | FileCheck %s --check-prefixes=MULTIPLE-GNU,OBJECT -DFILE1=%t01 -DFILE2=%t02
+# RUN: llvm-readelf --stack-sizes %t1.a \
+# RUN: | FileCheck %s --check-prefixes=MULTIPLE-GNU,ARCHIVE --strict-whitespace\
+# RUN: --match-full-lines -DFILE=%t1.a
+# RUN: llvm-readobj --stack-sizes %t01 %t02 \
+# RUN: | FileCheck %s --check-prefixes=MULTIPLE-LLVM,OBJECT -DFILE1=%t01 -DFILE2=%t02
+# RUN: llvm-readobj --stack-sizes %t1.a \
+# RUN: | FileCheck %s --check-prefixes=MULTIPLE-LLVM,ARCHIVE -DFILE=%t1.a
+
+# OBJECT:File: [[FILE1]]
+# ARCHIVE:File: [[FILE]]({{.*01}})
+
+# MULTIPLE-GNU:Stack Sizes:
+# MULTIPLE-GNU-NEXT: Size Function
+# MULTIPLE-GNU-NEXT: 16 referenced_by_symbol_foo
+# MULTIPLE-GNU-NEXT: 32 referenced_via_section_bar
+# MULTIPLE-GNU-NEXT: 8 separate_text_section_baz
+# MULTIPLE-GNU-EMPTY:
+
+# MULTIPLE-LLVM: StackSizes [
+# MULTIPLE-LLVM-NEXT: Entry {
+# MULTIPLE-LLVM-NEXT: Function: referenced_by_symbol_foo
+# MULTIPLE-LLVM-NEXT: Size: 0x10
+# MULTIPLE-LLVM-NEXT: }
+# MULTIPLE-LLVM-NEXT: Entry {
+# MULTIPLE-LLVM-NEXT: Function: referenced_via_section_bar
+# MULTIPLE-LLVM-NEXT: Size: 0x20
+# MULTIPLE-LLVM-NEXT: }
+# MULTIPLE-LLVM-NEXT: Entry {
+# MULTIPLE-LLVM-NEXT: Function: separate_text_section_baz
+# MULTIPLE-LLVM-NEXT: Size: 0x8
+# MULTIPLE-LLVM-NEXT: }
+# MULTIPLE-LLVM-NEXT: ]
+
+# OBJECT:File: [[FILE2]]
+# ARCHIVE:File: [[FILE]]({{.*02}})
+
+# MULTIPLE-GNU-EMPTY:
+# MULTIPLE-GNU-NEXT:Stack Sizes:
+# MULTIPLE-GNU-NEXT: Size Function
+# MULTIPLE-GNU-NEXT: 16 foo
+# MULTIPLE-GNU-NEXT: 32 bar
+
+# MULTIPLE-LLVM: StackSizes [
+# MULTIPLE-LLVM-NEXT: Entry {
+# MULTIPLE-LLVM-NEXT: Function: foo
+# MULTIPLE-LLVM-NEXT: Size: 0x10
+# MULTIPLE-LLVM-NEXT: }
+# MULTIPLE-LLVM-NEXT: Entry {
+# MULTIPLE-LLVM-NEXT: Function: bar
+# MULTIPLE-LLVM-NEXT: Size: 0x20
+# MULTIPLE-LLVM-NEXT: }
+# MULTIPLE-LLVM-NEXT: ]
+
+## Check that we do not consider symbols that are not function symbols, even though
+## a relocation references them.
+
+# RUN: yaml2obj --docnum=9 %s > %t14
+# RUN: llvm-readelf --stack-sizes %t14 2> %t14-gnu.err | FileCheck %s --check-prefix=NONFUNCTIONSYM-GNU
+# RUN: FileCheck %s < %t14-gnu.err --check-prefix=NONFUNCTIONSYM-ERR -DFILE=%t14
+# RUN: llvm-readobj --stack-sizes %t14 2> %t14-llvm.err | FileCheck %s --check-prefix=NONFUNCTIONSYM-LLVM
+# RUN: FileCheck %s < %t14-llvm.err --check-prefix=NONFUNCTIONSYM-ERR -DFILE=%t14
+
+# NONFUNCTIONSYM-GNU: Stack Sizes:
+# NONFUNCTIONSYM-GNU: 0 ?
+
+# NONFUNCTIONSYM-LLVM: StackSizes [
+# NONFUNCTIONSYM-LLVM-NEXT: Entry {
+# NONFUNCTIONSYM-LLVM-NEXT: Function: ?
+# NONFUNCTIONSYM-LLVM-NEXT: Size: 0x0
+# NONFUNCTIONSYM-LLVM-NEXT: }
+# NONFUNCTIONSYM-LLVM-NEXT: ]
+
+# NONFUNCTIONSYM-ERR: warning: '[[FILE]]': could not identify function symbol for stack size entry
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Size: 16
+ - Name: .stack_sizes
+ Type: SHT_PROGBITS
+ Entries:
+ - Size: 0
+ Link: .text
+ - Name: .rela.stack_sizes
+ Type: SHT_RELA
+ Info: .stack_sizes
+ Relocations:
+ - Offset: 0
+ Symbol: foo
+ Type: R_X86_64_64
+Symbols:
+ - Name: foo
+ Section: .text
+ Type: STT_OBJECT
+ Binding: STB_GLOBAL
+
+## Check that we report an error when we find an unsupported relocation
+## in the section that contains the stack size entries' relocations.
+
+# RUN: yaml2obj --docnum=10 %s > %t15
+# RUN: not llvm-readelf --stack-sizes %t15 2>&1 | FileCheck %s --check-prefix=UNSUPPRELOC -DFILE=%t15
+# RUN: not llvm-readobj --stack-sizes %t15 2>&1 | FileCheck %s --check-prefix=UNSUPPRELOC -DFILE=%t15
+
+# UNSUPPRELOC: error: '[[FILE]]': unsupported relocation type in section .rela.stack_sizes: R_X86_64_RELATIVE
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Size: 8
+ - Name: .stack_sizes
+ Type: SHT_PROGBITS
+ Link: .text
+ Entries: []
+ - Name: .rela.stack_sizes
+ Type: SHT_RELA
+ Info: .stack_sizes
+ Relocations:
+ - Offset: 0
+ Symbol: foo
+ Type: R_X86_64_RELATIVE
+Symbols:
+ - Name: foo
+ Section: .text
+ Type: STT_FUNC
+ Binding: STB_GLOBAL
+
+## Check that warning messages in archives do not impact other members. In the following
+## test, the first archive member generates a warning and we make sure all the information
+## is still dumped.
+
+# RUN: llvm-ar rc %t2.a %t04 %t01
+# RUN: llvm-readelf --stack-sizes %t2.a 2>&1 | FileCheck %s --check-prefix=ARCHIVEWARN-GNU \
+# RUN: -DFILE=%t2.a --strict-whitespace --match-full-lines
+# RUN: llvm-readobj --stack-sizes %t2.a 2>&1 | FileCheck %s --check-prefix=ARCHIVEWARN-LLVM -DFILE=%t2.a
+
+# ARCHIVEWARN-GNU:File: [[FILE]]({{.*04}})
+# ARCHIVEWARN-GNU:Stack Sizes:
+# ARCHIVEWARN-GNU-NEXT: Size Function
+# ARCHIVEWARN-GNU:{{.*}}: warning: '{{.*04}}': relocation symbol '_Z3foof' is not in the expected section
+# ARCHIVEWARN-GNU: 8 _Z3foof
+# ARCHIVEWARN-GNU:File: [[FILE]]({{.*01}})
+# ARCHIVEWARN-GNU:Stack Sizes:
+# ARCHIVEWARN-GNU-NEXT: Size Function
+# ARCHIVEWARN-GNU-NEXT: 16 referenced_by_symbol_foo
+# ARCHIVEWARN-GNU-NEXT: 32 referenced_via_section_bar
+# ARCHIVEWARN-GNU-NEXT: 8 separate_text_section_baz
+# ARCHIVEWARN-GNU-NOT:{{.}}
+
+
+# ARCHIVEWARN-LLVM: File: [[FILE]]({{.*04}})
+# ARCHIVEWARN-LLVM: StackSizes [
+# ARCHIVEWARN-LLVM: warning: '{{.*04}}': relocation symbol '_Z3foof' is not in the expected section
+# ARCHIVEWARN-LLVM-NEXT: Entry {
+# ARCHIVEWARN-LLVM-NEXT: Function: _Z3foof
+# ARCHIVEWARN-LLVM-NEXT: Size: 0x8
+# ARCHIVEWARN-LLVM-NEXT: }
+# ARCHIVEWARN-LLVM-NEXT: ]
+# ARCHIVEWARN-LLVM: File: [[FILE]]({{.*01}})
+# ARCHIVEWARN-LLVM: StackSizes [
+# ARCHIVEWARN-LLVM-NEXT: Entry {
+# ARCHIVEWARN-LLVM-NEXT: Function: referenced_by_symbol_foo
+# ARCHIVEWARN-LLVM-NEXT: Size: 0x10
+# ARCHIVEWARN-LLVM-NEXT: }
+# ARCHIVEWARN-LLVM-NEXT: Entry {
+# ARCHIVEWARN-LLVM-NEXT: Function: referenced_via_section_bar
+# ARCHIVEWARN-LLVM-NEXT: Size: 0x20
+# ARCHIVEWARN-LLVM-NEXT: }
+# ARCHIVEWARN-LLVM-NEXT: Entry {
+# ARCHIVEWARN-LLVM-NEXT: Function: separate_text_section_baz
+# ARCHIVEWARN-LLVM-NEXT: Size: 0x8
+# ARCHIVEWARN-LLVM-NEXT: }
+# ARCHIVEWARN-LLVM-NEXT: ]
+
+## Check that we demangle function names when requested.
+
+# RUN: yaml2obj --docnum=11 %s > %t16
+# RUN: llvm-readelf --stack-sizes --demangle %t16 | FileCheck %s --check-prefix=DEMANGLE-GNU
+# RUN: llvm-readobj --stack-sizes --demangle %t16 | FileCheck %s --check-prefix=DEMANGLE-LLVM
+
+# DEMANGLE-GNU: 16 foo(float)
+# DEMANGLE-LLVM: Function: foo(float)
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [SHF_ALLOC]
+ Size: 16
+ - Name: .stack_sizes
+ Type: SHT_PROGBITS
+ Entries:
+ - Address: 0x10
+ Size: 0x10
+ Link: .text
+Symbols:
+ - Name: _Z3foof
+ Section: .text
+ Value: 0x10
+ Type: STT_FUNC
+ Binding: STB_GLOBAL
+
+## Check that we report an error when we are unable to resolve a relocation for a given ELF architecture.
+## Here we have a 64-bit relocation used in a 32-bit object.
+
+# RUN: yaml2obj --docnum=12 %s > %t17
+# RUN: not llvm-readelf --stack-sizes %t17 2>&1 | FileCheck %s -DFILE=%t17 --check-prefix=UNSUPPRELOC2
+# RUN: not llvm-readobj --stack-sizes %t17 2>&1 | FileCheck %s -DFILE=%t17 --check-prefix=UNSUPPRELOC2
+
+# UNSUPPRELOC2: error: '[[FILE]]': unsupported relocation type in section .rela.stack_sizes: R_X86_64_64
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2MSB
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .stack_sizes
+ Type: SHT_PROGBITS
+ Content: "00"
+ - Name: .rela.stack_sizes
+ Type: SHT_RELA
+ Info: .stack_sizes
+ Relocations:
+ - Offset: 0
+ Type: R_X86_64_64
+
+## Check we report an error when dumping stack sizes if the relocated section
+## identified by the sh_info field is invalid. Here the sh_info value is larger than
+## the number of sections.
+
+# RUN: yaml2obj --docnum=13 %s > %t18
+# RUN: not llvm-readelf --stack-sizes %t18 2>&1 | FileCheck %s -DFILE=%t18 --check-prefix=INVALID-TARGET
+# RUN: not llvm-readobj --stack-sizes %t18 2>&1 | FileCheck %s -DFILE=%t18 --check-prefix=INVALID-TARGET
+
+# INVALID-TARGET: error: '[[FILE]]': .rela.stack_sizes: failed to get a relocated section: invalid section index: 255
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2MSB
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .rela.stack_sizes
+ Type: SHT_RELA
+ Link: 0
+ Info: 0xFF
+ Relocations: []
diff --git a/llvm/test/tools/llvm-readobj/ELF/string-dump-multi.s b/llvm/test/tools/llvm-readobj/ELF/string-dump-multi.s
new file mode 100644
index 00000000000..29d7ef01100
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/string-dump-multi.s
@@ -0,0 +1,21 @@
+# REQUIRES: x86-registered-target
+
+# RUN: llvm-mc -filetype=obj -triple x86_64 %s -o %t.o
+# RUN: llvm-readobj -p .a -p .b %t.o | FileCheck %s
+# RUN: llvm-readelf -p .a -p .b %t.o | FileCheck %s
+
+# CHECK: String dump of section '.a':
+# CHECK-NEXT: [ 0] 0
+# CHECK-EMPTY:
+# CHECK-NEXT: String dump of section '.b':
+# CHECK-NEXT: [ 0] 1
+# CHECK-EMPTY:
+# CHECK-NEXT: String dump of section '.a':
+# CHECK-NEXT: [ 0] 2
+
+.section .a,"a",@progbits,unique,0
+.asciz "0"
+.section .b,"a",@progbits
+.asciz "1"
+.section .a,"a",@progbits,unique,1
+.asciz "2"
diff --git a/llvm/test/tools/llvm-readobj/ELF/string-dump.test b/llvm/test/tools/llvm-readobj/ELF/string-dump.test
new file mode 100644
index 00000000000..cfd9a03ed6c
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/string-dump.test
@@ -0,0 +1,75 @@
+# Check the dumping of a section as strings.
+# RUN: yaml2obj %s > %t
+
+# RUN: llvm-readobj --string-dump=.strings \
+# RUN: --string-dump=.not_null_terminated %t > %t.readobj.out
+# RUN: FileCheck %s --input-file=%t.readobj.out
+
+# Also test the different ways --string-dump can be specified, i.e. as a short
+# flag (-p), with different prefix modes (-p .foo, -p=.foo, -p.foo), and with
+# the value being a index section number instead of a section name.
+# RUN: llvm-readobj -p=.strings -p=.not_null_terminated %t > %t.readobj.1
+# RUN: llvm-readobj -p.strings -p.strings -p.not_null_terminated %t > %t.readobj.2
+# RUN: llvm-readobj --string-dump=1 --string-dump=2 %t > %t.readobj.3
+# RUN: llvm-readobj -p1 -p1 -p2 %t > %t.readobj.4
+# RUN: llvm-readobj -p=1 -p=2 %t > %t.readobj.5
+
+# RUN: cmp %t.readobj.out %t.readobj.1
+# RUN: cmp %t.readobj.out %t.readobj.2
+# RUN: cmp %t.readobj.out %t.readobj.3
+# RUN: cmp %t.readobj.out %t.readobj.4
+# RUN: cmp %t.readobj.out %t.readobj.5
+
+# Run readelf flag tests with an additional flag, --file-header, so we can test
+# -p grouped with something.
+# RUN: llvm-readelf --file-header --string-dump=.strings \
+# RUN: --string-dump=.not_null_terminated %t > %t.readelf.out
+# RUN: FileCheck %s --input-file=%t.readelf.out
+
+# RUN: llvm-readelf -h -p=.strings -p=.not_null_terminated %t > %t.readelf.1
+# RUN: llvm-readelf -p.strings -hp.not_null_terminated %t > %t.readelf.2
+# RUN: llvm-readelf -h --string-dump=1 --string-dump=2 %t > %t.readelf.3
+# RUN: llvm-readelf -hp1 -p2 %t > %t.readelf.4
+# RUN: llvm-readelf -hp 1 -p.not_null_terminated %t > %t.readelf.5
+# RUN: llvm-readelf -p=1 -hp=2 %t > %t.readelf.6
+
+# RUN: cmp %t.readelf.out %t.readelf.1
+# RUN: cmp %t.readelf.out %t.readelf.2
+# RUN: cmp %t.readelf.out %t.readelf.3
+# RUN: cmp %t.readelf.out %t.readelf.4
+# RUN: cmp %t.readelf.out %t.readelf.5
+# RUN: cmp %t.readelf.out %t.readelf.6
+
+# CHECK: String dump of section '.strings':
+# CHECK-NEXT: [ 0] here
+# CHECK-NEXT: [ 5] are
+# CHECK-NEXT: [ 9] some
+# CHECK-NEXT: [ e] strings
+# CHECK-EMPTY:
+# CHECK-NEXT: String dump of section '.not_null_terminated':
+# CHECK-NEXT: [ 0] no
+# CHECK-NEXT: [ 3] null{{$}}
+# CHECK-NOT: {{.}}
+
+# RUN: llvm-readobj --string-dump=does_not_exist %t 2>&1 | FileCheck -DFILE=%t %s --check-prefix=WARN1
+# RUN: llvm-readobj --string-dump=42 %t 2>&1 | FileCheck %s -DFILE=%t --check-prefix=WARN2
+
+# RUN: llvm-readelf --string-dump=does_not_exist %t 2>&1 | FileCheck -DFILE=%t %s --check-prefix=WARN1
+# RUN: llvm-readelf --string-dump=42 %t 2>&1 | FileCheck %s -DFILE=%t --check-prefix=WARN2
+
+# WARN1: warning: '[[FILE]]': could not find section 'does_not_exist'
+# WARN2: warning: '[[FILE]]': could not find section 42
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .strings
+ Type: SHT_PROGBITS
+ Content: 686572650061726500736f6d6500737472696e677300
+ - Name: .not_null_terminated
+ Type: SHT_PROGBITS
+ Content: 6e6f006e756c6c
diff --git a/llvm/test/tools/llvm-readobj/ELF/symbol-64bit.test b/llvm/test/tools/llvm-readobj/ELF/symbol-64bit.test
new file mode 100644
index 00000000000..dbd8f0e54b6
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/symbol-64bit.test
@@ -0,0 +1,23 @@
+# Show that both GNU and LLVM styles can properly print symbol values and sizes
+# that do not fit in 32-bit integers.
+
+# RUN: yaml2obj %s > %t
+# RUN: llvm-readobj --symbols %t | FileCheck %s --check-prefix=LLVM
+# RUN: llvm-readelf --symbols %t | FileCheck %s --check-prefix=GNU
+
+# LLVM: Name: a_sym
+# LLVM-NEXT: Value: 0xFEDCBA9876543210
+# LLVM-NEXT: Size: 81985529216486895
+
+# GNU: 1: fedcba9876543210 81985529216486895 {{.*}} a_sym
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+Symbols:
+ - Name: a_sym
+ Value: 0xfedcba9876543210
+ Size: 0x0123456789abcdef
diff --git a/llvm/test/tools/llvm-readobj/ELF/symbol-binding.test b/llvm/test/tools/llvm-readobj/ELF/symbol-binding.test
new file mode 100644
index 00000000000..9ca5142abae
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/symbol-binding.test
@@ -0,0 +1,59 @@
+# Show that llvm-readobj can print symbol bindings correctly for both LLVM and
+# GNU styles, including for symbol bindings that are not recognised.
+
+# RUN: yaml2obj %s > %t
+# RUN: llvm-readobj --symbols --dyn-symbols %t | FileCheck %s --check-prefix=LLVM
+# RUN: llvm-readelf --symbols --dyn-symbols %t | FileCheck %s --check-prefix=GNU
+
+# LLVM: Name: local
+# LLVM: Binding: Local
+# LLVM: Name: global
+# LLVM: Binding: Global
+# LLVM: Name: weak
+# LLVM: Binding: Weak
+# LLVM: Name: unknown
+# LLVM: Binding: 0x3
+# LLVM: Name: unique
+# LLVM: Binding: Unique (0xA)
+# LLVM: Name: os
+# LLVM: Binding: 0xB
+# LLVM: Name: proc
+# LLVM: Binding: 0xF
+
+# GNU: 3 {{.*}} unknown
+# GNU-NEXT: UNIQUE {{.*}} unique
+# GNU-NEXT: b {{.*}} os
+# GNU-NEXT: f {{.*}} proc
+# GNU: LOCAL {{.*}} local
+# GNU-NEXT: GLOBAL {{.*}} global
+# GNU-NEXT: WEAK {{.*}} weak
+
+# yaml2obj doesn't have a way of specifying static symbols with custom bindings,
+# so use a custom dynamic symbol table section instead.
+--- !ELF
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_386
+Sections:
+ - Name: .dynstr
+ Type: SHT_STRTAB
+ #\0unknown\0unique\0os\0proc\0
+ Content: "00756e6b6e6f776e00756e69717565006f730070726f6300"
+ - Name: .dynsym
+ Type: SHT_DYNSYM
+ Link: .dynstr
+ EntSize: 16
+ # Null symbol
+ # Symbol with st_name = 1, binding = 0x3
+ # Symbol with st_name = 9, binding = 0xa
+ # Symbol with st_name = 16, binding = 0xb
+ # Symbol with st_name = 19, binding = 0xf
+ Content: "0000000000000000000000000000000001000000000000000000000030000000090000000000000000000000a0000000100000000000000000000000b0000000130000000000000000000000f0000000"
+Symbols:
+ - Name: local
+ - Name: global
+ Binding: STB_GLOBAL
+ - Name: weak
+ Binding: STB_WEAK
diff --git a/llvm/test/tools/llvm-readobj/ELF/symbol-shndx.test b/llvm/test/tools/llvm-readobj/ELF/symbol-shndx.test
new file mode 100644
index 00000000000..ab01da9c842
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/symbol-shndx.test
@@ -0,0 +1,187 @@
+## Show that llvm-readobj prints symbol shndxes correctly, for valid indexes,
+## invalid indexes (i.e. section indexes that don't correspond to a real
+## section), reserved values and processor/os-specific index values, for both GNU
+## and LLVM styles.
+
+# RUN: yaml2obj --docnum=1 %s > %t1
+# RUN: llvm-readobj --symbols %t1 | FileCheck %s --check-prefix=LLVM1
+# RUN: llvm-readelf --symbols %t1 | FileCheck %s --check-prefix=GNU1
+
+# LLVM1: Name: undef
+# LLVM1: Section:
+# LLVM1-SAME: Undefined (0x0)
+# LLVM1: Name: normal
+# LLVM1: Section:
+# LLVM1-SAME: .text (0x1)
+# LLVM1: Name: common
+# LLVM1: Section:
+# LLVM1-SAME: Common (0xFFF2)
+# LLVM1: Name: absolute
+# LLVM1: Section:
+# LLVM1-SAME: Absolute (0xFFF1)
+# LLVM1: Name: proc
+# LLVM1: Section:
+# LLVM1-SAME: Processor Specific (0xFF01)
+# LLVM1: Name: os
+# LLVM1: Section:
+# LLVM1-SAME: Operating System Specific (0xFF21)
+# LLVM1: Name: reserved
+# LLVM1: Section:
+# LLVM1-SAME: Reserved (0xFFFE)
+# LLVM1: Name: xindex
+# LLVM1: Section:
+# LLVM1: .text (0x1)
+
+# GNU1: Symbol table '.symtab' contains 9 entries:
+# GNU1-NEXT: Num: {{.*}} Ndx Name
+# GNU1-NEXT: 0: {{.*}} UND
+# GNU1-NEXT: 1: {{.*}} UND undef
+# GNU1-NEXT: 2: {{.*}} 1 normal
+# GNU1-NEXT: 3: {{.*}} COM common
+# GNU1-NEXT: 4: {{.*}} ABS absolute
+# GNU1-NEXT: 5: {{.*}} PRC[0xff01] proc
+# GNU1-NEXT: 6: {{.*}} OS[0xff21] os
+# GNU1-NEXT: 7: {{.*}} RSV[0xfffe] reserved
+# GNU1-NEXT: 8: {{.*}} 1 xindex
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_386
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ - Name: .symtab_shndx
+ Type: SHT_SYMTAB_SHNDX
+ Link: .symtab
+ Entries: [ 0, 0, 0, 0, 0, 0, 0, 0, 1 ]
+Symbols:
+ - Name: undef
+ Binding: STB_GLOBAL
+ - Name: normal
+ Section: .text
+ Binding: STB_GLOBAL
+ - Name: common
+ Index: SHN_COMMON
+ Binding: STB_GLOBAL
+ - Name: absolute
+ Index: SHN_ABS
+ Binding: STB_GLOBAL
+ - Name: proc
+ Index: 0xff01
+ Binding: STB_GLOBAL
+ - Name: os
+ Index: 0xff21
+ Binding: STB_GLOBAL
+ - Name: reserved
+ Index: 0xfffe
+ Binding: STB_GLOBAL
+ - Name: xindex
+ Index: SHN_XINDEX
+ Binding: STB_GLOBAL
+
+## In this case, the index does not correspond to a real section. Check that GNU
+## style just prints the section index as normal and LLVM style prints a warning
+## (but only once for each warning).
+# RUN: yaml2obj --docnum=2 %s > %t2
+# RUN: llvm-readobj --symbols %t2 2> %t2.llvm.err | FileCheck %s --check-prefix=LLVM2
+# RUN: FileCheck %s --input-file=%t2.llvm.err --check-prefix=BAD-SHNDX --implicit-check-not=warning
+# RUN: llvm-readelf --symbols %t2 2> %t2.gnu.err | FileCheck %s --check-prefix=GNU2
+# RUN: FileCheck %s --input-file=%t2.gnu.err --allow-empty --implicit-check-not={{.}}
+
+# LLVM2: Name: bad
+# LLVM2: Section:
+# LLVM2-SAME: <?> (0x42)
+# LLVM2: Name: bad2
+# LLVM2: Section:
+# LLVM2-SAME: <?> (0x42)
+# LLVM2: Name: bad3
+# LLVM2: Section:
+# LLVM2-SAME: <?> (0x43)
+# LLVM2: Name: invalid_shndx
+# LLVM2: Section:
+# LLVM2-SAME: <?> (0x9)
+# LLVM2: Name: invalid_shndx2
+# LLVM2: Section:
+# LLVM2-SAME: <?> (0x9)
+# LLVM2: Name: invalid_shndx3
+# LLVM2: Section:
+# LLVM2-SAME: <?> (0xA)
+
+# GNU2: Symbol table '.symtab' contains 7 entries:
+# GNU2-NEXT: Num: {{.*}} Ndx Name
+# GNU2-NEXT: 0: {{.*}} UND
+# GNU2-NEXT: 1: {{.*}} 66 bad
+# GNU2-NEXT: 2: {{.*}} 66 bad2
+# GNU2-NEXT: 3: {{.*}} 67 bad3
+# GNU2-NEXT: 4: {{.*}} 9 invalid_shndx
+# GNU2-NEXT: 5: {{.*}} 9 invalid_shndx2
+# GNU2-NEXT: 6: {{.*}} 10 invalid_shndx3
+
+# BAD-SHNDX: warning: '{{.*}}tmp2': invalid section index: 66
+# BAD-SHNDX: warning: '{{.*}}tmp2': invalid section index: 67
+# BAD-SHNDX: warning: '{{.*}}tmp2': invalid section index: 9
+# BAD-SHNDX: warning: '{{.*}}tmp2': invalid section index: 10
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_386
+Sections:
+ - Name: .symtab_shndx
+ Type: SHT_SYMTAB_SHNDX
+ Link: .symtab
+ Entries: [ 0, 0, 0, 0, 9, 9, 10 ]
+Symbols:
+ - Name: bad
+ Index: 0x42
+ - Name: bad2
+ Index: 0x42
+ - Name: bad3
+ Index: 0x43
+ - Name: invalid_shndx
+ Index: SHN_XINDEX
+ - Name: invalid_shndx2
+ Index: SHN_XINDEX
+ - Name: invalid_shndx3
+ Index: SHN_XINDEX
+
+## In this case, the symtab shndx section is missing, so symbols with section
+## indexes of SHN_XINDEX print as Reserved symbols.
+# RUN: yaml2obj --docnum=3 %s > %t3
+# RUN: llvm-readobj --symbols %t3 2> %t3.llvm.err | FileCheck %s --check-prefix=LLVM3
+# RUN: FileCheck %s --input-file=%t3.llvm.err --check-prefix=NO-SYMTAB-SHNDX --implicit-check-not=warning
+# RUN: llvm-readelf --symbols %t3 2> %t3.gnu.err | FileCheck %s --check-prefix=GNU3
+# RUN: FileCheck %s --input-file=%t3.gnu.err --check-prefix=NO-SYMTAB-SHNDX --implicit-check-not=warning
+
+# LLVM3: Name: no_shndx
+# LLVM3: Section:
+# LLVM3-SAME: Reserved (0xFFFF)
+# LLVM3: Name: no_shndx2
+# LLVM3: Section:
+# LLVM3-SAME: Reserved (0xFFFF)
+
+# GNU3: Symbol table '.symtab' contains 3 entries:
+# GNU3-NEXT: Num: {{.*}} Ndx Name
+# GNU3-NEXT: 0: {{.*}} UND
+# GNU3-NEXT: 1: {{.*}} RSV[0xffff] no_shndx
+# GNU3-NEXT: 2: {{.*}} RSV[0xffff] no_shndx2
+
+# NO-SYMTAB-SHNDX: warning: '{{.*}}tmp3': extended symbol index (1) is past the end of the SHT_SYMTAB_SHNDX section of size 0
+# NO-SYMTAB-SHNDX: warning: '{{.*}}tmp3': extended symbol index (2) is past the end of the SHT_SYMTAB_SHNDX section of size 0
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_386
+Symbols:
+ - Name: no_shndx
+ Index: SHN_XINDEX
+ - Name: no_shndx2
+ Index: SHN_XINDEX
diff --git a/llvm/test/tools/llvm-readobj/ELF/symbol-types.test b/llvm/test/tools/llvm-readobj/ELF/symbol-types.test
new file mode 100644
index 00000000000..3d0ba4a4808
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/symbol-types.test
@@ -0,0 +1,120 @@
+# Show that llvm-readobj can print the type of symbol for all known symbol types
+# and also for unknown types, both in the os/processor specific ranges and not,
+# for both GNU and LLVM styles.
+
+# RUN: yaml2obj %s > %t
+# RUN: llvm-readobj --symbols %t | FileCheck %s --check-prefix=LLVM
+# RUN: llvm-readelf --symbols %t | FileCheck %s --check-prefix=GNU
+
+# LLVM: Name: notype
+# LLVM: Type: None
+# LLVM: Name: object
+# LLVM: Type: Object
+# LLVM: Name: func
+# LLVM: Type: Function
+# LLVM: Name: .text
+# LLVM: Type: Section
+# LLVM: Name: file
+# LLVM: Type: File
+# LLVM: Name: common
+# LLVM: Type: Common
+# LLVM: Name: tls
+# LLVM: Type: TLS
+# LLVM: Name: gnu_ifunc
+# LLVM: Type: GNU_IFunc
+
+# LLVM: Name: os_specific_11
+# LLVM: Type: OS Specific (0xB)
+# LLVM: Name: os_specific_12
+# LLVM: Type: OS Specific (0xC)
+
+# LLVM: Name: proc_specific_13
+# LLVM: Type: Proc Specific (0xD)
+# LLVM: Name: proc_specific_14
+# LLVM: Type: Proc Specific (0xE)
+# LLVM: Name: proc_specific_15
+# LLVM: Type: Proc Specific (0xF)
+
+# LLVM: Name: unknown_7
+# LLVM: Type: Unknown (0x7)
+# LLVM: Name: unknown_8
+# LLVM: Type: Unknown (0x8)
+# LLVM: Name: unknown_9
+# LLVM: Type: Unknown (0x9)
+
+# GNU: NOTYPE {{.*}} notype
+# GNU: OBJECT {{.*}} object
+# GNU: FUNC {{.*}} func
+# GNU: SECTION {{.*}} .text
+# GNU: FILE {{.*}} file
+# GNU: COMMON {{.*}} common
+# GNU: TLS {{.*}} tls
+# GNU: IFUNC {{.*}} gnu_ifunc
+# GNU: <OS specific>: 11 {{.*}} os_specific_11
+# GNU: <OS specific>: 12 {{.*}} os_specific_12
+# GNU: <processor specific>: 13 {{.*}} proc_specific_13
+# GNU: <processor specific>: 14 {{.*}} proc_specific_14
+# GNU: <processor specific>: 15 {{.*}} proc_specific_15
+# GNU: <unknown>: 7 {{.*}} unknown_7
+# GNU: <unknown>: 8 {{.*}} unknown_8
+# GNU: <unknown>: 9 {{.*}} unknown_9
+
+!ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+Symbols:
+ - Name: notype
+ Type: STT_NOTYPE
+ Binding: STB_GLOBAL
+ - Name: object
+ Type: STT_OBJECT
+ Binding: STB_GLOBAL
+ - Name: func
+ Type: STT_FUNC
+ Binding: STB_GLOBAL
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ Binding: STB_GLOBAL
+ - Name: file
+ Type: STT_FILE
+ Binding: STB_GLOBAL
+ - Name: common
+ Type: STT_COMMON
+ Binding: STB_GLOBAL
+ - Name: tls
+ Type: STT_TLS
+ Binding: STB_GLOBAL
+ - Name: gnu_ifunc
+ Type: STT_GNU_IFUNC
+ Binding: STB_GLOBAL
+ - Name: os_specific_11
+ Type: 11
+ Binding: STB_GLOBAL
+ - Name: os_specific_12
+ Type: 12
+ Binding: STB_GLOBAL
+ - Name: proc_specific_13
+ Type: 13
+ Binding: STB_GLOBAL
+ - Name: proc_specific_14
+ Type: 14
+ Binding: STB_GLOBAL
+ - Name: proc_specific_15
+ Type: 15
+ Binding: STB_GLOBAL
+ - Name: unknown_7
+ Type: 7
+ Binding: STB_GLOBAL
+ - Name: unknown_8
+ Type: 8
+ Binding: STB_GLOBAL
+ - Name: unknown_9
+ Type: 9
+ Binding: STB_GLOBAL
diff --git a/llvm/test/tools/llvm-readobj/ELF/symbol-visibility.test b/llvm/test/tools/llvm-readobj/ELF/symbol-visibility.test
new file mode 100644
index 00000000000..bdc66d77472
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/symbol-visibility.test
@@ -0,0 +1,87 @@
+## Show that llvm-readobj prints the symbol visibility where recognised, or
+## something sensible when not, for both GNU and LLVM output.
+
+## Check how we dump symbols when they have only STV_* bits set for st_other.
+## (This is the most common case).
+
+# RUN: yaml2obj --docnum=1 %s > %t1.o
+# RUN: llvm-readobj --symbols %t1.o | FileCheck %s --check-prefix=LLVM
+# RUN: llvm-readelf --symbols %t1.o | FileCheck %s --strict-whitespace --check-prefix=GNU
+
+# LLVM: Name: default
+# LLVM: Other: 0
+# LLVM: Name: internal
+# LLVM: Other [ (0x1)
+# LLVM-NEXT: STV_INTERNAL (0x1)
+# LLVM-NEXT: ]
+# LLVM: Name: hidden
+# LLVM: Other [ (0x2)
+# LLVM-NEXT: STV_HIDDEN (0x2)
+# LLVM-NEXT: ]
+# LLVM: Name: protected
+# LLVM: Other [ (0x3)
+# LLVM-NEXT: STV_PROTECTED (0x3)
+# LLVM-NEXT: ]
+
+# GNU: Vis Ndx Name
+# GNU-NEXT: DEFAULT UND
+# GNU-NEXT: DEFAULT UND default
+# GNU-NEXT: INTERNAL UND internal
+# GNU-NEXT: HIDDEN UND hidden
+# GNU-NEXT: PROTECTED UND protected
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_386
+Symbols:
+ - Name: default
+ Other: [ STV_DEFAULT ]
+ Binding: STB_GLOBAL
+ - Name: internal
+ Other: [ STV_INTERNAL ]
+ Binding: STB_GLOBAL
+ - Name: hidden
+ Other: [ STV_HIDDEN ]
+ Binding: STB_GLOBAL
+ - Name: protected
+ Other: [ STV_PROTECTED ]
+ Binding: STB_GLOBAL
+
+## Check the output when we have non-visibility bits set for at least one of the symbols.
+
+# RUN: yaml2obj --docnum=2 %s > %t2.o
+# RUN: llvm-readobj --symbols %t2.o | FileCheck %s --check-prefixes=LLVM,LLVM-OTHER
+# RUN: llvm-readelf --symbols %t2.o | FileCheck %s --strict-whitespace --check-prefix=GNU-OTHER
+
+# LLVM-OTHER: Name: other
+# LLVM-OTHER: Other [ (0x4)
+# LLVM-OTHER-NEXT: ]
+
+# GNU-OTHER: Vis Ndx Name
+# GNU-OTHER-NEXT: DEFAULT UND
+# GNU-OTHER-NEXT: DEFAULT UND default
+# GNU-OTHER-NEXT: INTERNAL UND internal
+# GNU-OTHER-NEXT: HIDDEN UND hidden
+# GNU-OTHER-NEXT: PROTECTED UND protected
+# GNU-OTHER-NEXT: DEFAULT [<other: 0x4>] UND other
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_386
+Symbols:
+ - Name: default
+ Other: [ STV_DEFAULT ]
+ - Name: internal
+ Other: [ STV_INTERNAL ]
+ - Name: hidden
+ Other: [ STV_HIDDEN ]
+ - Name: protected
+ Other: [ STV_PROTECTED ]
+ - Name: other
+ Other: [ 4 ]
diff --git a/llvm/test/tools/llvm-readobj/ELF/thin-archive-paths.test b/llvm/test/tools/llvm-readobj/ELF/thin-archive-paths.test
new file mode 100644
index 00000000000..2e2ec56b99d
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/thin-archive-paths.test
@@ -0,0 +1,33 @@
+# RUN: rm -rf %t
+# RUN: mkdir -p %t/a/b
+# RUN: cd %t
+# RUN: cp %p/Inputs/trivial.obj.elf-x86-64 a/b/1.o
+# The archive is deliberately in a different directory to the cwd, to show that
+# the member paths printed are exactly what's in the archive and not relative
+# to the cwd.
+# RUN: llvm-ar rcT a/relative.a a/b/1.o
+
+# Show that relative paths in the file header printing look sensible.
+# RUN: llvm-readobj --file-headers a/relative.a | FileCheck %s -DARFILE="a/relative.a" --check-prefix=REL
+# REL: File: [[ARFILE]](b/1.o)
+
+# Show that relative paths in an error message for both archive and member look
+# sensible.
+# RUN: rm a/b/1.o
+# RUN: not llvm-readobj --file-headers a/relative.a 2>&1 | FileCheck %s --check-prefix=ERR1
+# RUN: not llvm-readelf --file-headers a/relative.a 2>&1 | FileCheck %s --check-prefix=ERR1
+# ERR1: error: 'a/relative.a': 'b/1.o': {{[Nn]}}o such file or directory
+
+# RUN: mkdir -p %t/c
+# RUN: cp %p/Inputs/trivial.obj.elf-x86-64 a/b/1.o
+# RUN: llvm-ar rcT c/absolute.a %t/a/b/1.o
+
+# Show that absolute paths in the file header printing are correct.
+# RUN: llvm-readobj --file-headers c/absolute.a | FileCheck %s --check-prefix=ABS -DARFILE="c/absolute.a" -DDIR=%/t
+# ABS: File: [[ARFILE]]([[DIR]]/a/b/1.o)
+
+# Show that absolute paths in an error message for both archive and member are correct.
+# RUN: rm a/b/1.o
+# RUN: not llvm-readobj --file-headers %/t/c/absolute.a 2>&1 | FileCheck %s --check-prefix=ERR2 -DDIR=%/t
+# RUN: not llvm-readelf --file-headers %/t/c/absolute.a 2>&1 | FileCheck %s --check-prefix=ERR2 -DDIR=%/t
+# ERR2: error: '[[DIR]]/c/absolute.a': '[[DIR]]/a/b/1.o': {{[Nn]}}o such file or directory
diff --git a/llvm/test/tools/llvm-readobj/ELF/types.test b/llvm/test/tools/llvm-readobj/ELF/types.test
new file mode 100644
index 00000000000..aecbdeacde9
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/types.test
@@ -0,0 +1,116 @@
+# Show that llvm-readobj can handle all standard ELF types.
+# RUN: yaml2obj %s --docnum=1 -o %t.none
+# RUN: llvm-readobj --file-headers %t.none | FileCheck %s --check-prefix=LLVM-NONE
+# RUN: llvm-readelf --file-headers %t.none | FileCheck %s --check-prefix=GNU-NONE
+
+# LLVM-NONE: Type: None (0x0)
+# GNU-NONE: Type: NONE (none)
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_NONE
+ Machine: EM_X86_64
+
+# RUN: yaml2obj %s --docnum=2 -o %t.rel
+# RUN: llvm-readobj --file-headers %t.rel | FileCheck %s --check-prefix=LLVM-REL
+# RUN: llvm-readelf --file-headers %t.rel | FileCheck %s --check-prefix=GNU-REL
+
+# LLVM-REL: Type: Relocatable (0x1)
+# GNU-REL: Type: REL (Relocatable file)
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+
+
+# RUN: yaml2obj %s --docnum=3 -o %t.exec
+# RUN: llvm-readobj --file-headers %t.exec | FileCheck %s --check-prefix=LLVM-EXEC
+# RUN: llvm-readelf --file-headers %t.exec | FileCheck %s --check-prefix=GNU-EXEC
+
+# LLVM-EXEC: Type: Executable (0x2)
+# GNU-EXEC: Type: EXEC (Executable file)
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+
+# RUN: yaml2obj %s --docnum=4 -o %t.so
+# RUN: llvm-readobj --file-headers %t.so | FileCheck %s --check-prefix=LLVM-SO
+# RUN: llvm-readelf --file-headers %t.so | FileCheck %s --check-prefix=GNU-SO
+
+# LLVM-SO: Type: SharedObject (0x3)
+# GNU-SO: Type: DYN (Shared object file)
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_DYN
+ Machine: EM_X86_64
+
+# RUN: yaml2obj %s --docnum=5 -o %t.core
+# RUN: llvm-readobj --file-headers %t.core | FileCheck %s --check-prefix=LLVM-CORE
+# RUN: llvm-readelf --file-headers %t.core | FileCheck %s --check-prefix=GNU-CORE
+
+# LLVM-CORE: Type: Core (0x4)
+# GNU-CORE: Type: CORE (Core file)
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_CORE
+ Machine: EM_X86_64
+
+# Show that llvm-readobj can handle an unknown ELF type.
+# RUN: yaml2obj %s --docnum=6 -o %t.unknown
+# RUN: llvm-readobj --file-headers %t.unknown | FileCheck %s --check-prefix=LLVM-UNKNOWN
+# RUN: llvm-readelf --file-headers %t.unknown | FileCheck %s --check-prefix=GNU-UNKNOWN
+
+# LLVM-UNKNOWN: Type: 0x42
+# GNU-UNKNOWN: Type: 42
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: 0x42
+ Machine: EM_X86_64
+
+# Show that llvm-readobj can handle an unknown OS-specific ELF type.
+# RUN: yaml2obj %s --docnum=7 -o %t.os
+# RUN: llvm-readobj --file-headers %t.os | FileCheck %s --check-prefix=LLVM-OS
+# RUN: llvm-readelf --file-headers %t.os | FileCheck %s --check-prefix=GNU-OS
+
+# LLVM-OS: Type: 0xFE00
+# GNU-OS: Type: fe00
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: 0xfe00
+ Machine: EM_X86_64
+
+# Show that llvm-readobj can handle an unknown machine-specific ELF type.
+# RUN: yaml2obj %s --docnum=8 -o %t.proc
+# RUN: llvm-readobj --file-headers %t.proc | FileCheck %s --check-prefix=LLVM-PROC
+# RUN: llvm-readelf --file-headers %t.proc | FileCheck %s --check-prefix=GNU-PROC
+
+# LLVM-PROC: Type: 0xFF00
+# GNU-PROC: Type: ff00
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: 0xff00
+ Machine: EM_X86_64
diff --git a/llvm/test/tools/llvm-readobj/ELF/unwind.test b/llvm/test/tools/llvm-readobj/ELF/unwind.test
new file mode 100644
index 00000000000..a9e34f7a294
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/unwind.test
@@ -0,0 +1,217 @@
+# RUN: yaml2obj %s > %t.exe
+# RUN: llvm-readobj --unwind %t.exe | FileCheck %s
+
+# CHECK: EHFrameHeader {
+# CHECK-NEXT: Address: 0x4013c0
+# CHECK-NEXT: Offset: 0xbc
+# CHECK-NEXT: Size: 0x3c
+# CHECK-NEXT: Corresponding Section: .eh_frame_hdr
+# CHECK-NEXT: Header {
+# CHECK-NEXT: version: 1
+# CHECK-NEXT: eh_frame_ptr_enc: 0x1b
+# CHECK-NEXT: fde_count_enc: 0x3
+# CHECK-NEXT: table_enc: 0x3b
+# CHECK-NEXT: eh_frame_ptr: 0x401400
+# CHECK-NEXT: fde_count: 6
+# CHECK-NEXT: entry 0 {
+# CHECK-NEXT: initial_location: 0x4004a0
+# CHECK-NEXT: address: 0x401448
+# CHECK-NEXT: }
+# CHECK-NEXT: entry 1 {
+# CHECK-NEXT: initial_location: 0x4004d0
+# CHECK-NEXT: address: 0x401418
+# CHECK-NEXT: }
+# CHECK-NEXT: entry 2 {
+# CHECK-NEXT: initial_location: 0x4005b6
+# CHECK-NEXT: address: 0x401470
+# CHECK-NEXT: }
+# CHECK-NEXT: entry 3 {
+# CHECK-NEXT: initial_location: 0x4005d0
+# CHECK-NEXT: address: 0x401490
+# CHECK-NEXT: }
+# CHECK-NEXT: entry 4 {
+# CHECK-NEXT: initial_location: 0x401250
+# CHECK-NEXT: address: 0x4014c0
+# CHECK-NEXT: }
+# CHECK-NEXT: entry 5 {
+# CHECK-NEXT: initial_location: 0x4012c0
+# CHECK-NEXT: address: 0x4014f0
+# CHECK-NEXT: }
+# CHECK-NEXT: }
+# CHECK-NEXT:}
+
+# CHECK: .eh_frame section at offset 0xf8 address 0x401400:
+# CHECK-NEXT: [0x401400] CIE length=20
+# CHECK-NEXT: version: 1
+# CHECK-NEXT: augmentation: zR
+# CHECK-NEXT: code_alignment_factor: 1
+# CHECK-NEXT: data_alignment_factor: -8
+# CHECK-NEXT: return_address_register: 16
+
+# CHECK: Program:
+# CHECK-NEXT: DW_CFA_def_cfa: reg7 +8
+# CHECK-NEXT: DW_CFA_offset: reg16 -8
+# CHECK-NEXT: DW_CFA_undefined: reg16
+
+# CHECK: [0x401418] FDE length=20 cie=[0x401400]
+# CHECK-NEXT: initial_location: 0x4004d0
+# CHECK-NEXT: address_range: 0x2a (end : 0x4004fa)
+
+# CHECK: Program:
+# CHECK-NEXT: DW_CFA_nop:
+# CHECK-NEXT: DW_CFA_nop:
+# CHECK-NEXT: DW_CFA_nop:
+# CHECK-NEXT: DW_CFA_nop:
+# CHECK-NEXT: DW_CFA_nop:
+# CHECK-NEXT: DW_CFA_nop:
+# CHECK-NEXT: DW_CFA_nop:
+
+# CHECK: [0x401430] CIE length=20
+# CHECK-NEXT: version: 1
+# CHECK-NEXT: augmentation: zR
+# CHECK-NEXT: code_alignment_factor: 1
+# CHECK-NEXT: data_alignment_factor: -8
+# CHECK-NEXT: return_address_register: 16
+
+# CHECK: Program:
+# CHECK-NEXT: DW_CFA_def_cfa: reg7 +8
+# CHECK-NEXT: DW_CFA_offset: reg16 -8
+# CHECK-NEXT: DW_CFA_nop:
+# CHECK-NEXT: DW_CFA_nop:
+
+# CHECK: [0x401448] FDE length=36 cie=[0x401430]
+# CHECK-NEXT: initial_location: 0x4004a0
+# CHECK-NEXT: address_range: 0x20 (end : 0x4004c0)
+
+# CHECK: Program:
+# CHECK-NEXT: DW_CFA_def_cfa_offset: +16
+# CHECK-NEXT: DW_CFA_advance_loc: 6
+# CHECK-NEXT: DW_CFA_def_cfa_offset: +24
+# CHECK-NEXT: DW_CFA_advance_loc: 10
+# CHECK-NEXT: DW_CFA_def_cfa_expression: DW_OP_breg7 +8, DW_OP_breg16 +0, DW_OP_lit15, DW_OP_and, DW_OP_lit11, DW_OP_ge, DW_OP_lit3, DW_OP_shl, DW_OP_plus
+# CHECK-NEXT: DW_CFA_nop:
+# CHECK-NEXT: DW_CFA_nop:
+# CHECK-NEXT: DW_CFA_nop:
+# CHECK-NEXT: DW_CFA_nop:
+
+# CHECK: [0x401470] FDE length=28 cie=[0x401430]
+# CHECK-NEXT: initial_location: 0x4005b6
+# CHECK-NEXT: address_range: 0x10 (end : 0x4005c6)
+
+# CHECK: Program:
+# CHECK-NEXT: DW_CFA_advance_loc: 1
+# CHECK-NEXT: DW_CFA_def_cfa_offset: +16
+# CHECK-NEXT: DW_CFA_offset: reg6 -16
+# CHECK-NEXT: DW_CFA_advance_loc: 3
+# CHECK-NEXT: DW_CFA_def_cfa_register: reg6
+# CHECK-NEXT: DW_CFA_advance_loc: 11
+# CHECK-NEXT: DW_CFA_def_cfa: reg7 +8
+# CHECK-NEXT: DW_CFA_nop:
+# CHECK-NEXT: DW_CFA_nop:
+# CHECK-NEXT: DW_CFA_nop:
+
+# CHECK: [0x401490] FDE length=44 cie=[0x401430]
+# CHECK-NEXT: initial_location: 0x4005d0
+# CHECK-NEXT: address_range: 0xc7f (end : 0x40124f)
+
+# CHECK: Program:
+# CHECK-NEXT: DW_CFA_advance_loc: 5
+# CHECK-NEXT: DW_CFA_def_cfa: reg10 +0
+# CHECK-NEXT: DW_CFA_advance_loc: 9
+# CHECK-NEXT: DW_CFA_expression: reg6 DW_OP_breg6 +0
+# CHECK-NEXT: DW_CFA_advance_loc: 5
+# CHECK-NEXT: DW_CFA_def_cfa_expression: DW_OP_breg6 -8, DW_OP_deref
+# CHECK-NEXT: DW_CFA_advance_loc2: 3174
+# CHECK-NEXT: DW_CFA_def_cfa: reg10 +0
+# CHECK-NEXT: DW_CFA_advance_loc: 5
+# CHECK-NEXT: DW_CFA_def_cfa: reg7 +8
+# CHECK-NEXT: DW_CFA_nop:
+# CHECK-NEXT: DW_CFA_nop:
+# CHECK-NEXT: DW_CFA_nop:
+# CHECK-NEXT: DW_CFA_nop:
+
+# CHECK: [0x4014c0] FDE length=44 cie=[0x401430]
+# CHECK-NEXT: initial_location: 0x401250
+# CHECK-NEXT: address_range: 0x66 (end : 0x4012b6)
+
+# CHECK: Program:
+# CHECK-NEXT: DW_CFA_advance_loc: 1
+# CHECK-NEXT: DW_CFA_def_cfa_offset: +16
+# CHECK-NEXT: DW_CFA_offset: reg6 -16
+# CHECK-NEXT: DW_CFA_advance_loc: 3
+# CHECK-NEXT: DW_CFA_def_cfa_register: reg6
+# CHECK-NEXT: DW_CFA_advance_loc: 2
+# CHECK-NEXT: DW_CFA_offset: reg15 -24
+# CHECK-NEXT: DW_CFA_advance_loc: 5
+# CHECK-NEXT: DW_CFA_offset: reg14 -32
+# CHECK-NEXT: DW_CFA_advance_loc: 7
+# CHECK-NEXT: DW_CFA_offset: reg13 -40
+# CHECK-NEXT: DW_CFA_offset: reg12 -48
+# CHECK-NEXT: DW_CFA_advance_loc: 8
+# CHECK-NEXT: DW_CFA_offset: reg3 -56
+# CHECK-NEXT: DW_CFA_advance_loc1: 75
+# CHECK-NEXT: DW_CFA_def_cfa: reg7 +8
+# CHECK-NEXT: DW_CFA_nop:
+# CHECK-NEXT: DW_CFA_nop:
+# CHECK-NEXT: DW_CFA_nop:
+# CHECK-NEXT: DW_CFA_nop:
+
+# CHECK: [0x4014f0] FDE length=20 cie=[0x401430]
+# CHECK-NEXT: initial_location: 0x4012c0
+# CHECK-NEXT: address_range: 0x1 (end : 0x4012c1)
+
+# CHECK: Program:
+# CHECK-NEXT: DW_CFA_nop:
+# CHECK-NEXT: DW_CFA_nop:
+# CHECK-NEXT: DW_CFA_nop:
+# CHECK-NEXT: DW_CFA_nop:
+# CHECK-NEXT: DW_CFA_nop:
+# CHECK-NEXT: DW_CFA_nop:
+# CHECK-NEXT: DW_CFA_nop:
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+ Entry: 0x0000000000400000
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ Address: 0x0000000000400000
+ AddressAlign: 16
+ Content: 50C704240020400031C05AC3
+ - Name: .eh_frame_hdr
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC ]
+ Address: 0x00000000004013c0
+ AddressAlign: 4
+ Content: 011B033B3C00000006000000E0F0FFFF8800000010F1FFFF58000000F6F1FFFFB000000010F2FFFFD000000090FEFFFF0001000000FFFFFF30010000
+ - Name: .eh_frame
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC ]
+ Address: 0x0000000000401400
+ AddressAlign: 8
+ Content: 1400000000000000017A5200017810011B0C070890010710140000001C000000B0F0FFFF2A00000000000000000000001400000000000000017A5200017810011B0C070890010000240000001C00000050F0FFFF20000000000E10460E184A0F0B770880003F1A3B2A332422000000001C000000440000003EF1FFFF1000000000410E108602430D064B0C07080000002C0000006400000038F1FFFF7F0C000000450C0A00491006027600450F0376780603660C0C0A00450C070800000000002C0000009400000088FDFFFF6600000000410E108602430D06428F03458E04478D058C06488307024B0C07080000000014000000C4000000C8FDFFFF01000000000000000000000000000000
+Symbols:
+ - Name: myfunc
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000400000
+ Binding: STB_GLOBAL
+ProgramHeaders:
+ - Type: PT_LOAD
+ Flags: [ PF_X, PF_R ]
+ VAddr: 0x00400000
+ PAddr: 0x00400000
+ Sections:
+ - Section: .text
+ - Type: PT_GNU_EH_FRAME
+ Flags: [ PF_X, PF_R ]
+ VAddr: 0x004013C0
+ PAddr: 0x004013C0
+ Sections:
+ - Section: .eh_frame_hdr
+...
diff --git a/llvm/test/tools/llvm-readobj/ELF/verdef-invalid.test b/llvm/test/tools/llvm-readobj/ELF/verdef-invalid.test
new file mode 100644
index 00000000000..f80e9383f70
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/verdef-invalid.test
@@ -0,0 +1,310 @@
+## Test how llvm-readobj/llvm-readelf tools handle invalid SHT_GNU_verdef sections.
+
+## Check that we report a warning when sh_link references a non-existent section.
+
+# RUN: yaml2obj %s --docnum=1 -o %t1
+# RUN: llvm-readobj -V %t1 2>&1 | FileCheck %s --check-prefix=INVALID-LINK-LLVM --implicit-check-not="warning:" -DFILE=%t1
+# RUN: llvm-readelf -V %t1 2>&1 | FileCheck %s --check-prefix=INVALID-LINK-GNU --implicit-check-not="warning:" -DFILE=%t1
+
+# INVALID-LINK-LLVM: warning: '[[FILE]]': invalid section linked to SHT_GNU_verdef section with index 1: invalid section index: 255
+
+# INVALID-LINK-GNU: Version definition section '.gnu.version_d' contains 0 entries:
+# INVALID-LINK-GNU: warning: '[[FILE]]': invalid section linked to SHT_GNU_verdef section with index 1: invalid section index: 255
+# INVALID-LINK-GNU-NEXT: Addr: 0000000000000000 Offset: 0x000040 Link: 255 (<corrupt>)
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_DYN
+ Machine: EM_X86_64
+Sections:
+ - Name: .gnu.version_d
+ Type: SHT_GNU_verdef
+ Link: 0xFF
+ Info: 0x0
+ Entries: []
+
+## Check that we report a warning when the sh_link field of a SHT_GNU_verdef section references a non-string table section.
+
+# RUN: yaml2obj %s --docnum=2 -o %t2
+# RUN: llvm-readobj -V %t2 2>&1 | FileCheck %s --check-prefix=INVALID-STRING-TABLE -DFILE=%t2
+# RUN: llvm-readelf -V %t2 2>&1 | FileCheck %s --check-prefix=INVALID-STRING-TABLE -DFILE=%t2
+
+# INVALID-STRING-TABLE: warning: '[[FILE]]': invalid string table linked to SHT_GNU_verdef section with index 1: invalid sh_type for string table section [index 0]: expected SHT_STRTAB, but got SHT_NULL
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_DYN
+ Machine: EM_X86_64
+Sections:
+ - Name: .gnu.version_d
+ Type: SHT_GNU_verdef
+ Link: 0x0
+ Info: 0x0
+ Entries: []
+
+## Check that we report a warning when we can't read the content of the SHT_GNU_verdef section.
+
+# RUN: yaml2obj %s --docnum=3 -o %t3
+# RUN: llvm-readobj -V %t3 2>&1 | FileCheck %s --check-prefix=INVALID-DATA -DFILE=%t3
+# RUN: llvm-readelf -V %t3 2>&1 | FileCheck %s --check-prefix=INVALID-DATA -DFILE=%t3
+
+# INVALID-DATA: warning: '[[FILE]]': cannot read content of SHT_GNU_verdef section with index 1: section [index 1] has a sh_offset (0xffffffff) + sh_size (0x0) that is greater than the file size (0x230)
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_DYN
+ Machine: EM_X86_64
+Sections:
+ - Name: .gnu.version_d
+ Type: SHT_GNU_verdef
+ Link: .dynstr
+ Info: 0x0
+ Entries: []
+ ShOffset: 0xFFFFFFFF
+DynamicSymbols:
+ - Name: foo
+
+## Check that we report a warning when a SHT_GNU_verdef section contains a version definition
+## that goes past the end of the section.
+
+# RUN: yaml2obj %s --docnum=4 -o %t4
+# RUN: llvm-readobj -V %t4 2>&1 | FileCheck %s --check-prefix=DEF-PAST-END -DFILE=%t4
+# RUN: llvm-readelf -V %t4 2>&1 | FileCheck %s --check-prefix=DEF-PAST-END -DFILE=%t4
+
+# DEF-PAST-END: warning: '[[FILE]]': invalid SHT_GNU_verdef section with index 1: version definition 1 goes past the end of the section
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_DYN
+ Machine: EM_X86_64
+Sections:
+ - Name: .gnu.version_d
+ Type: SHT_GNU_verdef
+ Link: .dynstr
+ Info: 0x1
+ Entries:
+ - Version: 1
+ Flags: 0
+ VersionNdx: 0
+ Hash: 0
+ Names:
+ - FOO
+ ShSize: 1
+DynamicSymbols:
+ - Name: foo
+
+## Check that we report a warning when a SHT_GNU_verdef section contains a version definition
+## that refers to an auxiliary entry that goes past the end of the section.
+
+# RUN: yaml2obj %s --docnum=5 -o %t5
+# RUN: llvm-readobj -V %t5 2>&1 | FileCheck %s --check-prefix=AUX-PAST-END -DFILE=%t5
+# RUN: llvm-readelf -V %t5 2>&1 | FileCheck %s --check-prefix=AUX-PAST-END -DFILE=%t5
+
+# AUX-PAST-END: warning: '[[FILE]]': invalid SHT_GNU_verdef section with index 1: version definition 1 refers to an auxiliary entry that goes past the end of the section
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_DYN
+ Machine: EM_X86_64
+Sections:
+ - Name: .gnu.version_d
+ Type: SHT_GNU_verdef
+ Link: .dynstr
+ Info: 0x1
+ Entries:
+ - Version: 1
+ Flags: 0
+ VersionNdx: 0
+ Hash: 0
+ Names:
+ - FOO
+ ShSize: 21
+DynamicSymbols:
+ - Name: foo
+
+## Check that we can dump a SHT_GNU_verdef section properly even if it contains version names strings
+## that overrun the linked string table.
+
+# RUN: yaml2obj %s --docnum=6 -o %t6
+# RUN: llvm-readobj -V %t6 2>&1 | FileCheck %s --check-prefix=PAST-STRTAB-END-LLVM --implicit-check-not="warning:" -DFILE=%t6
+# RUN: llvm-readelf -V %t6 2>&1 | FileCheck %s --check-prefix=PAST-STRTAB-END-GNU --implicit-check-not="warning:" -DFILE=%t6
+
+# PAST-STRTAB-END-LLVM: VersionDefinitions [
+# PAST-STRTAB-END-LLVM-NEXT: Definition {
+# PAST-STRTAB-END-LLVM-NEXT: Version: 1
+# PAST-STRTAB-END-LLVM-NEXT: Flags [ (0x0)
+# PAST-STRTAB-END-LLVM-NEXT: ]
+# PAST-STRTAB-END-LLVM-NEXT: Index: 0
+# PAST-STRTAB-END-LLVM-NEXT: Hash: 0
+# PAST-STRTAB-END-LLVM-NEXT: Name: <invalid vda_name: 5>
+# PAST-STRTAB-END-LLVM-NEXT: Predecessors: []
+# PAST-STRTAB-END-LLVM-NEXT: }
+# PAST-STRTAB-END-LLVM-NEXT: ]
+
+# PAST-STRTAB-END-GNU: Version definition section '.gnu.version_d' contains 1 entries:
+# PAST-STRTAB-END-GNU-NEXT: Addr: 0000000000000000 Offset: 0x000040 Link: 2 (.strtab)
+# PAST-STRTAB-END-GNU-NEXT: 0x0000: Rev: 1 Flags: none Index: 0 Cnt: 1 Name: <invalid vda_name: 5>
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_DYN
+ Machine: EM_X86_64
+Sections:
+ - Name: .gnu.version_d
+ Type: SHT_GNU_verdef
+ Link: .strtab
+ Info: 0x1
+ Entries:
+ - Version: 1
+ Flags: 0
+ VersionNdx: 0
+ Hash: 0
+ Names:
+ - FOO
+ - Name: .strtab
+ Type: SHT_STRTAB
+DynamicSymbols:
+ - Name: BAR
+
+## Check we report a warning when a version definition is not correctly aligned in memory.
+
+# RUN: yaml2obj %s --docnum=7 -o %t7
+# RUN: llvm-readobj -V %t7 2>&1 | FileCheck %s --check-prefix=MISALIGNED-DEF -DFILE=%t7
+# RUN: llvm-readelf -V %t7 2>&1 | FileCheck %s --check-prefix=MISALIGNED-DEF -DFILE=%t7
+
+# MISALIGNED-DEF: warning: '[[FILE]]': invalid SHT_GNU_verdef section with index 1: found a misaligned version definition entry at offset 0x0
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_DYN
+ Machine: EM_X86_64
+Sections:
+ - Type: Fill
+ Size: 0x1
+ - Name: .gnu.version_d
+ Type: SHT_GNU_verdef
+ Link: .dynstr
+ Info: 0x1
+ Entries:
+ - Version: 1
+ Flags: 0
+ VersionNdx: 0
+ Hash: 0
+ Names:
+ - FOO
+DynamicSymbols:
+ - Name: foo
+
+## Check we report a warning when an auxiliary entry is not correctly aligned in memory.
+
+# RUN: yaml2obj %s --docnum=8 -o %t8
+# RUN: llvm-readobj -V %t8 2>&1 | FileCheck %s --check-prefix=MISALIGNED-AUX -DFILE=%t8
+# RUN: llvm-readelf -V %t8 2>&1 | FileCheck %s --check-prefix=MISALIGNED-AUX -DFILE=%t8
+
+# MISALIGNED-AUX: warning: '[[FILE]]': invalid SHT_GNU_verdef section with index 1: found a misaligned auxiliary entry at offset 0x13
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_DYN
+ Machine: EM_X86_64
+Sections:
+ - Name: .gnu.version_d
+ Type: SHT_GNU_verdef
+ Flags: [ SHF_ALLOC ]
+ Link: .dynstr
+ Info: 0x1
+## The byte offset to the auxiliary entry is 0x13, i.e. it is not correctly aligned in memory.
+ Content: "0100000000000100000000001300000000000000"
+DynamicSymbols:
+ - Name: foo
+ Binding: STB_GLOBAL
+
+## Check how we handle a version definition entry with an unsupported version.
+
+# RUN: yaml2obj %s --docnum=9 -o %t9
+# RUN: llvm-readobj -V %t9 2>&1 | FileCheck %s --check-prefix=UNSUPPORTED-VERSION -DFILE=%t9
+# RUN: llvm-readelf -V %t9 2>&1 | FileCheck %s --check-prefix=UNSUPPORTED-VERSION -DFILE=%t9
+
+# UNSUPPORTED-VERSION: warning: '[[FILE]]': unable to dump SHT_GNU_verdef section with index 1: version 65278 is not yet supported
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_DYN
+ Machine: EM_X86_64
+Sections:
+ - Name: .gnu.version_d
+ Type: SHT_GNU_verdef
+ Link: .dynstr
+ Info: 0x1
+ Entries:
+ - Version: 0xfefe
+ Flags: 0
+ VersionNdx: 0
+ Hash: 0
+ Names: []
+DynamicSymbols:
+ - Name: foo
+
+## Check we error out when trying to print version symbols, but SHT_GNU_verdef is invalid due to any reason.
+
+# RUN: yaml2obj %s --docnum=10 -o %t10
+# RUN: not llvm-readobj -V %t10 2>&1 | FileCheck %s --check-prefix=INVALID-VERDEF-LLVM -DFILE=%t10
+# RUN: not llvm-readelf -V %t10 2>&1 | FileCheck %s --check-prefix=INVALID-VERDEF-GNU -DFILE=%t10
+
+# INVALID-VERDEF-LLVM: VersionSymbols [
+# INVALID-VERDEF-LLVM-NEXT: Symbol {
+# INVALID-VERDEF-LLVM-NEXT: Version: 0
+# INVALID-VERDEF-LLVM-NEXT: Name:
+# INVALID-VERDEF-LLVM-NEXT: }
+# INVALID-VERDEF-LLVM-NEXT: Symbol {
+# INVALID-VERDEF-LLVM-NEXT: Version: 2
+# INVALID-VERDEF-LLVM-EMPTY:
+# INVALID-VERDEF-LLVM-NEXT: error: '[[FILE]]': invalid SHT_GNU_verdef section with index 2: version definition 1 goes past the end of the section
+
+# INVALID-VERDEF-GNU: Version symbols section '.gnu.version' contains 2 entries:
+# INVALID-VERDEF-GNU-NEXT: Addr: 0000000000000000 Offset: 0x000040 Link: 5 (.dynsym)
+# INVALID-VERDEF-GNU-NEXT: 000: 0 (*local*)
+# INVALID-VERDEF-GNU-NEXT: error: '[[FILE]]': invalid SHT_GNU_verdef section with index 2: version definition 1 goes past the end of the section
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_DYN
+ Machine: EM_X86_64
+Sections:
+ - Name: .gnu.version
+ Type: SHT_GNU_versym
+ Flags: [ SHF_ALLOC ]
+ Link: .dynsym
+ AddressAlign: 0x0000000000000002
+ EntSize: 0x0000000000000002
+ Entries: [ 0, 2 ]
+ - Name: .gnu.version_d
+ Type: SHT_GNU_verdef
+ Flags: [ SHF_ALLOC ]
+ Link: .dynstr
+ AddressAlign: 0x4
+ Info: 0x1
+ Entries: []
+DynamicSymbols:
+ - Name: foo
+ Binding: STB_GLOBAL
diff --git a/llvm/test/tools/llvm-readobj/ELF/verneed-flags.yaml b/llvm/test/tools/llvm-readobj/ELF/verneed-flags.yaml
new file mode 100644
index 00000000000..eedc7fe7ad7
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/verneed-flags.yaml
@@ -0,0 +1,107 @@
+## Check how llvm-readobj/llvm-readelf tools dump the flags of SHT_GNU_verneed
+## section entries.
+
+# RUN: yaml2obj %s -o %t
+# RUN: llvm-readobj -V %t | FileCheck %s --check-prefix=LLVM-VERDEF
+# RUN: llvm-readelf -V %t | FileCheck %s --check-prefix=GNU-VERDEF
+
+# LLVM-VERDEF: VersionRequirements [
+# LLVM-VERDEF-NEXT: Dependency {
+# LLVM-VERDEF-NEXT: Version: 1
+# LLVM-VERDEF-NEXT: Count: 6
+# LLVM-VERDEF-NEXT: FileName: dso.so.0
+# LLVM-VERDEF-NEXT: Entries [
+# LLVM-VERDEF-NEXT: Entry {
+# LLVM-VERDEF-NEXT: Hash: 0
+# LLVM-VERDEF-NEXT: Flags: Base (0x1)
+# LLVM-VERDEF-NEXT: Index: 0
+# LLVM-VERDEF-NEXT: Name: base
+# LLVM-VERDEF-NEXT: }
+# LLVM-VERDEF-NEXT: Entry {
+# LLVM-VERDEF-NEXT: Hash: 0
+# LLVM-VERDEF-NEXT: Flags: Weak (0x2)
+# LLVM-VERDEF-NEXT: Index: 0
+# LLVM-VERDEF-NEXT: Name: weak
+# LLVM-VERDEF-NEXT: }
+# LLVM-VERDEF-NEXT: Entry {
+# LLVM-VERDEF-NEXT: Hash: 0
+# LLVM-VERDEF-NEXT: Flags: Info (0x4)
+# LLVM-VERDEF-NEXT: Index: 0
+# LLVM-VERDEF-NEXT: Name: info
+# LLVM-VERDEF-NEXT: }
+# LLVM-VERDEF-NEXT: Entry {
+# LLVM-VERDEF-NEXT: Hash: 0
+# LLVM-VERDEF-NEXT: Flags: 0x7
+# LLVM-VERDEF-NEXT: Index: 0
+# LLVM-VERDEF-NEXT: Name: all
+# LLVM-VERDEF-NEXT: }
+# LLVM-VERDEF-NEXT: Entry {
+# LLVM-VERDEF-NEXT: Hash: 0
+# LLVM-VERDEF-NEXT: Flags: 0x8
+# LLVM-VERDEF-NEXT: Index: 0
+# LLVM-VERDEF-NEXT: Name: unknown
+# LLVM-VERDEF-NEXT: }
+# LLVM-VERDEF-NEXT: Entry {
+# LLVM-VERDEF-NEXT: Hash: 0
+# LLVM-VERDEF-NEXT: Flags: 0xF
+# LLVM-VERDEF-NEXT: Index: 0
+# LLVM-VERDEF-NEXT: Name: all_and_unknown
+# LLVM-VERDEF-NEXT: }
+# LLVM-VERDEF-NEXT: ]
+# LLVM-VERDEF-NEXT: }
+# LLVM-VERDEF-NEXT: ]
+
+# GNU-VERDEF: Version needs section '.gnu.version_r' contains 1 entries:
+# GNU-VERDEF-NEXT: Addr: 0000000000000000 Offset: 0x000200 Link: 6 (.dynstr)
+# GNU-VERDEF-NEXT: 0x0000: Version: 1 File: dso.so.0 Cnt: 6
+# GNU-VERDEF-NEXT: 0x0010: Name: base Flags: BASE Version: 0
+# GNU-VERDEF-NEXT: 0x0020: Name: weak Flags: WEAK Version: 0
+# GNU-VERDEF-NEXT: 0x0030: Name: info Flags: INFO Version: 0
+# GNU-VERDEF-NEXT: 0x0040: Name: all Flags: BASE | WEAK | INFO Version: 0
+# GNU-VERDEF-NEXT: 0x0050: Name: unknown Flags: <unknown> Version: 0
+# GNU-VERDEF-NEXT: 0x0060: Name: all_and_unknown Flags: BASE | WEAK | INFO | <unknown> Version: 0
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+ Entry: 0x0000000000201000
+Sections:
+ - Name: .gnu.version_r
+ Type: SHT_GNU_verneed
+ Link: .dynstr
+ Info: 0x0000000000000001
+ Dependencies:
+ - Version: 1
+ File: dso.so.0
+ Entries:
+ - Name: base
+ Hash: 0
+ Flags: 0x1
+ Other: 0
+ - Name: weak
+ Hash: 0
+ Flags: 0x2
+ Other: 0
+ - Name: info
+ Hash: 0
+ Flags: 0x4
+ Other: 0
+ - Name: all
+ Hash: 0
+ Flags: 0x7
+ Other: 0
+ - Name: unknown
+ Hash: 0
+ Flags: 0x8
+ Other: 0
+ - Name: all_and_unknown
+ Hash: 0
+ Flags: 0xf
+ Other: 0
+## Needed to trigger .dynstr creation, which is required by .gnu.version_r
+DynamicSymbols:
+ - Name: f1
+ Binding: STB_GLOBAL
diff --git a/llvm/test/tools/llvm-readobj/ELF/verneed-invalid.test b/llvm/test/tools/llvm-readobj/ELF/verneed-invalid.test
new file mode 100644
index 00000000000..e8d75afe1e6
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/verneed-invalid.test
@@ -0,0 +1,606 @@
+## Test how llvm-readobj/llvm-readelf tools handle invalid SHT_GNU_verneed sections.
+
+## In the first case we have a SHT_GNU_versym section that refers to
+## a version listed in a SHT_GNU_verneed section. That version has an
+## empty name, making it invalid.
+
+# RUN: yaml2obj --docnum=1 %s -o %t1
+# RUN: llvm-readelf -V %t1 | FileCheck %s --check-prefix=GNU-VERNEED-NAME
+# RUN: llvm-readobj -V %t1 | FileCheck %s --check-prefix=LLVM-VERNEED-NAME
+
+# GNU-VERNEED-NAME: Version symbols section '.gnu.version' contains 2 entries:
+# GNU-VERNEED-NAME-NEXT: Addr: 0000000000200210 Offset: 0x000040 Link: 5 (.dynsym)
+# GNU-VERNEED-NAME-NEXT: 000: 0 (*local*) 2 (*invalid*)
+
+# GNU-VERNEED-NAME: Version needs section '.gnu.version_r' contains 1 entries:
+# GNU-VERNEED-NAME-NEXT: Addr: 0000000000000000 Offset: 0x000044 Link: 6 (.dynstr)
+# GNU-VERNEED-NAME-NEXT: 0x0000: Version: 1 File: somefile Cnt: 1
+# GNU-VERNEED-NAME-NEXT: 0x0010: Name: Flags: none Version: 2
+
+# LLVM-VERNEED-NAME: VersionSymbols [
+# LLVM-VERNEED-NAME: Symbol {
+# LLVM-VERNEED-NAME-NEXT: Version: 0
+# LLVM-VERNEED-NAME-NEXT: Name:
+# LLVM-VERNEED-NAME-NEXT: }
+# LLVM-VERNEED-NAME-NEXT: Symbol {
+# LLVM-VERNEED-NAME-NEXT: Version: 2
+# LLVM-VERNEED-NAME-NEXT: Name: foo
+# LLVM-VERNEED-NAME-NEXT: }
+# LLVM-VERNEED-NAME-NEXT: ]
+
+# LLVM-VERNEED-NAME: VersionRequirements [
+# LLVM-VERNEED-NAME-NEXT: Dependency {
+# LLVM-VERNEED-NAME-NEXT: Version: 1
+# LLVM-VERNEED-NAME-NEXT: Count: 1
+# LLVM-VERNEED-NAME-NEXT: FileName: somefile
+# LLVM-VERNEED-NAME-NEXT: Entries [
+# LLVM-VERNEED-NAME-NEXT: Entry {
+# LLVM-VERNEED-NAME-NEXT: Hash: 0
+# LLVM-VERNEED-NAME-NEXT: Flags [ (0x0)
+# LLVM-VERNEED-NAME-NEXT: ]
+# LLVM-VERNEED-NAME-NEXT: Index: 2
+# LLVM-VERNEED-NAME-NEXT: Name: {{$}}
+# LLVM-VERNEED-NAME-NEXT: }
+# LLVM-VERNEED-NAME-NEXT: ]
+# LLVM-VERNEED-NAME-NEXT: }
+# LLVM-VERNEED-NAME-NEXT: ]
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .gnu.version
+ Type: SHT_GNU_versym
+ Flags: [ SHF_ALLOC ]
+ Address: 0x200210
+ Link: .dynsym
+ Entries: [ 0, 2 ]
+ - Name: .gnu.version_r
+ Type: SHT_GNU_verneed
+ Flags: [ SHF_ALLOC ]
+ Link: .dynstr
+ Info: 1
+ AddressAlign: 4
+ Dependencies:
+ - Version: 1
+ File: somefile
+ Entries:
+ - Name: '' ## invalid name
+ Hash: 0
+ Flags: 0
+ Other: 2
+DynamicSymbols:
+ - Name: foo
+ Binding: STB_GLOBAL
+...
+
+## In this case SHT_GNU_verneed is not linked to a dynamic string table. We check we handle
+## this situation properly.
+
+# RUN: yaml2obj --docnum=2 %s -o %t2
+# RUN: llvm-readelf -V %t2 2>&1 | FileCheck %s -DFILE=%t2 --check-prefix=GNU-NOLINK
+# RUN: llvm-readobj -V %t2 2>&1 | FileCheck %s -DFILE=%t2 --check-prefix=LLVM-NOLINK
+
+# GNU-NOLINK: Version symbols section '.gnu.version' contains 2 entries:
+# GNU-NOLINK-NEXT: Addr: 0000000000000000 Offset: 0x000040 Link: 5 (.dynsym)
+# GNU-NOLINK-NEXT: 000: 0 (*local*)
+# GNU-NOLINK-NEXT: warning: '[[FILE]]': invalid string table linked to SHT_GNU_verneed section with index 2: invalid sh_type for string table section [index 0]: expected SHT_STRTAB, but got SHT_NULL
+# GNU-NOLINK-NEXT: 2 (<corrupt>)
+# GNU-NOLINK-EMPTY:
+# GNU-NOLINK: Version needs section '.gnu.version_r' contains 1 entries:
+# GNU-NOLINK-NEXT: Addr: 0000000000000000 Offset: 0x000044 Link: 0 ()
+# GNU-NOLINK-NEXT: 0x0000: Version: 1 File: <corrupt vn_file: 9> Cnt: 1
+# GNU-NOLINK-NEXT: 0x0010: Name: <corrupt> Flags: none Version: 2
+
+# LLVM-NOLINK: VersionSymbols [
+# LLVM-NOLINK: Symbol {
+# LLVM-NOLINK-NEXT: Version: 0
+# LLVM-NOLINK-NEXT: Name:
+# LLVM-NOLINK-NEXT: }
+# LLVM-NOLINK-NEXT: Symbol {
+# LLVM-NOLINK-NEXT: Version: 2
+# LLVM-NOLINK-EMPTY:
+# LLVM-NOLINK-NEXT: warning: '[[FILE]]': invalid string table linked to SHT_GNU_verneed section with index 2: invalid sh_type for string table section [index 0]: expected SHT_STRTAB, but got SHT_NULL
+# LLVM-NOLINK-NEXT: Name: foo@<corrupt>
+# LLVM-NOLINK-NEXT: }
+# LLVM-NOLINK-NEXT: ]
+
+# LLVM-NOLINK: VersionRequirements [
+# LLVM-NOLINK-NEXT: Dependency {
+# LLVM-NOLINK-NEXT: Version: 1
+# LLVM-NOLINK-NEXT: Count: 1
+# LLVM-NOLINK-NEXT: FileName: <corrupt vn_file: 9>
+# LLVM-NOLINK-NEXT: Entries [
+# LLVM-NOLINK-NEXT: Entry {
+# LLVM-NOLINK-NEXT: Hash: 0
+# LLVM-NOLINK-NEXT: Flags [ (0x0)
+# LLVM-NOLINK-NEXT: ]
+# LLVM-NOLINK-NEXT: Index: 2
+# LLVM-NOLINK-NEXT: Name: <corrupt>
+# LLVM-NOLINK-NEXT: }
+# LLVM-NOLINK-NEXT: ]
+# LLVM-NOLINK-NEXT: }
+# LLVM-NOLINK-NEXT: ]
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .gnu.version
+ Type: SHT_GNU_versym
+ Flags: [ SHF_ALLOC ]
+ Link: .dynsym
+ Entries: [ 0, 2 ]
+ - Name: .gnu.version_r
+ Type: SHT_GNU_verneed
+ Flags: [ SHF_ALLOC ]
+ Link: 0
+ Info: 1
+ AddressAlign: 4
+ Dependencies:
+ - Version: 1
+ File: somefile
+ Entries:
+ - Name: 'bar'
+ Hash: 0
+ Flags: 0
+ Other: 2
+DynamicSymbols:
+ - Name: foo
+ Binding: STB_GLOBAL
+
+## We can't parse misaligned auxiliary version records.
+
+# RUN: yaml2obj --docnum=3 %s -o %t3
+# RUN: not llvm-readelf -V %t3 2>&1 | FileCheck %s -DFILE=%t3 --check-prefix=BROKEN-AUX
+# RUN: not llvm-readobj -V %t3 2>&1 | FileCheck %s -DFILE=%t3 --check-prefix=BROKEN-AUX
+
+# BROKEN-AUX: error: '[[FILE]]': invalid SHT_GNU_verneed section with index 2: found a misaligned auxiliary entry at offset 0x11
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .gnu.version
+ Type: SHT_GNU_versym
+ Flags: [ SHF_ALLOC ]
+ Link: .dynsym
+ Entries: [ 2 ]
+ - Name: .gnu.version_r
+ Type: SHT_GNU_verneed
+ Flags: [ SHF_ALLOC ]
+ Info: 1
+ Link: .dynstr
+ AddressAlign: 4
+## The byte offset to the auxiliary entry is 0x11, i.e. it is not correctly aligned in memory.
+ Content: "0100010001000000110000000000000000000000"
+DynamicSymbols: []
+
+## Here we check that we can properly dump the case when a dependency file name
+## and/or a dependency name string offset is equal to the string table size.
+##
+## We set the version dependency vn_file field to the offset of string 'foo' in
+## the .dynstr, which is 1. We create a custom string table .mystrtab of size 1
+## and link it with the .gnu.version_r section. For the vna_name we use the same trick.
+
+# RUN: yaml2obj --docnum=4 %s -o %t4
+# RUN: llvm-readobj --sections --section-data -V %t4 | FileCheck %s --check-prefix=LLVM-OFFSET-EQ
+# RUN: llvm-readelf --sections -V %t4 | FileCheck %s --check-prefix=GNU-OFFSET-EQ
+
+# LLVM-OFFSET-EQ: Name: .mystrtab
+# LLVM-OFFSET-EQ: Size:
+# LLVM-OFFSET-EQ-SAME: 1
+
+# LLVM-OFFSET-EQ: Name: .dynstr
+# LLVM-OFFSET-EQ: SectionData (
+# LLVM-OFFSET-EQ-NEXT: 0000: 00666F6F 00 |.foo.|
+# LLVM-OFFSET-EQ-NEXT: )
+
+# LLVM-OFFSET-EQ: VersionRequirements [
+# LLVM-OFFSET-EQ-NEXT: Dependency {
+# LLVM-OFFSET-EQ-NEXT: Version: 1
+# LLVM-OFFSET-EQ-NEXT: Count: 1
+# LLVM-OFFSET-EQ-NEXT: FileName: <corrupt vn_file: 1>
+# LLVM-OFFSET-EQ-NEXT: Entries [
+# LLVM-OFFSET-EQ-NEXT: Entry {
+# LLVM-OFFSET-EQ-NEXT: Hash: 0
+# LLVM-OFFSET-EQ-NEXT: Flags [ (0x0)
+# LLVM-OFFSET-EQ-NEXT: ]
+# LLVM-OFFSET-EQ-NEXT: Index: 0
+# LLVM-OFFSET-EQ-NEXT: Name: <corrupt>
+# LLVM-OFFSET-EQ-NEXT: }
+# LLVM-OFFSET-EQ-NEXT: ]
+# LLVM-OFFSET-EQ-NEXT: }
+# LLVM-OFFSET-EQ-NEXT: ]
+
+# GNU-OFFSET-EQ: Version needs section '.gnu.version_r' contains 1 entries:
+# GNU-OFFSET-EQ-NEXT: Addr: 0000000000000000 Offset: 0x000044 Link: 1 (.mystrtab)
+# GNU-OFFSET-EQ-NEXT: 0x0000: Version: 1 File: <corrupt vn_file: 1> Cnt: 1
+# GNU-OFFSET-EQ-NEXT: 0x0010: Name: <corrupt> Flags: none Version: 0
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .mystrtab
+ Type: SHT_STRTAB
+ Content: "00"
+ - Name: .gnu.version_r
+ Type: SHT_GNU_verneed
+ Flags: [ SHF_ALLOC ]
+ Info: 1
+ Link: .mystrtab
+ AddressAlign: 4
+ Dependencies:
+ - Version: 1
+ File: foo
+ Entries:
+ - Name: 'foo'
+ Hash: 0
+ Flags: 0
+ Other: 0
+DynamicSymbols:
+ - Name: foo
+
+## Here we check that we can properly dump the case when a dependency file name
+## and/or a dependency name string offset is greater than the string table size.
+##
+# RUN: yaml2obj --docnum=5 %s -o %t5
+# RUN: llvm-readobj --sections -V %t5 | FileCheck %s --check-prefix=LLVM-OFFSET-GR
+# RUN: llvm-readelf --sections -V %t5 | FileCheck %s --check-prefix=GNU-OFFSET-GR
+
+# LLVM-OFFSET-GR: VersionRequirements [
+# LLVM-OFFSET-GR-NEXT: Dependency {
+# LLVM-OFFSET-GR-NEXT: Version: 1
+# LLVM-OFFSET-GR-NEXT: Count: 1
+# LLVM-OFFSET-GR-NEXT: FileName: <corrupt vn_file: 1>
+# LLVM-OFFSET-GR-NEXT: Entries [
+# LLVM-OFFSET-GR-NEXT: Entry {
+# LLVM-OFFSET-GR-NEXT: Hash: 0
+# LLVM-OFFSET-GR-NEXT: Flags [ (0x0)
+# LLVM-OFFSET-GR-NEXT: ]
+# LLVM-OFFSET-GR-NEXT: Index: 0
+# LLVM-OFFSET-GR-NEXT: Name: <corrupt>
+# LLVM-OFFSET-GR-NEXT: }
+# LLVM-OFFSET-GR-NEXT: ]
+# LLVM-OFFSET-GR-NEXT: }
+# LLVM-OFFSET-GR-NEXT: ]
+
+# GNU-OFFSET-GR: Version needs section '.gnu.version_r' contains 1 entries:
+# GNU-OFFSET-GR-NEXT: Addr: 0000000000000000 Offset: 0x000040 Link: 1 (.mystrtab)
+# GNU-OFFSET-GR-NEXT: 0x0000: Version: 1 File: <corrupt vn_file: 1> Cnt: 1
+# GNU-OFFSET-GR-NEXT: 0x0010: Name: <corrupt> Flags: none Version: 0
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .mystrtab
+ Type: SHT_STRTAB
+ Content: ""
+ - Name: .gnu.version_r
+ Type: SHT_GNU_verneed
+ Flags: [ SHF_ALLOC ]
+ Info: 1
+ Link: .mystrtab
+ AddressAlign: 4
+ Dependencies:
+ - Version: 1
+ File: foo
+ Entries:
+ - Name: 'foo'
+ Hash: 0
+ Flags: 0
+ Other: 0
+DynamicSymbols:
+ - Name: foo
+
+## Check that we report a warning when sh_link references a non-existent section.
+
+# RUN: yaml2obj --docnum=6 %s -o %t6
+# RUN: llvm-readobj --sections -V %t6 2>&1 | FileCheck %s -DFILE=%t6 --implicit-check-not="warning:" --check-prefix=INVALID-LINK-LLVM
+# RUN: llvm-readelf --sections -V %t6 2>&1 | FileCheck %s -DFILE=%t6 --implicit-check-not="warning:" --check-prefix=INVALID-LINK-GNU
+
+# INVALID-LINK-LLVM: VersionRequirements [
+# INVALID-LINK-LLVM-EMPTY:
+# INVALID-LINK-LLVM-NEXT: warning: '[[FILE]]': invalid section linked to SHT_GNU_verneed section with index 1: invalid section index: 255
+# INVALID-LINK-LLVM-NEXT: Dependency {
+# INVALID-LINK-LLVM-NEXT: Version: 1
+# INVALID-LINK-LLVM-NEXT: Count: 1
+# INVALID-LINK-LLVM-NEXT: FileName: <corrupt vn_file: 1>
+# INVALID-LINK-LLVM-NEXT: Entries [
+# INVALID-LINK-LLVM-NEXT: Entry {
+# INVALID-LINK-LLVM-NEXT: Hash: 0
+# INVALID-LINK-LLVM-NEXT: Flags [ (0x0)
+# INVALID-LINK-LLVM-NEXT: ]
+# INVALID-LINK-LLVM-NEXT: Index: 0
+# INVALID-LINK-LLVM-NEXT: Name: <corrupt>
+# INVALID-LINK-LLVM-NEXT: }
+# INVALID-LINK-LLVM-NEXT: ]
+# INVALID-LINK-LLVM-NEXT: }
+# INVALID-LINK-LLVM-NEXT: ]
+
+# INVALID-LINK-GNU: Version needs section '.gnu.version_r' contains 1 entries:
+# INVALID-LINK-GNU-EMPTY:
+# INVALID-LINK-GNU-NEXT: warning: '[[FILE]]': invalid section linked to SHT_GNU_verneed section with index 1: invalid section index: 255
+# INVALID-LINK-GNU-NEXT: Addr: 0000000000000000 Offset: 0x000040 Link: 255 (<corrupt>)
+# INVALID-LINK-GNU-NEXT: 0x0000: Version: 1 File: <corrupt vn_file: 1> Cnt: 1
+# INVALID-LINK-GNU-NEXT: 0x0010: Name: <corrupt> Flags: none Version: 0
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .gnu.version_r
+ Type: SHT_GNU_verneed
+ Flags: [ SHF_ALLOC ]
+ Info: 1
+ Link: 0xFF
+ Dependencies:
+ - Version: 1
+ File: foo
+ Entries:
+ - Name: 'foo'
+ Hash: 0
+ Flags: 0
+ Other: 0
+DynamicSymbols:
+ - Name: foo
+
+## Check that we report a warning when we can't read the content of the SHT_GNU_verneed section.
+
+# RUN: yaml2obj --docnum=7 %s -o %t7
+# RUN: llvm-readobj --sections -V %t7 2>&1 | FileCheck %s -DFILE=%t7 --check-prefix=INVALID-DATA
+# RUN: llvm-readelf --sections -V %t7 2>&1 | FileCheck %s -DFILE=%t7 --check-prefix=INVALID-DATA
+
+# INVALID-DATA: warning: '[[FILE]]': cannot read content of SHT_GNU_verneed section with index 1: section [index 1] has a sh_offset (0xffffffff) + sh_size (0x0) that is greater than the file size (0x230)
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .gnu.version_r
+ Type: SHT_GNU_verneed
+ Flags: [ SHF_ALLOC ]
+ Info: 1
+ Link: .dynstr
+ ShOffset: 0xFFFFFFFF
+## Triggers creation of the .dynstr.
+DynamicSymbols:
+ - Name: foo
+
+## Check that we report a warning when a SHT_GNU_verneed section contains a version dependency
+## that goes past the end of the section.
+
+# RUN: yaml2obj --docnum=8 %s -o %t8
+# RUN: llvm-readobj --sections -V %t8 2>&1 | FileCheck %s -DFILE=%t8 --check-prefix=DEP-PAST-END
+# RUN: llvm-readelf --sections -V %t8 2>&1 | FileCheck %s -DFILE=%t8 --check-prefix=DEP-PAST-END
+
+# DEP-PAST-END: warning: '[[FILE]]': invalid SHT_GNU_verneed section with index 1: version dependency 1 goes past the end of the section
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .gnu.version_r
+ Type: SHT_GNU_verneed
+ Flags: [ SHF_ALLOC ]
+ Info: 1
+ Link: .dynstr
+ ShSize: 0x1
+ Dependencies:
+ - Version: 1
+ File: foo
+ Entries:
+ - Name: 'foo'
+ Hash: 0
+ Flags: 0
+ Other: 0
+DynamicSymbols:
+ - Name: foo
+
+## Check we report a warning when a version dependency is not correctly aligned in memory.
+
+# RUN: yaml2obj --docnum=9 %s -o %t9
+# RUN: llvm-readobj --sections -V %t9 2>&1 | FileCheck %s -DFILE=%t9 --check-prefix=MISALIGNED-DEP
+# RUN: llvm-readelf --sections -V %t9 2>&1 | FileCheck %s -DFILE=%t9 --check-prefix=MISALIGNED-DEP
+
+# MISALIGNED-DEP: warning: '[[FILE]]': invalid SHT_GNU_verneed section with index 1: found a misaligned version dependency entry at offset 0x0
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Type: Fill
+ Size: 0x1
+ - Name: .gnu.version_r
+ Type: SHT_GNU_verneed
+ Flags: [ SHF_ALLOC ]
+ Info: 1
+ Link: .dynstr
+ Dependencies:
+ - Version: 1
+ File: foo
+ Entries:
+ - Name: 'foo'
+ Hash: 0
+ Flags: 0
+ Other: 0
+DynamicSymbols:
+ - Name: foo
+
+## Check that we report a warning when a SHT_GNU_verneed section contains a dependency definition
+## that refers to an auxiliary entry that goes past the end of the section.
+
+# RUN: yaml2obj --docnum=10 %s -o %t10
+# RUN: llvm-readobj --sections -V %t10 2>&1 | FileCheck %s -DFILE=%t10 --check-prefix=AUX-PAST-END
+# RUN: llvm-readelf --sections -V %t10 2>&1 | FileCheck %s -DFILE=%t10 --check-prefix=AUX-PAST-END
+
+# AUX-PAST-END: warning: '[[FILE]]': invalid SHT_GNU_verneed section with index 1: version dependency 1 refers to an auxiliary entry that goes past the end of the section
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .gnu.version_r
+ Type: SHT_GNU_verneed
+ Flags: [ SHF_ALLOC ]
+ Info: 1
+ Link: .dynstr
+ ShSize: 21
+ Dependencies:
+ - Version: 1
+ File: foo
+ Entries:
+ - Name: 'foo'
+ Hash: 0
+ Flags: 0
+ Other: 0
+DynamicSymbols:
+ - Name: foo
+
+## Check we report a warning when an auxiliary entry is not correctly aligned in memory.
+
+# RUN: yaml2obj %s --docnum=11 -o %t11
+# RUN: llvm-readobj -V %t11 2>&1 | FileCheck %s --check-prefix=MISALIGNED-AUX -DFILE=%t11
+# RUN: llvm-readelf -V %t11 2>&1 | FileCheck %s --check-prefix=MISALIGNED-AUX -DFILE=%t11
+
+# MISALIGNED-AUX: warning: '[[FILE]]': invalid SHT_GNU_verneed section with index 1: found a misaligned auxiliary entry at offset 0x11
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .gnu.version_r
+ Type: SHT_GNU_verneed
+ Flags: [ SHF_ALLOC ]
+ Info: 1
+ Link: .dynstr
+## The byte offset to the auxiliary entry is 0x11, i.e. it is not correctly aligned in memory.
+ Content: "0100010001000000110000000000000000000000"
+DynamicSymbols:
+ - Name: foo
+
+## Check how we handle the case when a dependency definition entry has an unsupported version.
+
+# RUN: yaml2obj %s --docnum=12 -o %t12
+# RUN: llvm-readobj -V %t12 2>&1 | FileCheck %s --check-prefix=UNSUPPORTED-VERSION -DFILE=%t12
+# RUN: llvm-readelf -V %t12 2>&1 | FileCheck %s --check-prefix=UNSUPPORTED-VERSION -DFILE=%t12
+
+# UNSUPPORTED-VERSION: warning: '[[FILE]]': unable to dump SHT_GNU_verneed section with index 1: version 65278 is not yet supported
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .gnu.version_r
+ Type: SHT_GNU_verneed
+ Flags: [ SHF_ALLOC ]
+ Info: 1
+ Link: .dynstr
+ Dependencies:
+ - Version: 0xfefe
+ File: foo
+ Entries:
+ - Name: 'foo'
+ Hash: 0
+ Flags: 0
+ Other: 0
+DynamicSymbols:
+ - Name: foo
+
+## In this case SHT_GNU_verneed is linked to a custom dynamic string table, which is not
+## called ".dynstr". Check we handle this case properly.
+
+# RUN: yaml2obj --docnum=13 %s -o %t13
+# RUN: llvm-readelf -V %t13 2>&1 | FileCheck %s -DFILE=%t13 --check-prefix=GNU-CUSTOM-DYNSTR
+# RUN: llvm-readobj -V %t13 2>&1 | FileCheck %s -DFILE=%t13 --check-prefix=LLVM-CUSTOM-DYNSTR
+
+# GNU-CUSTOM-DYNSTR: Version symbols section '.gnu.version' contains 2 entries:
+# GNU-CUSTOM-DYNSTR-NEXT: Addr: 0000000000000000 Offset: 0x000040 Link: 6 (.dynsym)
+# GNU-CUSTOM-DYNSTR-NEXT: 000: 0 (*local*) 2 (bcdefghij)
+# GNU-CUSTOM-DYNSTR: Version needs section '.gnu.version_r' contains 1 entries:
+# GNU-CUSTOM-DYNSTR-NEXT: Addr: 0000000000000000 Offset: 0x000044 Link: 3 (.custom.dynstr)
+# GNU-CUSTOM-DYNSTR-NEXT: 0x0000: Version: 1 File: j Cnt: 1
+# GNU-CUSTOM-DYNSTR-NEXT: 0x0010: Name: bcdefghij Flags: none Version: 2
+
+# LLVM-CUSTOM-DYNSTR: VersionSymbols [
+# LLVM-CUSTOM-DYNSTR: Symbol {
+# LLVM-CUSTOM-DYNSTR: Version: 2
+# LLVM-CUSTOM-DYNSTR-NEXT: Name: foo@bcdefghij
+
+# LLVM-CUSTOM-DYNSTR: VersionRequirements [
+# LLVM-CUSTOM-DYNSTR: Dependency {
+# LLVM-CUSTOM-DYNSTR: Entries [
+# LLVM-CUSTOM-DYNSTR: Entry {
+# LLVM-CUSTOM-DYNSTR: Index: 2
+# LLVM-CUSTOM-DYNSTR-NEXT: Name: bcdefghij
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .gnu.version
+ Type: SHT_GNU_versym
+ Flags: [ SHF_ALLOC ]
+ Link: .dynsym
+ Entries: [ 0, 2 ]
+ - Name: .gnu.version_r
+ Type: SHT_GNU_verneed
+ Flags: [ SHF_ALLOC ]
+ Link: .custom.dynstr
+ Info: 1
+ AddressAlign: 4
+ Dependencies:
+ - Version: 1
+ File: zed
+ Entries:
+ - Name: 'bar'
+ Hash: 0
+ Flags: 0
+ Other: 2
+ - Name: .custom.dynstr
+ Type: SHT_STRTAB
+ Content: "6162636465666768696a00" ## 'a','b','c','d','e','f','g','h','i','j',NIL
+DynamicSymbols:
+ - Name: foo
+ Binding: STB_GLOBAL
diff --git a/llvm/test/tools/llvm-readobj/ELF/versioninfo.test b/llvm/test/tools/llvm-readobj/ELF/versioninfo.test
new file mode 100644
index 00000000000..a7eaa80bb5d
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/versioninfo.test
@@ -0,0 +1,297 @@
+## Test how llvm-readobj/llvm-readelf tools dump versioning sections.
+## Check that SHT_GNU_versym dumper can see versions described in
+## SHT_GNU_verdef and SHT_GNU_verneed sections.
+
+# RUN: yaml2obj %s --docnum=1 -o %t1
+# RUN: llvm-readobj -V %t1 | FileCheck %s --check-prefix=LLVM
+# RUN: llvm-readelf -V %t1 | FileCheck %s --check-prefix=GNU
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_FREEBSD
+ Type: ET_DYN
+ Machine: EM_X86_64
+Sections:
+ - Name: .gnu.version
+ Type: SHT_GNU_versym
+ Flags: [ SHF_ALLOC ]
+ Link: .dynsym
+ AddressAlign: 0x0000000000000002
+ EntSize: 0x0000000000000002
+ Entries: [ 0, 2, 3, 4, 5, 6]
+ - Name: .gnu.version_d
+ Type: SHT_GNU_verdef
+ Flags: [ SHF_ALLOC ]
+ Link: .dynstr
+ AddressAlign: 0x0000000000000004
+ Info: 0x0000000000000006
+ Entries:
+ - Version: 1
+ Flags: 0
+ VersionNdx: 0
+ Hash: 0
+ Names:
+ - VERSION1
+ - Version: 1
+ Flags: 1
+ VersionNdx: 0
+ Hash: 0
+ Names:
+ - VERSION1
+ - Version: 1
+ Flags: 2
+ VersionNdx: 0
+ Hash: 0
+ Names:
+ - VERSION1
+ - Version: 1
+ Flags: 4
+ VersionNdx: 0
+ Hash: 0
+ Names:
+ - VERSION1
+ - Version: 1
+ Flags: 7
+ VersionNdx: 2
+ Hash: 175630257
+ Names:
+ - VERSION1
+ - Version: 1
+ Flags: 8
+ VersionNdx: 3
+ Hash: 175630258
+ Names:
+ - VERSION2
+ - VERSION1
+ - VERSION3
+ - Name: .gnu.version_r
+ Type: SHT_GNU_verneed
+ Flags: [ SHF_ALLOC ]
+ Link: .dynstr
+ AddressAlign: 0x0000000000000004
+ Info: 0x0000000000000002
+ Dependencies:
+ - Version: 1
+ File: verneed1.so.0
+ Entries:
+ - Name: v1
+ Hash: 0
+ Flags: 1
+ Other: 0
+ - Name: v1
+ Hash: 0
+ Flags: 2
+ Other: 0
+ - Name: v1
+ Hash: 0
+ Flags: 4
+ Other: 0
+ - Name: v1
+ Hash: 1938
+ Flags: 7
+ Other: 4
+ - Name: v2
+ Hash: 1939
+ Flags: 8
+ Other: 5
+ - Version: 1
+ File: verneed2.so.0
+ Entries:
+ - Name: v3
+ Hash: 1937
+ Flags: 0
+ Other: 6
+DynamicSymbols:
+ - Name: sym1
+ Binding: STB_GLOBAL
+ - Name: sym2
+ Binding: STB_GLOBAL
+ - Name: sym3
+ Binding: STB_GLOBAL
+ - Name: sym4
+ Binding: STB_GLOBAL
+ - Name: sym5
+ Binding: STB_GLOBAL
+...
+
+# LLVM: VersionSymbols [
+# LLVM-NEXT: Symbol {
+# LLVM-NEXT: Version: 0
+# LLVM-NEXT: Name:
+# LLVM-NEXT: }
+# LLVM-NEXT: Symbol {
+# LLVM-NEXT: Version: 2
+# LLVM-NEXT: Name: sym1@@VERSION1
+# LLVM-NEXT: }
+# LLVM-NEXT: Symbol {
+# LLVM-NEXT: Version: 3
+# LLVM-NEXT: Name: sym2@@VERSION2
+# LLVM-NEXT: }
+# LLVM-NEXT: Symbol {
+# LLVM-NEXT: Version: 4
+# LLVM-NEXT: Name: sym3@v1
+# LLVM-NEXT: }
+# LLVM-NEXT: Symbol {
+# LLVM-NEXT: Version: 5
+# LLVM-NEXT: Name: sym4@v2
+# LLVM-NEXT: }
+# LLVM-NEXT: Symbol {
+# LLVM-NEXT: Version: 6
+# LLVM-NEXT: Name: sym5@v3
+# LLVM-NEXT: }
+# LLVM-NEXT: ]
+# LLVM-NEXT: VersionDefinitions [
+# LLVM-NEXT: Definition {
+# LLVM-NEXT: Version: 1
+# LLVM-NEXT: Flags [ (0x0)
+# LLVM-NEXT: ]
+# LLVM-NEXT: Index: 0
+# LLVM-NEXT: Hash: 0
+# LLVM-NEXT: Name: VERSION1
+# LLVM-NEXT: Predecessors: []
+# LLVM-NEXT: }
+# LLVM-NEXT: Definition {
+# LLVM-NEXT: Version: 1
+# LLVM-NEXT: Flags [ (0x1)
+# LLVM-NEXT: Base (0x1)
+# LLVM-NEXT: ]
+# LLVM-NEXT: Index: 0
+# LLVM-NEXT: Hash: 0
+# LLVM-NEXT: Name: VERSION1
+# LLVM-NEXT: Predecessors: []
+# LLVM-NEXT: }
+# LLVM-NEXT: Definition {
+# LLVM-NEXT: Version: 1
+# LLVM-NEXT: Flags [ (0x2)
+# LLVM-NEXT: Weak (0x2)
+# LLVM-NEXT: ]
+# LLVM-NEXT: Index: 0
+# LLVM-NEXT: Hash: 0
+# LLVM-NEXT: Name: VERSION1
+# LLVM-NEXT: Predecessors: []
+# LLVM-NEXT: }
+# LLVM-NEXT: Definition {
+# LLVM-NEXT: Version: 1
+# LLVM-NEXT: Flags [ (0x4)
+# LLVM-NEXT: Info (0x4)
+# LLVM-NEXT: ]
+# LLVM-NEXT: Index: 0
+# LLVM-NEXT: Hash: 0
+# LLVM-NEXT: Name: VERSION1
+# LLVM-NEXT: Predecessors: []
+# LLVM-NEXT: }
+# LLVM-NEXT: Definition {
+# LLVM-NEXT: Version: 1
+# LLVM-NEXT: Flags [ (0x7)
+# LLVM-NEXT: Base (0x1)
+# LLVM-NEXT: Info (0x4)
+# LLVM-NEXT: Weak (0x2)
+# LLVM-NEXT: ]
+# LLVM-NEXT: Index: 2
+# LLVM-NEXT: Hash: 175630257
+# LLVM-NEXT: Name: VERSION1
+# LLVM-NEXT: Predecessors: []
+# LLVM-NEXT: }
+# LLVM-NEXT: Definition {
+# LLVM-NEXT: Version: 1
+# LLVM-NEXT: Flags [ (0x8)
+# LLVM-NEXT: ]
+# LLVM-NEXT: Index: 3
+# LLVM-NEXT: Hash: 175630258
+# LLVM-NEXT: Name: VERSION2
+# LLVM-NEXT: Predecessors: [VERSION1, VERSION3]
+# LLVM-NEXT: }
+# LLVM-NEXT: ]
+# LLVM-NEXT: VersionRequirements [
+# LLVM-NEXT: Dependency {
+# LLVM-NEXT: Version: 1
+# LLVM-NEXT: Count: 5
+# LLVM-NEXT: FileName: verneed1.so.0
+# LLVM-NEXT: Entries [
+# LLVM-NEXT: Entry {
+# LLVM-NEXT: Hash: 0
+# LLVM-NEXT: Flags [ (0x1)
+# LLVM-NEXT: Base (0x1)
+# LLVM-NEXT: ]
+# LLVM-NEXT: Index: 0
+# LLVM-NEXT: Name: v1
+# LLVM-NEXT: }
+# LLVM-NEXT: Entry {
+# LLVM-NEXT: Hash: 0
+# LLVM-NEXT: Flags [ (0x2)
+# LLVM-NEXT: Weak (0x2)
+# LLVM-NEXT: ]
+# LLVM-NEXT: Index: 0
+# LLVM-NEXT: Name: v1
+# LLVM-NEXT: }
+# LLVM-NEXT: Entry {
+# LLVM-NEXT: Hash: 0
+# LLVM-NEXT: Flags [ (0x4)
+# LLVM-NEXT: Info (0x4)
+# LLVM-NEXT: ]
+# LLVM-NEXT: Index: 0
+# LLVM-NEXT: Name: v1
+# LLVM-NEXT: }
+# LLVM-NEXT: Entry {
+# LLVM-NEXT: Hash: 1938
+# LLVM-NEXT: Flags [ (0x7)
+# LLVM-NEXT: Base (0x1)
+# LLVM-NEXT: Info (0x4)
+# LLVM-NEXT: Weak (0x2)
+# LLVM-NEXT: ]
+# LLVM-NEXT: Index: 4
+# LLVM-NEXT: Name: v1
+# LLVM-NEXT: }
+# LLVM-NEXT: Entry {
+# LLVM-NEXT: Hash: 1939
+# LLVM-NEXT: Flags [ (0x8)
+# LLVM-NEXT: ]
+# LLVM-NEXT: Index: 5
+# LLVM-NEXT: Name: v2
+# LLVM-NEXT: }
+# LLVM-NEXT: ]
+# LLVM-NEXT: }
+# LLVM-NEXT: Dependency {
+# LLVM-NEXT: Version: 1
+# LLVM-NEXT: Count: 1
+# LLVM-NEXT: FileName: verneed2.so.0
+# LLVM-NEXT: Entries [
+# LLVM-NEXT: Entry {
+# LLVM-NEXT: Hash: 1937
+# LLVM-NEXT: Flags [ (0x0)
+# LLVM-NEXT: ]
+# LLVM-NEXT: Index: 6
+# LLVM-NEXT: Name: v3
+# LLVM-NEXT: }
+# LLVM-NEXT: ]
+# LLVM-NEXT: }
+# LLVM-NEXT: ]
+
+# GNU: Version symbols section '.gnu.version' contains 6 entries:
+# GNU-NEXT: Addr: 0000000000000000 Offset: 0x000040 Link: 6 (.dynsym)
+# GNU-NEXT: 000: 0 (*local*) 2 (VERSION1) 3 (VERSION2) 4 (v1)
+# GNU-NEXT: 004: 5 (v2) 6 (v3)
+# GNU-EMPTY:
+# GNU-NEXT: Version definition section '.gnu.version_d' contains 6 entries:
+# GNU-NEXT: Addr: 0000000000000000 Offset: 0x00004c Link: 7 (.dynstr)
+# GNU-NEXT: 0x0000: Rev: 1 Flags: none Index: 0 Cnt: 1 Name: VERSION1
+# GNU-NEXT: 0x001c: Rev: 1 Flags: BASE Index: 0 Cnt: 1 Name: VERSION1
+# GNU-NEXT: 0x0038: Rev: 1 Flags: WEAK Index: 0 Cnt: 1 Name: VERSION1
+# GNU-NEXT: 0x0054: Rev: 1 Flags: INFO Index: 0 Cnt: 1 Name: VERSION1
+# GNU-NEXT: 0x0070: Rev: 1 Flags: BASE | WEAK | INFO Index: 2 Cnt: 1 Name: VERSION1
+# GNU-NEXT: 0x008c: Rev: 1 Flags: <unknown> Index: 3 Cnt: 3 Name: VERSION2
+# GNU-NEXT: 0x00b0: Parent 1: VERSION1
+# GNU-NEXT: 0x00b0: Parent 2: VERSION3
+# GNU-EMPTY:
+# GNU-NEXT: Version needs section '.gnu.version_r' contains 2 entries:
+# GNU-NEXT: Addr: 0000000000000000 Offset: 0x000104 Link: 7 (.dynstr)
+# GNU-NEXT: 0x0000: Version: 1 File: verneed1.so.0 Cnt: 5
+# GNU-NEXT: 0x0010: Name: v1 Flags: BASE Version: 0
+# GNU-NEXT: 0x0020: Name: v1 Flags: WEAK Version: 0
+# GNU-NEXT: 0x0030: Name: v1 Flags: INFO Version: 0
+# GNU-NEXT: 0x0040: Name: v1 Flags: BASE | WEAK | INFO Version: 4
+# GNU-NEXT: 0x0050: Name: v2 Flags: <unknown> Version: 5
+# GNU-NEXT: 0x0060: Version: 1 File: verneed2.so.0 Cnt: 1
+# GNU-NEXT: 0x0070: Name: v3 Flags: none Version: 6
diff --git a/llvm/test/tools/llvm-readobj/ELF/versym-invalid.test b/llvm/test/tools/llvm-readobj/ELF/versym-invalid.test
new file mode 100644
index 00000000000..a88318e5f49
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/versym-invalid.test
@@ -0,0 +1,220 @@
+## Test how llvm-readobj/llvm-readelf tools handle invalid SHT_GNU_versym sections.
+
+## Check that we report a warning when sh_link references a non-existent section.
+
+# RUN: yaml2obj --docnum=1 %s -o %t1
+# RUN: llvm-readelf -V %t1 2>&1 | FileCheck -DFILE=%t1 %s --check-prefix=GNU-INVALID-LINK
+# RUN: llvm-readobj -V %t1 2>&1 | FileCheck -DFILE=%t1 %s --check-prefix=LLVM-INVALID-LINK
+
+# GNU-INVALID-LINK: Version symbols section '.gnu.version' contains 0 entries:
+# GNU-INVALID-LINK-EMPTY:
+# GNU-INVALID-LINK-NEXT: warning: '[[FILE]]': invalid section linked to SHT_GNU_versym section with index 1: invalid section index: 255
+# GNU-INVALID-LINK-NEXT: Addr: 0000000000000000 Offset: 0x000040 Link: 255 (<corrupt>)
+
+# LLVM-INVALID-LINK: VersionSymbols [
+# LLVM-INVALID-LINK-EMPTY:
+# LLVM-INVALID-LINK-NEXT: warning: '[[FILE]]': invalid section linked to SHT_GNU_versym section with index 1: invalid section index: 255
+# LLVM-INVALID-LINK-NEXT: ]
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .gnu.version
+ Type: SHT_GNU_versym
+ Link: 0xFF
+ Entries: [ ]
+
+## Check that we report a warning when the sh_link field of a SHT_GNU_versym section does not reference
+## a dynamic symbol table section.
+
+# RUN: yaml2obj --docnum=2 %s -o %t2
+# RUN: llvm-readelf -V %t2 2>&1 | FileCheck -DFILE=%t2 %s --check-prefix=INVALID-SYMBOL-TABLE-GNU
+# RUN: llvm-readobj -V %t2 2>&1 | FileCheck -DFILE=%t2 %s --check-prefix=INVALID-SYMBOL-TABLE-LLVM
+
+# INVALID-SYMBOL-TABLE-GNU: Version symbols section '.gnu.version' contains 1 entries:
+# INVALID-SYMBOL-TABLE-GNU-NEXT: Addr: 0000000000000000 Offset: 0x000040 Link: 0 ()
+# INVALID-SYMBOL-TABLE-GNU-EMPTY:
+# INVALID-SYMBOL-TABLE-GNU-NEXT: warning: '[[FILE]]': invalid section linked to SHT_GNU_versym section with index 1: expected SHT_DYNSYM, but got SHT_NULL
+# INVALID-SYMBOL-TABLE-GNU-NEXT: 000: 0 (*local*)
+
+# INVALID-SYMBOL-TABLE-LLVM: VersionSymbols [
+# INVALID-SYMBOL-TABLE-LLVM-EMPTY:
+# INVALID-SYMBOL-TABLE-LLVM-NEXT: warning: '[[FILE]]': invalid section linked to SHT_GNU_versym section with index 1: expected SHT_DYNSYM, but got SHT_NULL
+# INVALID-SYMBOL-TABLE-LLVM-NEXT: ]
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .gnu.version
+ Type: SHT_GNU_versym
+ Link: 0x0
+ Entries: [ 0 ]
+
+## Check we report a warning when something is wrong with a string table linked to a symbol table that
+## is linked with SHT_GNU_versym. In this case we are unable to produce LLVM style output,
+## but GNU style is fine because it does not need that string table.
+
+# RUN: yaml2obj --docnum=3 %s -o %t3
+# RUN: llvm-readelf -V %t3 2>&1 | FileCheck -DFILE=%t3 %s --check-prefix=INVALID-STRING-TABLE-GNU
+# RUN: llvm-readobj -V %t3 2>&1 | FileCheck -DFILE=%t3 %s --check-prefix=INVALID-STRING-TABLE-LLVM
+
+# INVALID-STRING-TABLE-GNU: Version symbols section '.gnu.version' contains 1 entries:
+# INVALID-STRING-TABLE-GNU-NEXT: Addr: 0000000000000000 Offset: 0x000040 Link: 5 (.dynsym)
+# INVALID-STRING-TABLE-GNU-EMPTY:
+# INVALID-STRING-TABLE-GNU-NEXT: warning: '[[FILE]]': can't get a string table for the symbol table linked to SHT_GNU_versym section with index 1: invalid string table linked to SHT_DYNSYM section with index 5: invalid sh_type for string table section [index 2]: expected SHT_STRTAB, but got SHT_NULL
+# INVALID-STRING-TABLE-GNU-NEXT: 000: 0 (*local*)
+
+# INVALID-STRING-TABLE-LLVM: VersionSymbols [
+# INVALID-STRING-TABLE-LLVM-EMPTY:
+# INVALID-STRING-TABLE-LLVM-NEXT: warning: '[[FILE]]': can't get a string table for the symbol table linked to SHT_GNU_versym section with index 1: invalid string table linked to SHT_DYNSYM section with index 5: invalid sh_type for string table section [index 2]: expected SHT_STRTAB, but got SHT_NULL
+# INVALID-STRING-TABLE-LLVM-NEXT: ]
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .gnu.version
+ Type: SHT_GNU_versym
+ Link: .dynsym
+ Entries: [ 0 ]
+ - Name: .dynstr
+ Type: SHT_NULL
+DynamicSymbols: []
+
+## Check we report a warning when a SHT_GNU_versym section is not correctly aligned in memory.
+
+# RUN: yaml2obj --docnum=4 %s -o %t4
+# RUN: llvm-readelf -V %t4 2>&1 | FileCheck -DFILE=%t4 %s --check-prefix=MISALIGNED-GNU
+# RUN: llvm-readobj -V %t4 2>&1 | FileCheck -DFILE=%t4 %s --check-prefix=MISALIGNED-LLVM
+
+# MISALIGNED-GNU: Version symbols section '.gnu.version' contains 0 entries:
+# MISALIGNED-GNU-NEXT: Addr: 0000000000000000 Offset: 0x00ffff Link: 0 ()
+# MISALIGNED-GNU-EMPTY:
+# MISALIGNED-GNU-NEXT: warning: '[[FILE]]': the SHT_GNU_versym section with index 1 is misaligned
+
+# MISALIGNED-LLVM: VersionSymbols [
+# MISALIGNED-LLVM-EMPTY:
+# MISALIGNED-LLVM-NEXT: warning: '[[FILE]]': the SHT_GNU_versym section with index 1 is misaligned
+# MISALIGNED-LLVM-NEXT: ]
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .gnu.version
+ Type: SHT_GNU_versym
+ Entries: [ ]
+ ShOffset: 0xffff
+
+## Check we report a warning when a SHT_GNU_versym section has an invalid entry size.
+
+# RUN: yaml2obj --docnum=5 %s -o %t5
+# RUN: llvm-readelf -V %t5 2>&1 | FileCheck -DFILE=%t5 %s --check-prefix=INVALID-ENT-SIZE-GNU
+# RUN: llvm-readobj -V %t5 2>&1 | FileCheck -DFILE=%t5 %s --check-prefix=INVALID-ENT-SIZE-LLVM
+
+# INVALID-ENT-SIZE-GNU: Version symbols section '.gnu.version' contains 1 entries:
+# INVALID-ENT-SIZE-GNU-NEXT: Addr: 0000000000000000 Offset: 0x000040 Link: 0 ()
+# INVALID-ENT-SIZE-GNU-EMPTY:
+# INVALID-ENT-SIZE-GNU-NEXT: warning: '[[FILE]]': cannot read content of SHT_GNU_versym section with index 1: section [index 1] has an invalid sh_entsize: 3
+
+# INVALID-ENT-SIZE-LLVM: VersionSymbols [
+# INVALID-ENT-SIZE-LLVM-EMPTY:
+# INVALID-ENT-SIZE-LLVM-NEXT: warning: '[[FILE]]': cannot read content of SHT_GNU_versym section with index 1: section [index 1] has an invalid sh_entsize: 3
+# INVALID-ENT-SIZE-LLVM-NEXT: ]
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .gnu.version
+ Type: SHT_GNU_versym
+ Entries: [ 0 ]
+ EntSize: 3
+
+## Check we report a warning when the number of version entries does not match the number of symbols in the associated symbol table.
+
+# RUN: yaml2obj --docnum=6 %s -o %t6
+# RUN: llvm-readelf -V %t6 2>&1 | FileCheck -DFILE=%t6 %s --check-prefix=SYMBOLS-NUM-MISMATCH-GNU
+# RUN: llvm-readobj -V %t6 2>&1 | FileCheck -DFILE=%t6 %s --check-prefix=SYMBOLS-NUM-MISMATCH-LLVM
+
+# SYMBOLS-NUM-MISMATCH-GNU: Version symbols section '.gnu.version' contains 2 entries:
+# SYMBOLS-NUM-MISMATCH-GNU-NEXT: Addr: 0000000000000000 Offset: 0x000040 Link: 4 (.dynsym)
+# SYMBOLS-NUM-MISMATCH-GNU-EMPTY:
+# SYMBOLS-NUM-MISMATCH-GNU-NEXT: warning: '[[FILE]]': SHT_GNU_versym section with index 1: the number of entries (2) does not match the number of symbols (3) in the symbol table with index 4
+# SYMBOLS-NUM-MISMATCH-GNU-NEXT: 000: 0 (*local*) 1 (*global*)
+
+# SYMBOLS-NUM-MISMATCH-LLVM: VersionSymbols [
+# SYMBOLS-NUM-MISMATCH-LLVM-EMPTY:
+# SYMBOLS-NUM-MISMATCH-LLVM-NEXT: warning: '[[FILE]]': SHT_GNU_versym section with index 1: the number of entries (2) does not match the number of symbols (3) in the symbol table with index 4
+# SYMBOLS-NUM-MISMATCH-LLVM-NEXT: ]
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .gnu.version
+ Type: SHT_GNU_versym
+ Entries: [ 0, 1 ]
+ Link: .dynsym
+DynamicSymbols:
+ - Name: foo
+ - Name: bar
+
+## Check we can dump a SHT_GNU_versym section when it is linked to a custom dynamic symbol
+## table that is not called ".dynsym".
+
+# RUN: yaml2obj --docnum=7 %s -o %t7
+# RUN: llvm-readelf -V %t7 2>&1 | FileCheck -DFILE=%t7 %s --check-prefix=CUSTOM-SYMTAB-GNU
+# RUN: llvm-readobj -V %t7 2>&1 | FileCheck -DFILE=%t7 %s --check-prefix=CUSTOM-SYMTAB-LLVM
+
+# CUSTOM-SYMTAB-GNU: Version symbols section '.gnu.version' contains 1 entries:
+# CUSTOM-SYMTAB-GNU-NEXT: Addr: 0000000000000000 Offset: 0x000040 Link: 2 (.foo.dynsym)
+# CUSTOM-SYMTAB-GNU-NEXT: 000: 0 (*local*)
+
+# CUSTOM-SYMTAB-LLVM: VersionSymbols [
+# CUSTOM-SYMTAB-LLVM-NEXT: Symbol {
+# CUSTOM-SYMTAB-LLVM-NEXT: Version: 0
+# CUSTOM-SYMTAB-LLVM-NEXT: Name:
+# CUSTOM-SYMTAB-LLVM-NEXT: }
+# CUSTOM-SYMTAB-LLVM-NEXT: ]
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .gnu.version
+ Type: SHT_GNU_versym
+ Link: .foo.dynsym
+ Entries: [ 0 ]
+## A custom empty dynamic symbol table with a null entry.
+ - Name: .foo.dynsym
+ Type: SHT_DYNSYM
+ Link: .dynstr
+ EntSize: 24
+ Size: 24
+DynamicSymbols:
+ - Name: foo
+ - Name: bar
diff --git a/llvm/test/tools/llvm-readobj/ELF/wrong-shstrtab-type.test b/llvm/test/tools/llvm-readobj/ELF/wrong-shstrtab-type.test
new file mode 100644
index 00000000000..cc40f49d4a5
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/wrong-shstrtab-type.test
@@ -0,0 +1,45 @@
+## Check we do not fail to dump the section headers when
+## a .shstrtab section does not have a SHT_STRTAB type.
+
+## Check we report only one warning for the issue for each input object.
+
+# RUN: yaml2obj %s -o %t1
+# RUN: llvm-readobj -S %t1 2>&1 | FileCheck %s -DFILE=%t1 --implicit-check-not warning --check-prefix LLVM
+# RUN: llvm-readelf -S %t1 2>&1 | FileCheck %s -DFILE=%t1 --implicit-check-not warning --check-prefix GNU
+
+# LLVM: warning: '[[FILE]]': invalid sh_type for string table section [index 1]: expected SHT_STRTAB, but got SHT_PROGBITS
+# LLVM: Section {
+# LLVM: Name: .shstrtab
+# LLVM: Type: SHT_PROGBITS
+
+# GNU: Section Headers:
+# GNU: [Nr] Name Type Address Off Size ES Flg Lk Inf Al
+# GNU: warning: '[[FILE]]': invalid sh_type for string table section [index 1]: expected SHT_STRTAB, but got SHT_PROGBITS
+# GNU: [ 1] .shstrtab PROGBITS 0000000000000000 000040 000013 00 0 0 0
+
+## Test we report multiple identical warnings (one for each object) when dumping an archive.
+
+# RUN: rm -f %t.a
+# RUN: cp %t1 %t2
+# RUN: llvm-ar rc %t.a %t1 %t2 %t1
+# RUN: llvm-readobj -S %t.a 2>&1 | FileCheck %s --implicit-check-not warning --check-prefix WARNINGS
+# RUN: llvm-readelf -S %t.a 2>&1 | FileCheck %s --implicit-check-not warning --check-prefix WARNINGS
+
+# WARNINGS: warning: '{{.*}}1': invalid sh_type for string table section [index 1]: expected SHT_STRTAB, but got SHT_PROGBITS
+# WARNINGS: warning: '{{.*}}2': invalid sh_type for string table section [index 1]: expected SHT_STRTAB, but got SHT_PROGBITS
+# WARNINGS: warning: '{{.*}}1': invalid sh_type for string table section [index 1]: expected SHT_STRTAB, but got SHT_PROGBITS
+
+## Test we report the warning for each input file specified on the command line.
+
+# RUN: llvm-readobj -S %t1 %t2 %t1 2>&1 | FileCheck %s --implicit-check-not warning --check-prefix WARNINGS
+# RUN: llvm-readelf -S %t1 %t2 %t1 2>&1 | FileCheck %s --implicit-check-not warning --check-prefix WARNINGS
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_DYN
+ Machine: EM_X86_64
+Sections:
+ - Name: .shstrtab
+ Type: SHT_PROGBITS
OpenPOWER on IntegriCloud