summaryrefslogtreecommitdiff
path: root/test/tools/llvm-readobj
diff options
context:
space:
mode:
Diffstat (limited to 'test/tools/llvm-readobj')
-rw-r--r--test/tools/llvm-readobj/ARM/attribute-0.s7
-rw-r--r--test/tools/llvm-readobj/ARM/attribute-1.s7
-rw-r--r--test/tools/llvm-readobj/Inputs/codeview-inlining.obj.coffbin0 -> 8396 bytes
-rw-r--r--test/tools/llvm-readobj/Inputs/codeview-merging-1.objbin0 -> 8515 bytes
-rw-r--r--test/tools/llvm-readobj/Inputs/codeview-merging-2.objbin0 -> 8507 bytes
-rw-r--r--test/tools/llvm-readobj/Inputs/codeview-types.objbin0 -> 8746 bytes
-rw-r--r--test/tools/llvm-readobj/Inputs/codeview-vftable.obj.coffbin0 -> 20396 bytes
-rw-r--r--test/tools/llvm-readobj/Inputs/compression.zlib.style.elf-x86-64bin0 -> 10384 bytes
-rw-r--r--test/tools/llvm-readobj/Inputs/dynamic-table-so.aarch64bin0 -> 8960 bytes
-rw-r--r--test/tools/llvm-readobj/Inputs/dynamic-table.c5
-rw-r--r--test/tools/llvm-readobj/Inputs/elf-groups.x86_64bin0 -> 4384 bytes
-rw-r--r--test/tools/llvm-readobj/Inputs/file-aux-record.yaml1
-rw-r--r--test/tools/llvm-readobj/Inputs/file-multiple-aux-records.yaml1
-rwxr-xr-xtest/tools/llvm-readobj/Inputs/got-over.exe.elf-mipsbin0 -> 1648 bytes
-rw-r--r--test/tools/llvm-readobj/Inputs/has_pdb.exebin0 -> 391680 bytes
-rw-r--r--test/tools/llvm-readobj/Inputs/options.obj.elf-mipselbin0 -> 1720 bytes
-rwxr-xr-xtest/tools/llvm-readobj/Inputs/phdrs-elf.exe-i386bin0 -> 7512 bytes
-rwxr-xr-xtest/tools/llvm-readobj/Inputs/phdrs-elf.exe-x86_64bin0 -> 9030 bytes
-rw-r--r--test/tools/llvm-readobj/Inputs/relocs.obj.elf-lanaibin0 -> 429 bytes
-rw-r--r--test/tools/llvm-readobj/Inputs/relocs.py9
-rw-r--r--test/tools/llvm-readobj/Inputs/st-other.obj.elf-mipsbin0 -> 334 bytes
-rw-r--r--test/tools/llvm-readobj/Inputs/st-other.obj.elf-mips16bin0 -> 334 bytes
-rw-r--r--test/tools/llvm-readobj/Inputs/symbols-proc-specific.elf-hexagonbin0 -> 600 bytes
-rw-r--r--test/tools/llvm-readobj/Inputs/trivial.obj.elf-lanaibin0 -> 737 bytes
-rw-r--r--test/tools/llvm-readobj/Inputs/verneed.elf-x86-64bin0 -> 13520 bytes
-rw-r--r--test/tools/llvm-readobj/codeview-inlining.test65
-rw-r--r--test/tools/llvm-readobj/codeview-linetables.test275
-rw-r--r--test/tools/llvm-readobj/codeview-merging.test65
-rw-r--r--test/tools/llvm-readobj/codeview-types.test95
-rw-r--r--test/tools/llvm-readobj/codeview-vftable.test48
-rw-r--r--test/tools/llvm-readobj/coff-debug-directory.test34
-rw-r--r--test/tools/llvm-readobj/dynamic.test37
-rw-r--r--test/tools/llvm-readobj/elf-groups.test52
-rw-r--r--test/tools/llvm-readobj/elf-hash-histogram.test27
-rw-r--r--test/tools/llvm-readobj/elf-sec-compressed.test9
-rw-r--r--test/tools/llvm-readobj/elf-sec-flags.test90
-rw-r--r--test/tools/llvm-readobj/elf-versioninfo.test87
-rw-r--r--test/tools/llvm-readobj/file-headers.test32
-rw-r--r--test/tools/llvm-readobj/gnu-file-headers.test46
-rw-r--r--test/tools/llvm-readobj/gnu-phdrs.test78
-rw-r--r--test/tools/llvm-readobj/gnu-relocations.test28
-rw-r--r--test/tools/llvm-readobj/gnu-sections.test35
-rw-r--r--test/tools/llvm-readobj/gnu-symbols.test46
-rw-r--r--test/tools/llvm-readobj/mips-got-overlapped.test45
-rw-r--r--test/tools/llvm-readobj/mips-options-sec.test12
-rw-r--r--test/tools/llvm-readobj/mips-st-other.test25
-rw-r--r--test/tools/llvm-readobj/reloc-types.test9
47 files changed, 1102 insertions, 168 deletions
diff --git a/test/tools/llvm-readobj/ARM/attribute-0.s b/test/tools/llvm-readobj/ARM/attribute-0.s
index b761dd8f251fd..bad23957b7906 100644
--- a/test/tools/llvm-readobj/ARM/attribute-0.s
+++ b/test/tools/llvm-readobj/ARM/attribute-0.s
@@ -225,6 +225,13 @@
@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
diff --git a/test/tools/llvm-readobj/ARM/attribute-1.s b/test/tools/llvm-readobj/ARM/attribute-1.s
index f433cbcc19b7e..c710bc873f183 100644
--- a/test/tools/llvm-readobj/ARM/attribute-1.s
+++ b/test/tools/llvm-readobj/ARM/attribute-1.s
@@ -211,6 +211,13 @@
@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
diff --git a/test/tools/llvm-readobj/Inputs/codeview-inlining.obj.coff b/test/tools/llvm-readobj/Inputs/codeview-inlining.obj.coff
new file mode 100644
index 0000000000000..782e991c3bc70
--- /dev/null
+++ b/test/tools/llvm-readobj/Inputs/codeview-inlining.obj.coff
Binary files differ
diff --git a/test/tools/llvm-readobj/Inputs/codeview-merging-1.obj b/test/tools/llvm-readobj/Inputs/codeview-merging-1.obj
new file mode 100644
index 0000000000000..e51643a136dc1
--- /dev/null
+++ b/test/tools/llvm-readobj/Inputs/codeview-merging-1.obj
Binary files differ
diff --git a/test/tools/llvm-readobj/Inputs/codeview-merging-2.obj b/test/tools/llvm-readobj/Inputs/codeview-merging-2.obj
new file mode 100644
index 0000000000000..4cf24257deed1
--- /dev/null
+++ b/test/tools/llvm-readobj/Inputs/codeview-merging-2.obj
Binary files differ
diff --git a/test/tools/llvm-readobj/Inputs/codeview-types.obj b/test/tools/llvm-readobj/Inputs/codeview-types.obj
new file mode 100644
index 0000000000000..b00a7c6a3e10d
--- /dev/null
+++ b/test/tools/llvm-readobj/Inputs/codeview-types.obj
Binary files differ
diff --git a/test/tools/llvm-readobj/Inputs/codeview-vftable.obj.coff b/test/tools/llvm-readobj/Inputs/codeview-vftable.obj.coff
new file mode 100644
index 0000000000000..388a7212eb259
--- /dev/null
+++ b/test/tools/llvm-readobj/Inputs/codeview-vftable.obj.coff
Binary files differ
diff --git a/test/tools/llvm-readobj/Inputs/compression.zlib.style.elf-x86-64 b/test/tools/llvm-readobj/Inputs/compression.zlib.style.elf-x86-64
new file mode 100644
index 0000000000000..34cdb8a89edf4
--- /dev/null
+++ b/test/tools/llvm-readobj/Inputs/compression.zlib.style.elf-x86-64
Binary files differ
diff --git a/test/tools/llvm-readobj/Inputs/dynamic-table-so.aarch64 b/test/tools/llvm-readobj/Inputs/dynamic-table-so.aarch64
new file mode 100644
index 0000000000000..1e992294dc064
--- /dev/null
+++ b/test/tools/llvm-readobj/Inputs/dynamic-table-so.aarch64
Binary files differ
diff --git a/test/tools/llvm-readobj/Inputs/dynamic-table.c b/test/tools/llvm-readobj/Inputs/dynamic-table.c
index 6b01ba5388be0..2804653794b01 100644
--- a/test/tools/llvm-readobj/Inputs/dynamic-table.c
+++ b/test/tools/llvm-readobj/Inputs/dynamic-table.c
@@ -2,8 +2,13 @@
// -o dynamic-table-so.mips
// clang -target mipsel-linux-gnu -lc dynamic-table.c \
// -o dynamic-table-exe.mips
+// clang -target aarch64-linux-gnu -fPIC -shared dynamic-table.c \
+// -o dynamic-table-so.aarch64
int puts(const char *);
+__thread int foo;
+
int main(void) {
puts("Hello, World");
+ foo = 0;
}
diff --git a/test/tools/llvm-readobj/Inputs/elf-groups.x86_64 b/test/tools/llvm-readobj/Inputs/elf-groups.x86_64
new file mode 100644
index 0000000000000..29628ca09b023
--- /dev/null
+++ b/test/tools/llvm-readobj/Inputs/elf-groups.x86_64
Binary files differ
diff --git a/test/tools/llvm-readobj/Inputs/file-aux-record.yaml b/test/tools/llvm-readobj/Inputs/file-aux-record.yaml
index 89d6761a26dbd..2f74a9a6ef4a1 100644
--- a/test/tools/llvm-readobj/Inputs/file-aux-record.yaml
+++ b/test/tools/llvm-readobj/Inputs/file-aux-record.yaml
@@ -1,3 +1,4 @@
+!COFF
header: !Header
Machine: IMAGE_FILE_MACHINE_I386 # (0x14c)
Characteristics: [ IMAGE_FILE_DEBUG_STRIPPED ]
diff --git a/test/tools/llvm-readobj/Inputs/file-multiple-aux-records.yaml b/test/tools/llvm-readobj/Inputs/file-multiple-aux-records.yaml
index d5b1eec878b0b..42946b4fafb44 100644
--- a/test/tools/llvm-readobj/Inputs/file-multiple-aux-records.yaml
+++ b/test/tools/llvm-readobj/Inputs/file-multiple-aux-records.yaml
@@ -1,3 +1,4 @@
+!COFF
header: !Header
Machine: IMAGE_FILE_MACHINE_I386 # (0x14c)
Characteristics: [ IMAGE_FILE_DEBUG_STRIPPED ]
diff --git a/test/tools/llvm-readobj/Inputs/got-over.exe.elf-mips b/test/tools/llvm-readobj/Inputs/got-over.exe.elf-mips
new file mode 100755
index 0000000000000..27644bff3302a
--- /dev/null
+++ b/test/tools/llvm-readobj/Inputs/got-over.exe.elf-mips
Binary files differ
diff --git a/test/tools/llvm-readobj/Inputs/has_pdb.exe b/test/tools/llvm-readobj/Inputs/has_pdb.exe
new file mode 100644
index 0000000000000..60cc9f59fc164
--- /dev/null
+++ b/test/tools/llvm-readobj/Inputs/has_pdb.exe
Binary files differ
diff --git a/test/tools/llvm-readobj/Inputs/options.obj.elf-mipsel b/test/tools/llvm-readobj/Inputs/options.obj.elf-mipsel
new file mode 100644
index 0000000000000..6309d87c592bd
--- /dev/null
+++ b/test/tools/llvm-readobj/Inputs/options.obj.elf-mipsel
Binary files differ
diff --git a/test/tools/llvm-readobj/Inputs/phdrs-elf.exe-i386 b/test/tools/llvm-readobj/Inputs/phdrs-elf.exe-i386
new file mode 100755
index 0000000000000..a5a9541aec5fd
--- /dev/null
+++ b/test/tools/llvm-readobj/Inputs/phdrs-elf.exe-i386
Binary files differ
diff --git a/test/tools/llvm-readobj/Inputs/phdrs-elf.exe-x86_64 b/test/tools/llvm-readobj/Inputs/phdrs-elf.exe-x86_64
new file mode 100755
index 0000000000000..6b6520809d719
--- /dev/null
+++ b/test/tools/llvm-readobj/Inputs/phdrs-elf.exe-x86_64
Binary files differ
diff --git a/test/tools/llvm-readobj/Inputs/relocs.obj.elf-lanai b/test/tools/llvm-readobj/Inputs/relocs.obj.elf-lanai
new file mode 100644
index 0000000000000..70e25d1fca319
--- /dev/null
+++ b/test/tools/llvm-readobj/Inputs/relocs.obj.elf-lanai
Binary files differ
diff --git a/test/tools/llvm-readobj/Inputs/relocs.py b/test/tools/llvm-readobj/Inputs/relocs.py
index 62dbd627ca520..48a1ffb099483 100644
--- a/test/tools/llvm-readobj/Inputs/relocs.py
+++ b/test/tools/llvm-readobj/Inputs/relocs.py
@@ -991,6 +991,14 @@ class Relocs_Elf_Hexagon(Enum):
R_HEX_TPREL_16_X = 84
R_HEX_TPREL_11_X = 85
+class Relocs_Elf_Lanai(Enum):
+ R_LANAI_NONE = 0
+ R_LANAI_21 = 1
+ R_LANAI_21_F = 2
+ R_LANAI_25 = 3
+ R_LANAI_32 = 4
+ R_LANAI_HI16 = 5
+ R_LANAI_LO16 = 6
class Relocs_Coff_i386(Enum):
IMAGE_REL_I386_ABSOLUTE = 0x0000
@@ -1103,6 +1111,7 @@ craftElf("relocs.obj.elf-arm", "arm-unknown-unknown", Relocs_Elf_AR
craftElf("relocs.obj.elf-mips", "mips-unknown-linux", Relocs_Elf_Mips.entries(), "lui $2, %hi(sym)")
craftElf("relocs.obj.elf-mips64el", "mips64el-unknown-linux", Relocs_Elf_Mips.entries(), "lui $2, %hi(sym)")
#craftElf("relocs.obj.elf-hexagon", "hexagon-unknown-unknown", Relocs_Elf_Hexagon.entries(), ...)
+#craftElf("relocs.obj.elf-lanai", "lanai-unknown-unknown", Relocs_Elf_Lanai.entries(), "mov hi(x), %r4")
craftCoff("relocs.obj.coff-i386", "i386-pc-win32", Relocs_Coff_i386.entries(), "mov foo@imgrel(%ebx, %ecx, 4), %eax")
craftCoff("relocs.obj.coff-x86_64", "x86_64-pc-win32", Relocs_Coff_X86_64.entries(), "mov foo@imgrel(%ebx, %ecx, 4), %eax")
diff --git a/test/tools/llvm-readobj/Inputs/st-other.obj.elf-mips b/test/tools/llvm-readobj/Inputs/st-other.obj.elf-mips
new file mode 100644
index 0000000000000..80cefc192d4d4
--- /dev/null
+++ b/test/tools/llvm-readobj/Inputs/st-other.obj.elf-mips
Binary files differ
diff --git a/test/tools/llvm-readobj/Inputs/st-other.obj.elf-mips16 b/test/tools/llvm-readobj/Inputs/st-other.obj.elf-mips16
new file mode 100644
index 0000000000000..5f0a0e3de8ea3
--- /dev/null
+++ b/test/tools/llvm-readobj/Inputs/st-other.obj.elf-mips16
Binary files differ
diff --git a/test/tools/llvm-readobj/Inputs/symbols-proc-specific.elf-hexagon b/test/tools/llvm-readobj/Inputs/symbols-proc-specific.elf-hexagon
new file mode 100644
index 0000000000000..f6979086937a6
--- /dev/null
+++ b/test/tools/llvm-readobj/Inputs/symbols-proc-specific.elf-hexagon
Binary files differ
diff --git a/test/tools/llvm-readobj/Inputs/trivial.obj.elf-lanai b/test/tools/llvm-readobj/Inputs/trivial.obj.elf-lanai
new file mode 100644
index 0000000000000..fe05a31e358b5
--- /dev/null
+++ b/test/tools/llvm-readobj/Inputs/trivial.obj.elf-lanai
Binary files differ
diff --git a/test/tools/llvm-readobj/Inputs/verneed.elf-x86-64 b/test/tools/llvm-readobj/Inputs/verneed.elf-x86-64
new file mode 100644
index 0000000000000..3a9c8d8df8da3
--- /dev/null
+++ b/test/tools/llvm-readobj/Inputs/verneed.elf-x86-64
Binary files differ
diff --git a/test/tools/llvm-readobj/codeview-inlining.test b/test/tools/llvm-readobj/codeview-inlining.test
new file mode 100644
index 0000000000000..7856993530737
--- /dev/null
+++ b/test/tools/llvm-readobj/codeview-inlining.test
@@ -0,0 +1,65 @@
+; The following two object files were generated using the following command:
+; $ cl /d2Zi+ /Zc:inline /O2 /Z7 /c t.cpp
+; The contents of t.cpp follow:
+; static void bar() {
+; __asm nop
+; }
+; static void baz() {
+; __asm nop
+; }
+; static __forceinline void foo() {
+; __asm nop
+; #include "a.h"
+; #include "b.h"
+; __asm nop
+; goto forwards;
+;
+; backwards:
+; __asm nop
+; return;
+;
+; forwards:
+; __asm rep nop
+; goto backwards;
+; }
+; int main() {
+; bar();
+; baz();
+; foo();
+; }
+;
+; Both a.h and b.h contain "__asm nop".
+
+RUN: llvm-readobj -s -codeview -section-symbols %p/Inputs/codeview-inlining.obj.coff | FileCheck %s
+
+; FIXME: If we were more clever, we could turn FileIDs into paths.
+
+; CHECK: SubSectionType: InlineeLines (0xF6)
+; CHECK-NEXT: SubSectionSize: 0x3C
+; CHECK-NEXT: InlineeSourceLine {
+; CHECK-NEXT: Inlinee: bar (0x1002)
+; CHECK-NEXT: FileID: d:\src\llvm\build\t.cpp (0x30)
+; CHECK-NEXT: SourceLineNum: 2
+; CHECK-NEXT: ExtraFileCount: 0
+; CHECK-NEXT: ExtraFiles [
+; CHECK-NEXT: ]
+; CHECK-NEXT: }
+; CHECK-NEXT: InlineeSourceLine {
+; CHECK-NEXT: Inlinee: baz (0x1003)
+; CHECK-NEXT: FileID: d:\src\llvm\build\t.cpp (0x30)
+; CHECK-NEXT: SourceLineNum: 5
+; CHECK-NEXT: ExtraFileCount: 0
+; CHECK-NEXT: ExtraFiles [
+; CHECK-NEXT: ]
+; CHECK-NEXT: }
+; The 'foo' inline site has extra files due to includes.
+; CHECK-NEXT: InlineeSourceLine {
+; CHECK-NEXT: Inlinee: foo (0x1004)
+; CHECK-NEXT: FileID: d:\src\llvm\build\a.h (0x0)
+; CHECK-NEXT: SourceLineNum: 1
+; CHECK-NEXT: ExtraFileCount: 2
+; CHECK-NEXT: ExtraFiles [
+; CHECK-NEXT: FileID: d:\src\llvm\build\b.h (0x18)
+; CHECK-NEXT: FileID: d:\src\llvm\build\t.cpp (0x30)
+; CHECK-NEXT: ]
+; CHECK-NEXT: }
diff --git a/test/tools/llvm-readobj/codeview-linetables.test b/test/tools/llvm-readobj/codeview-linetables.test
index a1c6ab66b4cae..fe68e7efdb056 100644
--- a/test/tools/llvm-readobj/codeview-linetables.test
+++ b/test/tools/llvm-readobj/codeview-linetables.test
@@ -28,79 +28,80 @@ RUN: llvm-readobj -s -codeview -section-symbols %p/Inputs/multifunction-linetabl
RUN: | FileCheck %s -check-prefix MFUN64
MFUN32: CodeViewDebugInfo [
+MFUN32-NEXT: Section: .debug$S (2)
MFUN32-NEXT: Magic: 0x4
MFUN32-NEXT: Subsection [
-MFUN32-NEXT: Type: 0xF1
-MFUN32-NEXT: PayloadSize: 0x52
+MFUN32-NEXT: SubSectionType: Symbols (0xF1)
+MFUN32-NEXT: SubSectionSize: 0x52
MFUN32: ]
-MFUN32-NEXT: Subsection [
-MFUN32-NEXT: Type: 0xF5
-MFUN32-NEXT: PayloadSize: 0x24
+MFUN32: Subsection [
+MFUN32-NEXT: SubSectionType: FrameData (0xF5)
+MFUN32-NEXT: SubSectionSize: 0x24
MFUN32: ]
-MFUN32-NEXT: Subsection [
-MFUN32-NEXT: Type: 0xF1
-MFUN32-NEXT: PayloadSize: 0x4B
+MFUN32: Subsection [
+MFUN32-NEXT: SubSectionType: Symbols (0xF1)
+MFUN32-NEXT: SubSectionSize: 0x4B
MFUN32: ProcStart {
-MFUN32-NEXT: DisplayName: x
-MFUN32-NEXT: Section: _x
-MFUN32-NEXT: CodeSize: 0xA
-MFUN32-NEXT: }
-MFUN32-NEXT: ProcEnd
+MFUN32: CodeSize: 0xA
+MFUN32: DisplayName: x
+MFUN32: LinkageName: _x
+MFUN32: }
+MFUN32: ProcEnd
MFUN32: ]
-MFUN32-NEXT: Subsection [
-MFUN32-NEXT: Type: 0xF2
-MFUN32-NEXT: PayloadSize: 0x30
+MFUN32: Subsection [
+MFUN32-NEXT: SubSectionType: Lines (0xF2)
+MFUN32-NEXT: SubSectionSize: 0x30
MFUN32: LinkageName: _x
MFUN32-NEXT: ]
MFUN32-NEXT: Subsection [
-MFUN32-NEXT: Type: 0xF5
-MFUN32-NEXT: PayloadSize: 0x24
+MFUN32-NEXT: SubSectionType: FrameData (0xF5)
+MFUN32-NEXT: SubSectionSize: 0x24
MFUN32: ]
-MFUN32-NEXT: Subsection [
-MFUN32-NEXT: Type: 0xF1
-MFUN32-NEXT: PayloadSize: 0x4B
+MFUN32: Subsection [
+MFUN32-NEXT: SubSectionType: Symbols (0xF1)
+MFUN32-NEXT: SubSectionSize: 0x4B
MFUN32: ProcStart {
-MFUN32-NEXT: DisplayName: y
-MFUN32-NEXT: Section: _y
-MFUN32-NEXT: CodeSize: 0xA
-MFUN32-NEXT: }
-MFUN32-NEXT: ProcEnd
+MFUN32: CodeSize: 0xA
+MFUN32: DisplayName: y
+MFUN32: LinkageName: _y
+MFUN32: }
+MFUN32: ProcEnd
MFUN32: ]
MFUN32-NEXT: Subsection [
-MFUN32-NEXT: Type: 0xF2
-MFUN32-NEXT: PayloadSize: 0x30
+MFUN32-NEXT: SubSectionType: Lines (0xF2)
+MFUN32-NEXT: SubSectionSize: 0x30
MFUN32: LinkageName: _y
MFUN32-NEXT: ]
MFUN32-NEXT: Subsection [
-MFUN32-NEXT: Type: 0xF5
-MFUN32-NEXT: PayloadSize: 0x24
+MFUN32-NEXT: SubSectionType: FrameData (0xF5)
+MFUN32-NEXT: SubSectionSize: 0x24
MFUN32: ]
-MFUN32-NEXT: Subsection [
-MFUN32-NEXT: Type: 0xF1
-MFUN32-NEXT: PayloadSize: 0x4B
+MFUN32: Subsection [
+MFUN32-NEXT: SubSectionType: Symbols (0xF1)
+MFUN32-NEXT: SubSectionSize: 0x4B
MFUN32: ProcStart {
-MFUN32-NEXT: DisplayName: f
-MFUN32-NEXT: Section: _f
-MFUN32-NEXT: CodeSize: 0x14
-MFUN32-NEXT: }
-MFUN32-NEXT: ProcEnd
+MFUN32: CodeSize: 0x14
+MFUN32: DisplayName: f
+MFUN32: LinkageName: _f
+MFUN32: }
+MFUN32: ProcEnd
MFUN32: ]
-MFUN32-NEXT: Subsection [
-MFUN32-NEXT: Type: 0xF2
-MFUN32-NEXT: PayloadSize: 0x40
+MFUN32: Subsection [
+MFUN32-NEXT: SubSectionType: Lines (0xF2)
+MFUN32-NEXT: SubSectionSize: 0x40
MFUN32: LinkageName: _f
MFUN32-NEXT: ]
MFUN32-NEXT: Subsection [
-MFUN32-NEXT: Type: 0xF4
-MFUN32-NEXT: PayloadSize: 0x18
+MFUN32-NEXT: SubSectionType: FileChecksums (0xF4)
+MFUN32-NEXT: SubSectionSize: 0x18
MFUN32: ]
MFUN32-NEXT: Subsection [
-MFUN32-NEXT: Type: 0xF3
-MFUN32-NEXT: PayloadSize: 0x46
+MFUN32-NEXT: SubSectionType: StringTable (0xF3)
+MFUN32-NEXT: SubSectionSize: 0x46
MFUN32: ]
MFUN32-NEXT: Subsection [
-MFUN32-NEXT: Type: 0xF1
-MFUN32-NEXT: PayloadSize: 0x8
+MFUN32-NEXT: SubSectionType: Symbols (0xF1)
+MFUN32-NEXT: SubSectionSize: 0x8
MFUN32: ]
MFUN32-NEXT: FunctionLineTable [
MFUN32-NEXT LinkageName: _x
@@ -181,70 +182,70 @@ MFUN32-NEXT IsStatement: Yes
MFUN32-NEXT ]
MFUN32-NEXT ]
MFUN32-NEXT ]
-MFUN32-NEXT ]
+MFUN32: ]
MFUN64: CodeViewDebugInfo [
-MFUN64-NEXT: Magic: 0x4
+MFUN64: Magic: 0x4
MFUN64-NEXT: Subsection [
-MFUN64-NEXT: Type: 0xF1
-MFUN64-NEXT: PayloadSize: 0x52
+MFUN64-NEXT: SubSectionType: Symbols (0xF1)
+MFUN64-NEXT: SubSectionSize: 0x52
MFUN64: ]
-MFUN64-NEXT: Subsection [
-MFUN64-NEXT: Type: 0xF1
-MFUN64-NEXT: PayloadSize: 0x4B
+MFUN64: Subsection [
+MFUN64-NEXT: SubSectionType: Symbols (0xF1)
+MFUN64-NEXT: SubSectionSize: 0x4B
MFUN64: ProcStart {
-MFUN64-NEXT: DisplayName: x
-MFUN64-NEXT: Section: x
-MFUN64-NEXT: CodeSize: 0xE
-MFUN64-NEXT: }
-MFUN64-NEXT: ProcEnd
+MFUN64: CodeSize: 0xE
+MFUN64: DisplayName: x
+MFUN64: LinkageName: x
+MFUN64: }
+MFUN64: ProcEnd
MFUN64: ]
MFUN64-NEXT: Subsection [
-MFUN64-NEXT: Type: 0xF2
-MFUN64-NEXT: PayloadSize: 0x30
+MFUN64-NEXT: SubSectionType: Lines (0xF2)
+MFUN64-NEXT: SubSectionSize: 0x30
MFUN64: LinkageName: x
MFUN64-NEXT: ]
MFUN64-NEXT: Subsection [
-MFUN64-NEXT: Type: 0xF1
-MFUN64-NEXT: PayloadSize: 0x4B
+MFUN64-NEXT: SubSectionType: Symbols (0xF1)
+MFUN64-NEXT: SubSectionSize: 0x4B
MFUN64: ProcStart {
-MFUN64-NEXT: DisplayName: y
-MFUN64-NEXT: Section: y
-MFUN64-NEXT: CodeSize: 0xE
-MFUN64-NEXT: }
-MFUN64-NEXT: ProcEnd
+MFUN64: CodeSize: 0xE
+MFUN64: DisplayName: y
+MFUN64: LinkageName: y
+MFUN64: }
+MFUN64: ProcEnd
MFUN64: ]
MFUN64-NEXT: Subsection [
-MFUN64-NEXT: Type: 0xF2
-MFUN64-NEXT: PayloadSize: 0x30
+MFUN64-NEXT: SubSectionType: Lines (0xF2)
+MFUN64-NEXT: SubSectionSize: 0x30
MFUN64: LinkageName: y
MFUN64-NEXT: ]
MFUN64-NEXT: Subsection [
-MFUN64-NEXT: Type: 0xF1
-MFUN64-NEXT: PayloadSize: 0x4B
+MFUN64-NEXT: SubSectionType: Symbols (0xF1)
+MFUN64-NEXT: SubSectionSize: 0x4B
MFUN64: ProcStart {
-MFUN64-NEXT: DisplayName: f
-MFUN64-NEXT: Section: f
-MFUN64-NEXT: CodeSize: 0x18
-MFUN64-NEXT: }
-MFUN64-NEXT: ProcEnd
+MFUN64: CodeSize: 0x18
+MFUN64: DisplayName: f
+MFUN64: LinkageName: f
+MFUN64: }
+MFUN64: ProcEnd
MFUN64: ]
MFUN64-NEXT: Subsection [
-MFUN64-NEXT: Type: 0xF2
-MFUN64-NEXT: PayloadSize: 0x40
+MFUN64-NEXT: SubSectionType: Lines (0xF2)
+MFUN64-NEXT: SubSectionSize: 0x40
MFUN64: LinkageName: f
MFUN64-NEXT: ]
MFUN64-NEXT: Subsection [
-MFUN64-NEXT: Type: 0xF4
-MFUN64-NEXT: PayloadSize: 0x18
+MFUN64-NEXT: SubSectionType: FileChecksums (0xF4)
+MFUN64-NEXT: SubSectionSize: 0x18
MFUN64: ]
MFUN64-NEXT: Subsection [
-MFUN64-NEXT: Type: 0xF3
-MFUN64-NEXT: PayloadSize: 0xD
+MFUN64-NEXT: SubSectionType: StringTable (0xF3)
+MFUN64-NEXT: SubSectionSize: 0xD
MFUN64: ]
MFUN64-NEXT: Subsection [
-MFUN64-NEXT: Type: 0xF1
-MFUN64-NEXT: PayloadSize: 0x8
+MFUN64-NEXT: SubSectionType: Symbols (0xF1)
+MFUN64-NEXT: SubSectionSize: 0x8
MFUN64: ]
MFUN64-NEXT: FunctionLineTable [
MFUN64-NEXT: LinkageName: x
@@ -325,7 +326,7 @@ MFUN64-NEXT: IsStatement: Yes
MFUN64-NEXT: ]
MFUN64-NEXT: ]
MFUN64-NEXT: ]
-MFUN64-NEXT: ]
+MFUN64: ]
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; The following two object files were generated using the following command:
@@ -352,41 +353,41 @@ RUN: llvm-readobj -s -codeview -section-symbols %p/Inputs/multifile-linetables.o
RUN: | FileCheck %s -check-prefix MFILE64
MFILE32: CodeViewDebugInfo [
-MFILE32-NEXT: Magic: 0x4
+MFILE32: Magic: 0x4
MFILE32-NEXT: Subsection [
-MFILE32-NEXT: Type: 0xF1
-MFILE32-NEXT: PayloadSize: 0x51
+MFILE32-NEXT: SubSectionType: Symbols (0xF1)
+MFILE32-NEXT: SubSectionSize: 0x51
MFILE32: ]
-MFILE32-NEXT: Subsection [
-MFILE32-NEXT: Type: 0xF5
-MFILE32-NEXT: PayloadSize: 0x24
+MFILE32: Subsection [
+MFILE32-NEXT: SubSectionType: FrameData (0xF5)
+MFILE32-NEXT: SubSectionSize: 0x24
MFILE32: ]
-MFILE32-NEXT: Subsection [
-MFILE32-NEXT: Type: 0xF1
-MFILE32-NEXT: PayloadSize: 0x4B
+MFILE32: Subsection [
+MFILE32-NEXT: SubSectionType: Symbols (0xF1)
+MFILE32-NEXT: SubSectionSize: 0x4B
MFILE32: ProcStart {
-MFILE32-NEXT: DisplayName: f
-MFILE32-NEXT: Section: _f
-MFILE32-NEXT: CodeSize: 0x14
-MFILE32-NEXT: }
-MFILE32-NEXT: ProcEnd
+MFILE32: CodeSize: 0x14
+MFILE32: DisplayName: f
+MFILE32: LinkageName: _f
+MFILE32: }
+MFILE32: ProcEnd
MFILE32: ]
MFILE32-NEXT: Subsection [
-MFILE32-NEXT: Type: 0xF2
-MFILE32-NEXT: PayloadSize: 0x64
+MFILE32-NEXT: SubSectionType: Lines (0xF2)
+MFILE32-NEXT: SubSectionSize: 0x64
MFILE32: LinkageName: _f
MFILE32-NEXT: ]
MFILE32-NEXT: Subsection [
-MFILE32-NEXT: Type: 0xF4
-MFILE32-NEXT: PayloadSize: 0x28
+MFILE32-NEXT: SubSectionType: FileChecksums (0xF4)
+MFILE32-NEXT: SubSectionSize: 0x28
MFILE32: ]
MFILE32-NEXT: Subsection [
-MFILE32-NEXT: Type: 0xF3
-MFILE32-NEXT: PayloadSize: 0x57
+MFILE32-NEXT: SubSectionType: StringTable (0xF3)
+MFILE32-NEXT: SubSectionSize: 0x57
MFILE32: ]
MFILE32-NEXT: Subsection [
-MFILE32-NEXT: Type: 0xF1
-MFILE32-NEXT: PayloadSize: 0x8
+MFILE32-NEXT: SubSectionType: Symbols (0xF1)
+MFILE32-NEXT: SubSectionSize: 0x8
MFILE32: ]
MFILE32-NEXT: FunctionLineTable [
MFILE32-NEXT: LinkageName: _f
@@ -430,40 +431,40 @@ MFILE32-NEXT: IsStatement: Yes
MFILE32-NEXT: ]
MFILE32-NEXT: ]
MFILE32-NEXT: ]
-MFILE32-NEXT: ]
+MFILE32: ]
MFILE64: CodeViewDebugInfo [
-MFILE64-NEXT: Magic: 0x4
+MFILE64: Magic: 0x4
MFILE64-NEXT: Subsection [
-MFILE64-NEXT: Type: 0xF1
-MFILE64-NEXT: PayloadSize: 0x51
+MFILE64-NEXT: SubSectionType: Symbols (0xF1)
+MFILE64-NEXT: SubSectionSize: 0x51
MFILE64: ]
-MFILE64-NEXT: Subsection [
-MFILE64-NEXT: Type: 0xF1
-MFILE64-NEXT: PayloadSize: 0x4B
+MFILE64: Subsection [
+MFILE64-NEXT: SubSectionType: Symbols (0xF1)
+MFILE64-NEXT: SubSectionSize: 0x4B
MFILE64: ProcStart {
-MFILE64-NEXT: DisplayName: f
-MFILE64-NEXT: Section: f
-MFILE64-NEXT: CodeSize: 0x18
-MFILE64-NEXT: }
-MFILE64-NEXT: ProcEnd
+MFILE64: CodeSize: 0x18
+MFILE64: DisplayName: f
+MFILE64: LinkageName: f
+MFILE64: }
+MFILE64: ProcEnd
MFILE64: ]
MFILE64-NEXT: Subsection [
-MFILE64-NEXT: Type: 0xF2
-MFILE64-NEXT: PayloadSize: 0x64
+MFILE64-NEXT: SubSectionType: Lines (0xF2)
+MFILE64-NEXT: SubSectionSize: 0x64
MFILE64: LinkageName: f
MFILE64-NEXT: ]
MFILE64-NEXT: Subsection [
-MFILE64-NEXT: Type: 0xF4
-MFILE64-NEXT: PayloadSize: 0x28
+MFILE64-NEXT: SubSectionType: FileChecksums (0xF4)
+MFILE64-NEXT: SubSectionSize: 0x28
MFILE64: ]
MFILE64-NEXT: Subsection [
-MFILE64-NEXT: Type: 0xF3
-MFILE64-NEXT: PayloadSize: 0x1E
+MFILE64-NEXT: SubSectionType: StringTable (0xF3)
+MFILE64-NEXT: SubSectionSize: 0x1E
MFILE64: ]
MFILE64-NEXT: Subsection [
-MFILE64-NEXT: Type: 0xF1
-MFILE64-NEXT: PayloadSize: 0x8
+MFILE64-NEXT: SubSectionType: Symbols (0xF1)
+MFILE64-NEXT: SubSectionSize: 0x8
MFILE64: ]
MFILE64-NEXT: FunctionLineTable [
MFILE64-NEXT: LinkageName: f
@@ -506,7 +507,7 @@ MFILE64-NEXT: LineNumberEndDelta: 0
MFILE64-NEXT: IsStatement: Yes
MFILE64-NEXT: ]
MFILE64-NEXT: ]
-MFILE64-NEXT: ]
+MFILE64: ]
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; The following object files were generated using the following command:
@@ -528,10 +529,10 @@ RUN: llvm-readobj -s -codeview -section-symbols %p/Inputs/comdat-function-lineta
RUN: | FileCheck %s -check-prefix MCOMDAT
MCOMDAT: ProcStart {
-MCOMDAT-NEXT: DisplayName: f
-MCOMDAT-NEXT: Section: ?f@@YAHXZ
-MCOMDAT-NEXT: CodeSize: 0x7
-MCOMDAT-NEXT: }
+MCOMDAT: CodeSize: 0x7
+MCOMDAT: DisplayName: f
+MCOMDAT: LinkageName: ?f@@YAHXZ
+MCOMDAT: }
MCOMDAT: FunctionLineTable [
MCOMDAT-NEXT: LinkageName: ?f@@YAHXZ
MCOMDAT-NEXT: Flags: 0x0
@@ -556,10 +557,10 @@ MCOMDAT-NEXT: ]
MCOMDAT-NEXT: ]
MCOMDAT-NEXT: ]
MCOMDAT: ProcStart {
-MCOMDAT-NEXT: DisplayName: g
-MCOMDAT-NEXT: Section: ?g@@YAHXZ
-MCOMDAT-NEXT: CodeSize: 0x7
-MCOMDAT-NEXT: }
+MCOMDAT: CodeSize: 0x7
+MCOMDAT: DisplayName: g
+MCOMDAT: LinkageName: ?g@@YAHXZ
+MCOMDAT: }
MCOMDAT: FunctionLineTable [
MCOMDAT-NEXT: LinkageName: ?g@@YAHXZ
MCOMDAT-NEXT: Flags: 0x0
diff --git a/test/tools/llvm-readobj/codeview-merging.test b/test/tools/llvm-readobj/codeview-merging.test
new file mode 100644
index 0000000000000..60894eff33eb1
--- /dev/null
+++ b/test/tools/llvm-readobj/codeview-merging.test
@@ -0,0 +1,65 @@
+# To regenerate t1.obj and t2.obj, run the following:
+# $ cat t.cpp
+# #ifdef CONFIG1
+# struct A;
+# struct B {
+# A *a;
+# };
+# int f(A *a);
+# int g(B *b) { return f(b->a); }
+# #else
+# struct B;
+# struct A {
+# B *b;
+# };
+# int g(B *b);
+# int f(A *a) { return g(a->b); }
+# #endif
+# $ cl -c -DCONFIG1 -Z7 t.cpp -Fot1.obj && cl -c -Z7 t.cpp -Fot2.obj
+
+RUN: llvm-readobj -codeview %S/Inputs/codeview-merging-1.obj | FileCheck %s --check-prefix=OBJ1
+RUN: llvm-readobj -codeview %S/Inputs/codeview-merging-2.obj | FileCheck %s --check-prefix=OBJ2
+RUN: llvm-readobj -codeview-merged-types %S/Inputs/codeview-merging-1.obj %S/Inputs/codeview-merging-2.obj | FileCheck %s
+
+OBJ1: FuncId (0x100D) {
+OBJ1-NEXT: TypeLeafKind: LF_FUNC_ID (0x1601)
+OBJ1-NEXT: ParentScope: 0x0
+OBJ1-NEXT: FunctionType: int (B*) (0x100C)
+OBJ1-NEXT: Name: g
+OBJ1-NEXT: }
+OBJ1-NEXT: FuncId (0x100E) {
+OBJ1-NEXT: TypeLeafKind: LF_FUNC_ID (0x1601)
+OBJ1-NEXT: ParentScope: 0x0
+OBJ1-NEXT: FunctionType: int (A*) (0x1003)
+OBJ1-NEXT: Name: f
+OBJ1-NEXT: }
+OBJ1-NOT: FuncId
+
+OBJ2: FuncId (0x100D) {
+OBJ2-NEXT: TypeLeafKind: LF_FUNC_ID (0x1601)
+OBJ2-NEXT: ParentScope: 0x0
+OBJ2-NEXT: FunctionType: int (A*) (0x100C)
+OBJ2-NEXT: Name: f
+OBJ2-NEXT: }
+
+OBJ2: FuncId (0x1069) {
+OBJ2-NEXT: TypeLeafKind: LF_FUNC_ID (0x1601)
+OBJ2-NEXT: ParentScope: 0x0
+OBJ2-NEXT: FunctionType: int (B*) (0x1003)
+OBJ2-NEXT: Name: g
+OBJ2-NEXT: }
+OBJ2-NOT: FuncId
+
+CHECK: FuncId (0x100D) {
+CHECK-NEXT: TypeLeafKind: LF_FUNC_ID (0x1601)
+CHECK-NEXT: ParentScope: 0x0
+CHECK-NEXT: FunctionType: int (B*) (0x100C)
+CHECK-NEXT: Name: g
+CHECK-NEXT: }
+CHECK-NEXT: FuncId (0x100E) {
+CHECK-NEXT: TypeLeafKind: LF_FUNC_ID (0x1601)
+CHECK-NEXT: ParentScope: 0x0
+CHECK-NEXT: FunctionType: int (A*) (0x1003)
+CHECK-NEXT: Name: f
+CHECK-NEXT: }
+CHECK-NOT: FuncId
diff --git a/test/tools/llvm-readobj/codeview-types.test b/test/tools/llvm-readobj/codeview-types.test
new file mode 100644
index 0000000000000..4545b8e01dd27
--- /dev/null
+++ b/test/tools/llvm-readobj/codeview-types.test
@@ -0,0 +1,95 @@
+// This tests that we can deserialize and reserialize every known type record.
+// If you need to update the object file, enable the RUNX line below using MSVC
+// from VS 2012. Newer versions of MSVC emit tons of internal types for
+// attributes that pollute the test output. When Clang fully supports all these
+// type records, we can regenerate the test using it instead.
+
+// RUNX: cl -GR- -Z7 -c -TP %s -Fo%S/Inputs/codeview-types.obj
+// RUN: llvm-readobj -codeview %S/Inputs/codeview-types.obj | FileCheck %s
+// RUN: llvm-readobj -codeview-merged-types %S/Inputs/codeview-types.obj | FileCheck %s
+
+// TYPE_RECORD
+// CHECK-DAG: {{^ *Pointer (.*) {$}}
+// CHECK-DAG: {{^ *Modifier (.*) {$}}
+// CHECK-DAG: {{^ *Procedure (.*) {$}}
+// CHECK-DAG: {{^ *MemberFunction (.*) {$}}
+// CHECK-DAG: {{^ *ArgList (.*) {$}}
+// CHECK-DAG: {{^ *Array (.*) {$}}
+// CHECK-DAG: {{^ *Class (.*) {$}}
+// CHECK-DAG: {{^ *Union (.*) {$}}
+// CHECK-DAG: {{^ *Enum (.*) {$}}
+// CHECK-DAG: {{^ *VFTable (.*) {$}}
+// CHECK-DAG: {{^ *VFTableShape (.*) {$}}
+// CHECK-DAG: {{^ *FuncId (.*) {$}}
+// CHECK-DAG: {{^ *MemberFuncId (.*) {$}}
+// CHECK-DAG: {{^ *BuildInfo (.*) {$}}
+// CHECK-DAG: {{^ *StringId (.*) {$}}
+// CHECK-DAG: {{^ *UdtSourceLine (.*) {$}}
+// CHECK-DAG: {{^ *MethodOverloadList (.*) {$}}
+// No TypeServer2, since that is used with /Zi
+
+// MEMBER_RECORD
+// CHECK-DAG: {{^ *BaseClass {$}}
+// CHECK-DAG: {{^ *VirtualBaseClass {$}}
+// CHECK-DAG: {{^ *VFPtr {$}}
+// CHECK-DAG: {{^ *StaticDataMember {$}}
+// CHECK-DAG: {{^ *OverloadedMethod {$}}
+// CHECK-DAG: {{^ *DataMember {$}}
+// CHECK-DAG: {{^ *NestedType {$}}
+// CHECK-DAG: {{^ *OneMethod {$}}
+// CHECK-DAG: {{^ *Enumerator {$}}
+
+#if !defined(__clang__) && _MSC_VER >= 1800
+#error "use clang or MSVC 2012 to regenerate the test"
+#endif
+
+struct VBaseA;
+void FriendFunc();
+
+class Class {
+public:
+ const Class *DataMember;
+private:
+ static int StaticDataMember;
+protected:
+ virtual void MemberFunction();
+public:
+ struct Nested;
+ friend ::VBaseA;
+ friend void FriendFunc() { }
+ void OverloadedMethod();
+ void OverloadedMethod(int);
+};
+
+enum Enum {
+ E1 = 0,
+ E2 = 1
+};
+
+int array[4] = {1, 2, 3, 4};
+
+struct Class::Nested {};
+
+struct ClassWithBase : Class {
+ virtual void MemberFunction();
+ virtual void NewVirtual();
+};
+struct VBaseA { int x; };
+struct VBaseB : virtual VBaseA { int x; };
+struct VBaseC : virtual VBaseA { int x; };
+struct VBaseD : VBaseB, VBaseC { int x; };
+
+union Union {
+ float f;
+ int i;
+};
+
+void UseAllTypes() {
+ Class a;
+ Class::Nested b;
+ ClassWithBase c;
+ VBaseD d;
+ Union e;
+ Enum f;
+ FriendFunc();
+}
diff --git a/test/tools/llvm-readobj/codeview-vftable.test b/test/tools/llvm-readobj/codeview-vftable.test
new file mode 100644
index 0000000000000..772f0c764983a
--- /dev/null
+++ b/test/tools/llvm-readobj/codeview-vftable.test
@@ -0,0 +1,48 @@
+; The following two object files were generated using the following command:
+; $ cl /Z7 /c t.cpp
+; The contents of t.cpp follow:
+; struct A {
+; virtual void f();
+; };
+; struct B {
+; virtual void f();
+; virtual void g();
+; };
+; struct C {
+; virtual void f();
+; virtual void g();
+; virtual void h();
+; };
+; A a;
+; B b;
+; C c;
+
+RUN: llvm-readobj -codeview %p/Inputs/codeview-vftable.obj.coff | FileCheck %s
+
+CHECK: VFTable (0x10F0) {
+CHECK-NEXT: TypeLeafKind: LF_VFTABLE (0x151D)
+CHECK-NEXT: CompleteClass: A
+CHECK-NEXT: OverriddenVFTable: 0x0
+CHECK-NEXT: VFPtrOffset: 0x0
+CHECK-NEXT: VFTableName: ??_7A@@6B@
+CHECK-NEXT: MethodName: ?f@A@@UEAAXXZ
+CHECK-NEXT: }
+CHECK-NEXT: VFTable (0x10F1) {
+CHECK-NEXT: TypeLeafKind: LF_VFTABLE (0x151D)
+CHECK-NEXT: CompleteClass: B
+CHECK-NEXT: OverriddenVFTable: ??_7A@@6B@ (0x10F0)
+CHECK-NEXT: VFPtrOffset: 0x0
+CHECK-NEXT: VFTableName: ??_7B@@6B@
+CHECK-NEXT: MethodName: ?f@B@@UEAAXXZ
+CHECK-NEXT: MethodName: ?g@B@@UEAAXXZ
+CHECK-NEXT: }
+CHECK-NEXT: VFTable (0x10F2) {
+CHECK-NEXT: TypeLeafKind: LF_VFTABLE (0x151D)
+CHECK-NEXT: CompleteClass: C
+CHECK-NEXT: OverriddenVFTable: ??_7B@@6B@ (0x10F1)
+CHECK-NEXT: VFPtrOffset: 0x0
+CHECK-NEXT: VFTableName: ??_7C@@6B@
+CHECK-NEXT: MethodName: ?f@C@@UEAAXXZ
+CHECK-NEXT: MethodName: ?g@C@@UEAAXXZ
+CHECK-NEXT: MethodName: ?h@C@@UEAAXXZ
+CHECK-NEXT: }
diff --git a/test/tools/llvm-readobj/coff-debug-directory.test b/test/tools/llvm-readobj/coff-debug-directory.test
new file mode 100644
index 0000000000000..f5c31c77abfe7
--- /dev/null
+++ b/test/tools/llvm-readobj/coff-debug-directory.test
@@ -0,0 +1,34 @@
+RUN: llvm-readobj -coff-debug-directory %p/Inputs/has_pdb.exe | FileCheck %s
+
+CHECK: DebugDirectory [
+CHECK: DebugEntry {
+CHECK: Characteristics: 0x0
+CHECK: TimeDateStamp: 2016-06-01 22:53:16 (0x574F675C)
+CHECK: MajorVersion: 0x0
+CHECK: MinorVersion: 0x0
+CHECK: Type: CodeView (0x2)
+CHECK: SizeOfData: 0x36
+CHECK: AddressOfRawData: 0x5B068
+CHECK: PointerToRawData: 0x5A268
+CHECK: PDBInfo {
+CHECK: PDBSignature: 0x53445352
+CHECK: PDBGUID: (96 83 40 42 81 07 9D 40 90 1B 4A 3C 0D 4F 56 32)
+CHECK: PDBAge: 3
+CHECK: PDBFileName: D:\src\llvm\build\has_pdb.pdb
+CHECK: }
+CHECK: }
+CHECK: DebugEntry {
+CHECK: Characteristics: 0x0
+CHECK: TimeDateStamp: 2016-06-01 22:53:16 (0x574F675C)
+CHECK: MajorVersion: 0x0
+CHECK: MinorVersion: 0x0
+CHECK: Type: VCFeature (0xC)
+CHECK: SizeOfData: 0x14
+CHECK: AddressOfRawData: 0x5B0A0
+CHECK: PointerToRawData: 0x5A2A0
+CHECK: RawData (
+CHECK: 0000: 00000000 C1000000 C1000000 00000000 |................|
+CHECK: 0010: C0000000 |....|
+CHECK: )
+CHECK: }
+CHECK: ]
diff --git a/test/tools/llvm-readobj/dynamic.test b/test/tools/llvm-readobj/dynamic.test
index 08f29fcd40a91..b905742e35f51 100644
--- a/test/tools/llvm-readobj/dynamic.test
+++ b/test/tools/llvm-readobj/dynamic.test
@@ -111,3 +111,40 @@ ELF-X86-EXE: 0x6FFFFFF0 VERSYM 0x4C0
ELF-X86-EXE: 0x6FFFFFFA RELCOUNT 6
ELF-X86-EXE: 0x00000000 NULL 0x0
ELF-X86-EXE: ]
+
+RUN: llvm-readobj -dynamic-table %p/Inputs/dynamic-table-so.aarch64 \
+RUN: | FileCheck %s -check-prefix ELF-AARCH64-SO
+
+ELF-AARCH64-SO: Format: ELF64-aarch64-little
+ELF-AARCH64-SO: Arch: aarch64
+ELF-AARCH64-SO: AddressSize: 64bit
+ELF-AARCH64-SO: LoadName:
+ELF-AARCH64-SO: DynamicSection [ (26 entries)
+ELF-AARCH64-SO: Tag Type Name/Value
+ELF-AARCH64-SO: 0x0000000000000001 NEEDED SharedLibrary (libc.so.6)
+ELF-AARCH64-SO: 0x000000000000000C INIT 0x660
+ELF-AARCH64-SO: 0x000000000000000D FINI 0x83C
+ELF-AARCH64-SO: 0x0000000000000019 INIT_ARRAY 0x10DB8
+ELF-AARCH64-SO: 0x000000000000001B INIT_ARRAYSZ 8 (bytes)
+ELF-AARCH64-SO: 0x000000000000001A FINI_ARRAY 0x10DC0
+ELF-AARCH64-SO: 0x000000000000001C FINI_ARRAYSZ 8 (bytes)
+ELF-AARCH64-SO: 0x000000006FFFFEF5 GNU_HASH 0x1F0
+ELF-AARCH64-SO: 0x0000000000000005 STRTAB 0x420
+ELF-AARCH64-SO: 0x0000000000000006 SYMTAB 0x240
+ELF-AARCH64-SO: 0x000000000000000A STRSZ 210 (bytes)
+ELF-AARCH64-SO: 0x000000000000000B SYMENT 24 (bytes)
+ELF-AARCH64-SO: 0x0000000000000003 PLTGOT 0x10FE8
+ELF-AARCH64-SO: 0x0000000000000002 PLTRELSZ 96 (bytes)
+ELF-AARCH64-SO: 0x0000000000000014 PLTREL RELA
+ELF-AARCH64-SO: 0x0000000000000017 JMPREL 0x600
+ELF-AARCH64-SO: 0x000000006FFFFEF6 TLSDESC_PLT 0x6D0
+ELF-AARCH64-SO: 0x000000006FFFFEF7 TLSDESC_GOT 0x10FE0
+ELF-AARCH64-SO: 0x0000000000000007 RELA 0x540
+ELF-AARCH64-SO: 0x0000000000000008 RELASZ 192 (bytes)
+ELF-AARCH64-SO: 0x0000000000000009 RELAENT 24 (bytes)
+ELF-AARCH64-SO: 0x000000006FFFFFFE VERNEED 0x520
+ELF-AARCH64-SO: 0x000000006FFFFFFF VERNEEDNUM 1
+ELF-AARCH64-SO: 0x000000006FFFFFF0 VERSYM 0x4F2
+ELF-AARCH64-SO: 0x000000006FFFFFF9 RELACOUNT 3
+ELF-AARCH64-SO: 0x0000000000000000 NULL 0x0
+ELF-AARCH64-SO: ]
diff --git a/test/tools/llvm-readobj/elf-groups.test b/test/tools/llvm-readobj/elf-groups.test
new file mode 100644
index 0000000000000..cf2779765b55c
--- /dev/null
+++ b/test/tools/llvm-readobj/elf-groups.test
@@ -0,0 +1,52 @@
+# Source file compiled:
+##include <iostream>
+# #include <typeinfo>
+#template <class A>
+#void foo(A variable) {
+# std::cout << "foo is " << typeid(A).name() << "\n";
+#}
+#int main () {
+# char x = 'x';
+# int y = 1;
+# foo(x);
+# foo(y);
+# return 0;
+#}
+
+RUN: llvm-readobj -g %p/Inputs/elf-groups.x86_64 \
+RUN: | FileCheck %s
+RUN: llvm-readobj -g -elf-output-style=GNU %p/Inputs/elf-groups.x86_64 \
+RUN: | FileCheck --check-prefix="GNU" %s
+CHECK: Groups {
+CHECK-NEXT: Group {
+CHECK-NEXT: Name: .group (92)
+CHECK-NEXT: Index: 1
+CHECK-NEXT: Type: COMDAT (0x1)
+CHECK-NEXT: Signature: _Z3fooIcEvT_
+CHECK-NEXT: Section(s) in group [
+CHECK-NEXT: .text._Z3fooIcEvT_ (10)
+CHECK-NEXT: .rela.text._Z3fooIcEvT_ (11)
+CHECK-NEXT: ]
+CHECK-NEXT: }
+CHECK-NEXT: Group {
+CHECK-NEXT: Name: .group (92)
+CHECK-NEXT: Index: 2
+CHECK-NEXT: Type: COMDAT (0x1)
+CHECK-NEXT: Signature: _Z3fooIiEvT_
+CHECK-NEXT: Section(s) in group [
+CHECK-NEXT: .text._Z3fooIiEvT_ (12)
+CHECK-NEXT: .rela.text._Z3fooIiEvT_ (13)
+CHECK-NEXT: ]
+CHECK-NEXT: }
+
+GNU:COMDAT group section [ 1] `.group' [_Z3fooIcEvT_] contains 2 sections:
+GNU-NEXT: [Index] Name
+GNU-NEXT: [ 10] .text._Z3fooIcEvT_
+GNU-NEXT: [ 11] .rela.text._Z3fooIcEvT_
+GNU:COMDAT group section [ 2] `.group' [_Z3fooIiEvT_] contains 2 sections:
+GNU-NEXT: [Index] Name
+GNU-NEXT: [ 12] .text._Z3fooIiEvT_
+GNU-NEXT: [ 13] .rela.text._Z3fooIiEvT_
+GNU:COMDAT group section [ 3] `.group' [_ZNKSt9type_info4nameEv] contains 1 sections:
+GNU-NEXT: [Index] Name
+GNU-NEXT: [ 14] .text._ZNKSt9type_info4nameEv
diff --git a/test/tools/llvm-readobj/elf-hash-histogram.test b/test/tools/llvm-readobj/elf-hash-histogram.test
new file mode 100644
index 0000000000000..b7ddfabacaadb
--- /dev/null
+++ b/test/tools/llvm-readobj/elf-hash-histogram.test
@@ -0,0 +1,27 @@
+RUN: llvm-readobj -elf-hash-histogram %p/Inputs/gnuhash.so.elf-ppc64 \
+RUN: --elf-output-style=GNU | FileCheck %s -check-prefix PPC64GNU
+RUN: llvm-readobj -elf-hash-histogram %p/Inputs/gnuhash.so.elf-x86_64 --elf-output-style=GNU \
+RUN: | FileCheck %s -check-prefix X86GNU
+RUN: llvm-readobj -elf-hash-histogram %p/Inputs/got-plt.exe.elf-mipsel --elf-output-style=GNU \
+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%
diff --git a/test/tools/llvm-readobj/elf-sec-compressed.test b/test/tools/llvm-readobj/elf-sec-compressed.test
new file mode 100644
index 0000000000000..baf0c687a9134
--- /dev/null
+++ b/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/test/tools/llvm-readobj/elf-sec-flags.test b/test/tools/llvm-readobj/elf-sec-flags.test
new file mode 100644
index 0000000000000..842ded3e9e59e
--- /dev/null
+++ b/test/tools/llvm-readobj/elf-sec-flags.test
@@ -0,0 +1,90 @@
+# Check that llvm-readobj shows arch specific ELF section flags.
+
+# RUN: yaml2obj -docnum 1 %s > %t-amdgpu.o
+# RUN: llvm-readobj -s %t-amdgpu.o | FileCheck -check-prefix=AMD %s
+
+# AMD: Flags [ (0x300000)
+# AMD-NEXT: SHF_AMDGPU_HSA_GLOBAL (0x100000)
+# AMD-NEXT: SHF_AMDGPU_HSA_READONLY (0x200000)
+# AMD-NEXT: ]
+
+# amdgpu.o
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_AMDGPU
+ Flags: []
+Sections:
+ - Name: .amdgpu
+ Type: SHT_PROGBITS
+ Flags: [SHF_AMDGPU_HSA_GLOBAL, SHF_AMDGPU_HSA_READONLY]
+ Size: 4
+
+# RUN: yaml2obj -docnum 2 %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 3 %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 4 %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/test/tools/llvm-readobj/elf-versioninfo.test b/test/tools/llvm-readobj/elf-versioninfo.test
index e8113e4b2fed3..919120e2caa93 100644
--- a/test/tools/llvm-readobj/elf-versioninfo.test
+++ b/test/tools/llvm-readobj/elf-versioninfo.test
@@ -47,35 +47,60 @@ CHECK-NEXT: }
CHECK-NEXT: ]
CHECK-NEXT: }
-CHECK: Version definition {
-CHECK-NEXT: Section Name: .gnu.version_d (70)
-CHECK-NEXT: Address: 0x25C
-CHECK-NEXT: Offset: 0x25C
-CHECK-NEXT: Link: 2
-CHECK-NEXT: Entries [
-CHECK-NEXT: Entry {
-CHECK-NEXT: Offset: 0x0
-CHECK-NEXT: Rev: 1
-CHECK-NEXT: Flags: 1
-CHECK-NEXT: Index: 1
-CHECK-NEXT: Cnt: 1
-CHECK-NEXT: Name: blah
-CHECK-NEXT: }
-CHECK-NEXT: Entry {
-CHECK-NEXT: Offset: 0x1C
-CHECK-NEXT: Rev: 1
-CHECK-NEXT: Flags: 0
-CHECK-NEXT: Index: 2
-CHECK-NEXT: Cnt: 1
-CHECK-NEXT: Name: VERSION1
-CHECK-NEXT: }
-CHECK-NEXT: Entry {
-CHECK-NEXT: Offset: 0x38
-CHECK-NEXT: Rev: 1
-CHECK-NEXT: Flags: 0
-CHECK-NEXT: Index: 3
-CHECK-NEXT: Cnt: 2
-CHECK-NEXT: Name: VERSION2
-CHECK-NEXT: }
-CHECK-NEXT: ]
+CHECK: SHT_GNU_verdef {
+CHECK-NEXT: Definition {
+CHECK-NEXT: Version: 1
+CHECK-NEXT: Flags: Base (0x1)
+CHECK-NEXT: Index: 1
+CHECK-NEXT: Hash: 430712
+CHECK-NEXT: Name: blah
+CHECK-NEXT: }
+CHECK-NEXT: Definition {
+CHECK-NEXT: Version: 1
+CHECK-NEXT: Flags: 0x0
+CHECK-NEXT: Index: 2
+CHECK-NEXT: Hash: 175630257
+CHECK-NEXT: Name: VERSION1
+CHECK-NEXT: }
+CHECK-NEXT: Definition {
+CHECK-NEXT: Version: 1
+CHECK-NEXT: Flags: 0x0
+CHECK-NEXT: Index: 3
+CHECK-NEXT: Hash: 175630258
+CHECK-NEXT: Name: VERSION2
+CHECK-NEXT: Predecessor: VERSION1
+CHECK-NEXT: }
CHECK-NEXT: }
+
+RUN: llvm-readobj -V %p/Inputs/verneed.elf-x86-64 | FileCheck %s --check-prefix=VERNEED
+
+VERNEED: SHT_GNU_verneed {
+VERNEED-NEXT: Dependency {
+VERNEED-NEXT: Version: 1
+VERNEED-NEXT: Count: 2
+VERNEED-NEXT: FileName: verneed1.so.0
+VERNEED-NEXT: Entry {
+VERNEED-NEXT: Hash: 1938
+VERNEED-NEXT: Flags: 0x0
+VERNEED-NEXT: Index: 3
+VERNEED-NEXT: Name: v2
+VERNEED-NEXT: }
+VERNEED-NEXT: Entry {
+VERNEED-NEXT: Hash: 1939
+VERNEED-NEXT: Flags: 0x0
+VERNEED-NEXT: Index: 2
+VERNEED-NEXT: Name: v3
+VERNEED-NEXT: }
+VERNEED-NEXT: }
+VERNEED-NEXT: Dependency {
+VERNEED-NEXT: Version: 1
+VERNEED-NEXT: Count: 1
+VERNEED-NEXT: FileName: verneed2.so.0
+VERNEED-NEXT: Entry {
+VERNEED-NEXT: Hash: 1937
+VERNEED-NEXT: Flags: 0x0
+VERNEED-NEXT: Index: 4
+VERNEED-NEXT: Name: v1
+VERNEED-NEXT: }
+VERNEED-NEXT: }
+VERNEED-NEXT: }
diff --git a/test/tools/llvm-readobj/file-headers.test b/test/tools/llvm-readobj/file-headers.test
index 2d67089d6118d..662c9b6bd4d7b 100644
--- a/test/tools/llvm-readobj/file-headers.test
+++ b/test/tools/llvm-readobj/file-headers.test
@@ -24,6 +24,8 @@ RUN: llvm-readobj -h %p/Inputs/magic.coff-unknown \
RUN: | FileCheck %s -check-prefix COFF-UNKNOWN
RUN: llvm-readobj -h %p/Inputs/magic.coff-importlib \
RUN: | FileCheck %s -check-prefix COFF-IMPORTLIB
+RUN: llvm-readobj -h %p/Inputs/trivial.obj.elf-lanai \
+RUN: | FileCheck %s -check-prefix ELF-LANAI
COFF-ARM: File: {{(.*[/\\])?}}trivial.obj.coff-arm
COFF-ARM-NEXT: Format: COFF-ARM
@@ -335,3 +337,33 @@ COFF-IMPORTLIB-NEXT: Type: code
COFF-IMPORTLIB-NEXT: Name type: noprefix
COFF-IMPORTLIB-NEXT: Symbol: __imp__func
COFF-IMPORTLIB-NEXT: Symbol: _func
+
+ELF-LANAI: Format: ELF32-lanai
+ELF-LANAI-NEXT: Arch: lanai
+ELF-LANAI-NEXT: AddressSize: 32bit
+ELF-LANAI-NEXT: LoadName:
+ELF-LANAI-NEXT: ElfHeader {
+ELF-LANAI-NEXT: Ident {
+ELF-LANAI-NEXT: Magic: (7F 45 4C 46)
+ELF-LANAI-NEXT: Class: 32-bit (0x1)
+ELF-LANAI-NEXT: DataEncoding: BigEndian (0x2)
+ELF-LANAI-NEXT: FileVersion: 1
+ELF-LANAI-NEXT: OS/ABI: SystemV (0x0)
+ELF-LANAI-NEXT: ABIVersion: 0
+ELF-LANAI-NEXT: Unused: (00 00 00 00 00 00 00)
+ELF-LANAI-NEXT: }
+ELF-LANAI-NEXT: Type: Relocatable (0x1)
+ELF-LANAI-NEXT: Machine: EM_LANAI (0xF4)
+ELF-LANAI-NEXT: Version: 1
+ELF-LANAI-NEXT: Entry: 0x0
+ELF-LANAI-NEXT: ProgramHeaderOffset: 0x0
+ELF-LANAI-NEXT: SectionHeaderOffset: 0x1A0
+ELF-LANAI-NEXT: Flags [ (0x0)
+ELF-LANAI-NEXT: ]
+ELF-LANAI-NEXT: HeaderSize: 52
+ELF-LANAI-NEXT: ProgramHeaderEntrySize: 0
+ELF-LANAI-NEXT: ProgramHeaderCount: 0
+ELF-LANAI-NEXT: SectionHeaderEntrySize: 40
+ELF-LANAI-NEXT: SectionHeaderCount: 8
+ELF-LANAI-NEXT: StringTableSectionIndex: 1
+ELF-LANAI-NEXT: }
diff --git a/test/tools/llvm-readobj/gnu-file-headers.test b/test/tools/llvm-readobj/gnu-file-headers.test
new file mode 100644
index 0000000000000..4b74d0948a3e5
--- /dev/null
+++ b/test/tools/llvm-readobj/gnu-file-headers.test
@@ -0,0 +1,46 @@
+RUN: llvm-readobj -h %p/Inputs/trivial.obj.elf-i386 --elf-output-style=GNU \
+RUN: | FileCheck %s -check-prefix ELF32
+RUN: llvm-readobj -h %p/Inputs/trivial.obj.elf-x86-64 --elf-output-style=GNU \
+RUN: | FileCheck %s -check-prefix ELF64
+
+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
diff --git a/test/tools/llvm-readobj/gnu-phdrs.test b/test/tools/llvm-readobj/gnu-phdrs.test
new file mode 100644
index 0000000000000..3054a5a70a2aa
--- /dev/null
+++ b/test/tools/llvm-readobj/gnu-phdrs.test
@@ -0,0 +1,78 @@
+#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-readobj -program-headers %p/Inputs/phdrs-elf.exe-i386 --elf-output-style=GNU \
+RUN: | FileCheck %s -check-prefix ELF32
+RUN: llvm-readobj -program-headers %p/Inputs/phdrs-elf.exe-x86_64 \
+RUN: --elf-output-style=GNU | FileCheck %s -check-prefix ELF64
+
+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
+
+ELF64: Elf file type is EXEC (Executable file)
+ELF64-NEXT: Entry point 0x400610
+ELF64-NEXT: There are 10 program headers, starting at offset 64
+
+ELF64: Program Headers:
+ELF64-NEXT: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
+ELF64-NEXT: PHDR 0x000040 0x0000000000400040 0x0000000000400040 0x000230 0x000230 R E 0x8
+ELF64-NEXT: INTERP 0x000270 0x0000000000400270 0x0000000000400270 0x00001c 0x00001c R 0x1
+ELF64-NEXT: [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
+ELF64-NEXT: LOAD 0x000000 0x0000000000400000 0x0000000000400000 0x000924 0x000924 R E 0x200000
+ELF64-NEXT: LOAD 0x000db4 0x0000000000600db4 0x0000000000600db4 0x000274 0x0002a4 RW 0x200000
+ELF64-NEXT: DYNAMIC 0x000dd0 0x0000000000600dd0 0x0000000000600dd0 0x000210 0x000210 RW 0x8
+ELF64-NEXT: NOTE 0x00028c 0x000000000040028c 0x000000000040028c 0x000044 0x000044 R 0x4
+ELF64-NEXT: TLS 0x000db4 0x0000000000600db4 0x0000000000600db4 0x000004 0x000008 R 0x4
+ELF64-NEXT: GNU_EH_FRAME 0x00083c 0x000000000040083c 0x000000000040083c 0x00002c 0x00002c R 0x4
+ELF64-NEXT: GNU_STACK 0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 RW 0x8
+ELF64-NEXT: GNU_RELRO 0x000db4 0x0000000000600db4 0x0000000000600db4 0x00024c 0x00024c R 0x1
+
+ELF64: Section to Segment mapping:
+ELF64-NEXT: Segment Sections...
+ELF64-NEXT: 00
+ELF64-NEXT: 01 .interp
+ELF64-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-NEXT: 03 .tdata .init_array .fini_array .jcr .dynamic .got .got.plt .data .bss
+ELF64-NEXT: 04 .dynamic
+ELF64-NEXT: 05 .note.ABI-tag .note.gnu.build-id
+ELF64-NEXT: 06 .tdata .tbss
+ELF64-NEXT: 07 .eh_frame_hdr
+ELF64-NEXT: 08
+ELF64-NEXT: 09 .tdata .init_array .fini_array .jcr .dynamic .got
diff --git a/test/tools/llvm-readobj/gnu-relocations.test b/test/tools/llvm-readobj/gnu-relocations.test
new file mode 100644
index 0000000000000..5b269e06377f8
--- /dev/null
+++ b/test/tools/llvm-readobj/gnu-relocations.test
@@ -0,0 +1,28 @@
+RUN: llvm-readobj -r %p/Inputs/relocs.obj.elf-i386 --elf-output-style=GNU \
+RUN: | FileCheck %s -check-prefix ELF32
+RUN: llvm-readobj -r %p/Inputs/relocs.obj.elf-x86_64 --elf-output-style=GNU \
+RUN: | FileCheck %s -check-prefix ELF64
+
+ELF32: Relocation section '.rel.text' at offset 0x318 contains 41 entries:
+ELF32-NEXT: Offset Info Type Sym. Value Symbol's Name
+ELF32-NEXT: 00000002 00000500 R_386_NONE 00000000 sym
+ELF32-NEXT: 00000008 00000501 R_386_32 00000000 sym
+ELF32-NEXT: 0000000e 00000502 R_386_PC32 00000000 sym
+ELF32-NEXT: 00000014 00000503 R_386_GOT32 00000000 sym
+ELF32-NEXT: 0000001a 00000504 R_386_PLT32 00000000 sym
+ELF32-NEXT: 00000020 00000505 R_386_COPY 00000000 sym
+ELF32-NEXT: 00000026 00000506 R_386_GLOB_DAT 00000000 sym
+ELF32-NEXT: 0000002c 00000507 R_386_JUMP_SLOT 00000000 sym
+ELF32-NEXT: 00000032 00000508 R_386_RELATIVE 00000000 sym
+ELF32-NEXT: 00000038 00000509 R_386_GOTOFF 00000000 sym
+
+ELF64: Relocation section '.rela.text' at offset 0x430 contains 38 entries:
+ELF64-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend
+ELF64-NEXT: 0000000000000003 0000000500000000 R_X86_64_NONE 0000000000000000 sym - 4
+ELF64-NEXT: 000000000000000a 0000000500000001 R_X86_64_64 0000000000000000 sym - 4
+ELF64-NEXT: 0000000000000011 0000000500000002 R_X86_64_PC32 0000000000000000 sym - 4
+ELF64-NEXT: 0000000000000018 0000000500000003 R_X86_64_GOT32 0000000000000000 sym - 4
+ELF64-NEXT: 000000000000001f 0000000500000004 R_X86_64_PLT32 0000000000000000 sym - 4
+ELF64-NEXT: 0000000000000026 0000000500000005 R_X86_64_COPY 0000000000000000 sym - 4
+ELF64-NEXT: 000000000000002d 0000000500000006 R_X86_64_GLOB_DAT 0000000000000000 sym - 4
+ELF64-NEXT: 0000000000000034 0000000500000007 R_X86_64_JUMP_SLOT 0000000000000000 sym - 4
diff --git a/test/tools/llvm-readobj/gnu-sections.test b/test/tools/llvm-readobj/gnu-sections.test
new file mode 100644
index 0000000000000..fb90ce44d10f9
--- /dev/null
+++ b/test/tools/llvm-readobj/gnu-sections.test
@@ -0,0 +1,35 @@
+RUN: llvm-readobj -s %p/Inputs/relocs.obj.elf-i386 --elf-output-style=GNU \
+RUN: | FileCheck %s -check-prefix ELF32
+RUN: llvm-readobj -s %p/Inputs/relocs.obj.elf-x86_64 --elf-output-style=GNU \
+RUN: | FileCheck %s -check-prefix ELF64
+
+ELF32: 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 0000f6 00 AX 0 0 4
+ELF32-NEXT: [ 2] .rel.text REL 00000000 000318 000148 08 6 1 4
+ELF32-NEXT: [ 3] .data PROGBITS 00000000 00012c 000000 00 WA 0 0 4
+ELF32-NEXT: [ 4] .bss NOBITS 00000000 00012c 000000 00 WA 0 0 4
+ELF32-NEXT: [ 5] .shstrtab STRTAB 00000000 00012c 000030 00 0 0 1
+ELF32-NEXT: [ 6] .symtab SYMTAB 00000000 00029c 000060 10 7 4 4
+ELF32-NEXT: [ 7] .strtab STRTAB 00000000 0002fc 00001b 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)
+
+ELF64: There are 8 section headers, starting at offset 0x180:
+ELF64: 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 00010a 00 AX 0 0 4
+ELF64-NEXT: [ 2] .rela.text RELA 0000000000000000 000430 000390 18 6 1 8
+ELF64-NEXT: [ 3] .data PROGBITS 0000000000000000 00014c 000000 00 WA 0 0 4
+ELF64-NEXT: [ 4] .bss NOBITS 0000000000000000 00014c 000000 00 WA 0 0 4
+ELF64-NEXT: [ 5] .shstrtab STRTAB 0000000000000000 00014c 000031 00 0 0 1
+ELF64-NEXT: [ 6] .symtab SYMTAB 0000000000000000 000380 000090 18 7 4 8
+ELF64-NEXT: [ 7] .strtab STRTAB 0000000000000000 000410 00001b 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)
diff --git a/test/tools/llvm-readobj/gnu-symbols.test b/test/tools/llvm-readobj/gnu-symbols.test
new file mode 100644
index 0000000000000..aed38ef680bed
--- /dev/null
+++ b/test/tools/llvm-readobj/gnu-symbols.test
@@ -0,0 +1,46 @@
+RUN: llvm-readobj -symbols %p/Inputs/symbols-proc-specific.elf-hexagon \
+RUN: --elf-output-style=GNU | FileCheck %s -check-prefix ELF32
+RUN: llvm-readobj -symbols %p/Inputs/relocs.obj.elf-x86_64 --elf-output-style=GNU \
+RUN: | FileCheck %s -check-prefix ELF64
+RUN: llvm-readobj -symbols %p/Inputs/gnuhash.so.elf-x86_64 --elf-output-style=GNU \
+RUN: | FileCheck %s -check-prefix 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
+ELF64-NEXT: 2: 0000000000000000 0 SECTION LOCAL DEFAULT 3
+ELF64-NEXT: 3: 0000000000000000 0 SECTION LOCAL DEFAULT 4
+ELF64-NEXT: 4: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND _GLOBAL_OFFSET_TABLE_
+ELF64-NEXT: 5: 0000000000000000 0 TLS GLOBAL DEFAULT UND sym
+
+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: Symbol table '.symtab' contains 12 entries:
+DYN-NEXT: Num: Value Size Type Bind Vis Ndx Name
+DYN-NEXT: 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
+DYN-NEXT: 1: 00000000000000e8 0 SECTION LOCAL DEFAULT 1
+DYN-NEXT: 2: 0000000000000120 0 SECTION LOCAL DEFAULT 2
+DYN-NEXT: 3: 0000000000000198 0 SECTION LOCAL DEFAULT 3
+DYN-NEXT: 4: 00000000000001b8 0 SECTION LOCAL DEFAULT 4
+DYN-NEXT: 5: 00000000002001b8 0 SECTION LOCAL DEFAULT 5
+DYN-NEXT: 6: 00000000002001b8 0 OBJECT LOCAL DEFAULT 5 _DYNAMIC
+DYN-NEXT: 7: 0000000000200268 0 OBJECT LOCAL DEFAULT 5 _GLOBAL_OFFSET_TABLE_
+DYN-NEXT: 8: 0000000000200268 0 NOTYPE GLOBAL DEFAULT 5 __bss_start
+DYN-NEXT: 9: 00000000000001b8 0 NOTYPE GLOBAL DEFAULT 4 foo
+DYN-NEXT: 10: 0000000000200268 0 NOTYPE GLOBAL DEFAULT 5 _edata
+DYN-NEXT: 11: 0000000000200268 0 NOTYPE GLOBAL DEFAULT 5 _end
diff --git a/test/tools/llvm-readobj/mips-got-overlapped.test b/test/tools/llvm-readobj/mips-got-overlapped.test
new file mode 100644
index 0000000000000..ae4ae9532950e
--- /dev/null
+++ b/test/tools/llvm-readobj/mips-got-overlapped.test
@@ -0,0 +1,45 @@
+# Check that llvm-readobj -mips-plt-got 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 -mips-plt-got %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/test/tools/llvm-readobj/mips-options-sec.test b/test/tools/llvm-readobj/mips-options-sec.test
new file mode 100644
index 0000000000000..0fe8aad3dfa14
--- /dev/null
+++ b/test/tools/llvm-readobj/mips-options-sec.test
@@ -0,0 +1,12 @@
+RUN: llvm-readobj -mips-options %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/test/tools/llvm-readobj/mips-st-other.test b/test/tools/llvm-readobj/mips-st-other.test
new file mode 100644
index 0000000000000..1f9de58ca89c9
--- /dev/null
+++ b/test/tools/llvm-readobj/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/test/tools/llvm-readobj/reloc-types.test b/test/tools/llvm-readobj/reloc-types.test
index 36e2f7010bdff..74148c07015d0 100644
--- a/test/tools/llvm-readobj/reloc-types.test
+++ b/test/tools/llvm-readobj/reloc-types.test
@@ -7,6 +7,7 @@ RUN: llvm-readobj -r -expand-relocs %p/Inputs/relocs.obj.elf-i386 | FileChec
RUN: llvm-readobj -r -expand-relocs %p/Inputs/relocs.obj.elf-x86_64 | FileCheck %s -check-prefix ELF-64
RUN: llvm-readobj -r -expand-relocs %p/Inputs/relocs.obj.elf-aarch64 | FileCheck %s -check-prefix ELF-AARCH64
RUN: llvm-readobj -r -expand-relocs %p/Inputs/relocs.obj.elf-arm | FileCheck %s -check-prefix ELF-ARM
+RUN: llvm-readobj -r -expand-relocs %p/Inputs/relocs.obj.elf-lanai | FileCheck %s -check-prefix ELF-LANAI
RUN: llvm-readobj -r -expand-relocs %p/Inputs/relocs.obj.elf-mips | FileCheck %s -check-prefix ELF-MIPS
RUN: llvm-readobj -r -expand-relocs %p/Inputs/relocs.obj.elf-mips64el | FileCheck %s -check-prefix ELF-MIPS64EL
RUN: llvm-readobj -r -expand-relocs %p/Inputs/relocs.obj.elf-ppc64 | FileCheck %s -check-prefix ELF-PPC64
@@ -405,6 +406,14 @@ ELF-ARM: Type: R_ARM_THM_TLS_DESCSEQ16 (129)
ELF-ARM: Type: R_ARM_THM_TLS_DESCSEQ32 (130)
ELF-ARM: Type: R_ARM_IRELATIVE (160)
+ELF-LANAI: Type: R_LANAI_NONE (0)
+ELF-LANAI: Type: R_LANAI_21 (1)
+ELF-LANAI: Type: R_LANAI_21_F (2)
+ELF-LANAI: Type: R_LANAI_25 (3)
+ELF-LANAI: Type: R_LANAI_32 (4)
+ELF-LANAI: Type: R_LANAI_HI16 (5)
+ELF-LANAI: Type: R_LANAI_LO16 (6)
+
ELF-MIPS: Type: R_MIPS_NONE (0)
ELF-MIPS: Type: R_MIPS_16 (1)
ELF-MIPS: Type: R_MIPS_32 (2)