summaryrefslogtreecommitdiffstats
path: root/llvm/test/tools/llvm-readobj/COFF
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/test/tools/llvm-readobj/COFF')
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/aix_xcoff_xlc_test8.obin0 -> 1720 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/arm64-win1.objbin0 -> 2063 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/arm64-win2.objbin0 -> 956 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/bad-relocs.obj.coff-i386bin0 -> 97 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/basereloc.obj.coff-i386bin0 -> 2560 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/bigobj.coff-x86-64bin0 -> 340 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/codeview-cycle.objbin0 -> 1034 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/codeview-inlinees.objbin0 -> 2793 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/codeview-inlining.obj.coffbin0 -> 8396 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/codeview-label.objbin0 -> 830 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/codeview-merging-1.objbin0 -> 8515 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/codeview-merging-2.objbin0 -> 8507 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/codeview-merging-anon.objbin0 -> 1181 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/codeview-types.objbin0 -> 8746 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/codeview-unsorted.objbin0 -> 1058 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/codeview-vftable.obj.coffbin0 -> 20396 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/coff-load-config-data-end.exebin0 -> 1536 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/coff-load-config-x64.dllbin0 -> 9728 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/coff-load-config-x86.dllbin0 -> 8704 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/coff-no-load-config.exebin0 -> 1024 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/comdat-function-linetables.obj.coff-2012-i386bin0 -> 2005 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/comdat-function-linetables.obj.coff-2013-i386bin0 -> 8501 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/const-import.libbin0 -> 1200 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/cxx-cli-aux.cpp2
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/cxx-cli-aux.obj.coff-i386bin0 -> 2682 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/directives.obj.coff-x86_64bin0 -> 244 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/export-arm.dllbin0 -> 5632 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/export-x64.dllbin0 -> 6144 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/export-x86.dllbin0 -> 6144 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/has_pdb.exebin0 -> 391680 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/imports.exe.coff-i386bin0 -> 3072 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/imports.exe.coff-x86-64bin0 -> 4096 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/library.libbin0 -> 2166 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/magic.coff-importlibbin0 -> 40 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/multifile-linetables.obj.coff-2012-i368bin0 -> 1631 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/multifile-linetables.obj.coff-2012-x86_64bin0 -> 1799 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/multifile-linetables.obj.coff-2013-i368bin0 -> 1631 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/multifile-linetables.obj.coff-2013-x86_64bin0 -> 1795 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/multifunction-linetables.obj.coff-2012-i368bin0 -> 2155 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/multifunction-linetables.obj.coff-2012-x86_64bin0 -> 2475 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/multifunction-linetables.obj.coff-2013-i368bin0 -> 2155 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/multifunction-linetables.obj.coff-2013-x86_64bin0 -> 2471 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/needed-libs.obj.coff-am64bin0 -> 88576 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/nop.exe.coff-x86-64bin0 -> 1024 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/relocs-no-symtab.obj.coff-i386bin0 -> 97 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/resources/cursor_small.bmpbin0 -> 822 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/resources/okay_small.bmpbin0 -> 822 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/resources/test_resource.obj.coffbin0 -> 3200 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/resources/test_resource.rc44
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/resources/test_resource.resbin0 -> 2200 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/trivial.exe.coff-armbin0 -> 7680 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/trivial.obj.coff-armbin0 -> 367 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/trivial.obj.coff-i386bin0 -> 350 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/trivial.obj.coff-x86-64bin0 -> 319 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/xcoff-basic-64.obin0 -> 2541 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/xcoff-basic-neg-sym-count.obin0 -> 876 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/xcoff-basic-neg-time.obin0 -> 3567 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/xcoff-basic.obin0 -> 3567 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/xcoff-reloc-overflow.obin0 -> 558 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/Inputs/zero-string-table.obj.coff-i386bin0 -> 704 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/arm-baserelocs.test7
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/arm64-many-epilogs.s26
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/arm64-win-error1.s54
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/arm64-win-error2.s50
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/arm64-win-error3.s51
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/basereloc.test24
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/bigobj.test139
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/codeview-inlinees.test38
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/codeview-inlining.test65
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/codeview-label.test16
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/codeview-linetables.test586
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/codeview-merging-anon.test29
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/codeview-merging-cycle.test19
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/codeview-merging-ghash.test132
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/codeview-merging-unsorted.test40
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/codeview-merging.test113
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/codeview-types.test95
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/codeview-vftable.test48
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/const-import.test7
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/cxx-cli-aux.test40
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/debug-directory.test34
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/directives.test2
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/exports-implib.test26
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/exports.test11
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/file-headers.test321
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/file-sections-reading.test39
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/imports.test88
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/load-config.test98
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/needed-libs.test5
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/non-null-terminated-file.test41
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/peplus.test84
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/reloc-types-coff-i386.test63
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/reloc-types-coff-x64.test81
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/reloc_overflow.test80
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/res-resources.test163
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/resources.test210
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/unwind-arm64-windows.test69
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/xcoff-basic.test160
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/xcoff-overflow-section.test47
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/xcoff-sections.test164
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/xcoff-symbols.test446
-rw-r--r--llvm/test/tools/llvm-readobj/COFF/zero-string-table.test8
102 files changed, 3865 insertions, 0 deletions
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/aix_xcoff_xlc_test8.o b/llvm/test/tools/llvm-readobj/COFF/Inputs/aix_xcoff_xlc_test8.o
new file mode 100644
index 00000000000..ab438d6b44b
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/aix_xcoff_xlc_test8.o
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/arm64-win1.obj b/llvm/test/tools/llvm-readobj/COFF/Inputs/arm64-win1.obj
new file mode 100644
index 00000000000..025e1db6cce
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/arm64-win1.obj
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/arm64-win2.obj b/llvm/test/tools/llvm-readobj/COFF/Inputs/arm64-win2.obj
new file mode 100644
index 00000000000..7e506eedda6
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/arm64-win2.obj
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/bad-relocs.obj.coff-i386 b/llvm/test/tools/llvm-readobj/COFF/Inputs/bad-relocs.obj.coff-i386
new file mode 100644
index 00000000000..06ec4718da1
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/bad-relocs.obj.coff-i386
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/basereloc.obj.coff-i386 b/llvm/test/tools/llvm-readobj/COFF/Inputs/basereloc.obj.coff-i386
new file mode 100644
index 00000000000..0aeed443e33
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/basereloc.obj.coff-i386
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/bigobj.coff-x86-64 b/llvm/test/tools/llvm-readobj/COFF/Inputs/bigobj.coff-x86-64
new file mode 100644
index 00000000000..fdfda5e5713
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/bigobj.coff-x86-64
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/codeview-cycle.obj b/llvm/test/tools/llvm-readobj/COFF/Inputs/codeview-cycle.obj
new file mode 100644
index 00000000000..85c2d0e55fe
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/codeview-cycle.obj
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/codeview-inlinees.obj b/llvm/test/tools/llvm-readobj/COFF/Inputs/codeview-inlinees.obj
new file mode 100644
index 00000000000..297fdcad0e1
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/codeview-inlinees.obj
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/codeview-inlining.obj.coff b/llvm/test/tools/llvm-readobj/COFF/Inputs/codeview-inlining.obj.coff
new file mode 100644
index 00000000000..782e991c3bc
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/codeview-inlining.obj.coff
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/codeview-label.obj b/llvm/test/tools/llvm-readobj/COFF/Inputs/codeview-label.obj
new file mode 100644
index 00000000000..ae49a061bb7
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/codeview-label.obj
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/codeview-merging-1.obj b/llvm/test/tools/llvm-readobj/COFF/Inputs/codeview-merging-1.obj
new file mode 100644
index 00000000000..e51643a136d
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/codeview-merging-1.obj
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/codeview-merging-2.obj b/llvm/test/tools/llvm-readobj/COFF/Inputs/codeview-merging-2.obj
new file mode 100644
index 00000000000..4cf24257dee
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/codeview-merging-2.obj
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/codeview-merging-anon.obj b/llvm/test/tools/llvm-readobj/COFF/Inputs/codeview-merging-anon.obj
new file mode 100644
index 00000000000..3cb58fbd4d5
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/codeview-merging-anon.obj
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/codeview-types.obj b/llvm/test/tools/llvm-readobj/COFF/Inputs/codeview-types.obj
new file mode 100644
index 00000000000..b00a7c6a3e1
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/codeview-types.obj
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/codeview-unsorted.obj b/llvm/test/tools/llvm-readobj/COFF/Inputs/codeview-unsorted.obj
new file mode 100644
index 00000000000..08a376de3b9
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/codeview-unsorted.obj
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/codeview-vftable.obj.coff b/llvm/test/tools/llvm-readobj/COFF/Inputs/codeview-vftable.obj.coff
new file mode 100644
index 00000000000..388a7212eb2
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/codeview-vftable.obj.coff
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/coff-load-config-data-end.exe b/llvm/test/tools/llvm-readobj/COFF/Inputs/coff-load-config-data-end.exe
new file mode 100644
index 00000000000..9ec69426298
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/coff-load-config-data-end.exe
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/coff-load-config-x64.dll b/llvm/test/tools/llvm-readobj/COFF/Inputs/coff-load-config-x64.dll
new file mode 100644
index 00000000000..26101f93c41
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/coff-load-config-x64.dll
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/coff-load-config-x86.dll b/llvm/test/tools/llvm-readobj/COFF/Inputs/coff-load-config-x86.dll
new file mode 100644
index 00000000000..c334c7be721
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/coff-load-config-x86.dll
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/coff-no-load-config.exe b/llvm/test/tools/llvm-readobj/COFF/Inputs/coff-no-load-config.exe
new file mode 100644
index 00000000000..cd6eb5a2b2b
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/coff-no-load-config.exe
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/comdat-function-linetables.obj.coff-2012-i386 b/llvm/test/tools/llvm-readobj/COFF/Inputs/comdat-function-linetables.obj.coff-2012-i386
new file mode 100644
index 00000000000..4a723044801
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/comdat-function-linetables.obj.coff-2012-i386
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/comdat-function-linetables.obj.coff-2013-i386 b/llvm/test/tools/llvm-readobj/COFF/Inputs/comdat-function-linetables.obj.coff-2013-i386
new file mode 100644
index 00000000000..4adaf2edc6f
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/comdat-function-linetables.obj.coff-2013-i386
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/const-import.lib b/llvm/test/tools/llvm-readobj/COFF/Inputs/const-import.lib
new file mode 100644
index 00000000000..88a2ac3f836
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/const-import.lib
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/cxx-cli-aux.cpp b/llvm/test/tools/llvm-readobj/COFF/Inputs/cxx-cli-aux.cpp
new file mode 100644
index 00000000000..6386cb2e015
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/cxx-cli-aux.cpp
@@ -0,0 +1,2 @@
+// cl.exe -clr -c t.cpp -Fo"cxx-cli-aux.obj.coff-i386"
+__declspec(appdomain) int PerAppDomain = 0;
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/cxx-cli-aux.obj.coff-i386 b/llvm/test/tools/llvm-readobj/COFF/Inputs/cxx-cli-aux.obj.coff-i386
new file mode 100644
index 00000000000..a88c670643a
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/cxx-cli-aux.obj.coff-i386
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/directives.obj.coff-x86_64 b/llvm/test/tools/llvm-readobj/COFF/Inputs/directives.obj.coff-x86_64
new file mode 100644
index 00000000000..4c156dcbb03
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/directives.obj.coff-x86_64
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/export-arm.dll b/llvm/test/tools/llvm-readobj/COFF/Inputs/export-arm.dll
new file mode 100644
index 00000000000..a5555628afc
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/export-arm.dll
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/export-x64.dll b/llvm/test/tools/llvm-readobj/COFF/Inputs/export-x64.dll
new file mode 100644
index 00000000000..10b14e8fff9
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/export-x64.dll
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/export-x86.dll b/llvm/test/tools/llvm-readobj/COFF/Inputs/export-x86.dll
new file mode 100644
index 00000000000..9efcd3131fe
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/export-x86.dll
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/has_pdb.exe b/llvm/test/tools/llvm-readobj/COFF/Inputs/has_pdb.exe
new file mode 100644
index 00000000000..60cc9f59fc1
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/has_pdb.exe
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/imports.exe.coff-i386 b/llvm/test/tools/llvm-readobj/COFF/Inputs/imports.exe.coff-i386
new file mode 100644
index 00000000000..72077adaebe
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/imports.exe.coff-i386
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/imports.exe.coff-x86-64 b/llvm/test/tools/llvm-readobj/COFF/Inputs/imports.exe.coff-x86-64
new file mode 100644
index 00000000000..5ee198e4a2e
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/imports.exe.coff-x86-64
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/library.lib b/llvm/test/tools/llvm-readobj/COFF/Inputs/library.lib
new file mode 100644
index 00000000000..7ad7c9052ea
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/library.lib
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/magic.coff-importlib b/llvm/test/tools/llvm-readobj/COFF/Inputs/magic.coff-importlib
new file mode 100644
index 00000000000..b934afb41a8
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/magic.coff-importlib
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/multifile-linetables.obj.coff-2012-i368 b/llvm/test/tools/llvm-readobj/COFF/Inputs/multifile-linetables.obj.coff-2012-i368
new file mode 100644
index 00000000000..213331f604e
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/multifile-linetables.obj.coff-2012-i368
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/multifile-linetables.obj.coff-2012-x86_64 b/llvm/test/tools/llvm-readobj/COFF/Inputs/multifile-linetables.obj.coff-2012-x86_64
new file mode 100644
index 00000000000..a35cc11c2eb
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/multifile-linetables.obj.coff-2012-x86_64
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/multifile-linetables.obj.coff-2013-i368 b/llvm/test/tools/llvm-readobj/COFF/Inputs/multifile-linetables.obj.coff-2013-i368
new file mode 100644
index 00000000000..8a901f64af8
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/multifile-linetables.obj.coff-2013-i368
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/multifile-linetables.obj.coff-2013-x86_64 b/llvm/test/tools/llvm-readobj/COFF/Inputs/multifile-linetables.obj.coff-2013-x86_64
new file mode 100644
index 00000000000..f1c2e1f25e7
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/multifile-linetables.obj.coff-2013-x86_64
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/multifunction-linetables.obj.coff-2012-i368 b/llvm/test/tools/llvm-readobj/COFF/Inputs/multifunction-linetables.obj.coff-2012-i368
new file mode 100644
index 00000000000..41479edc711
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/multifunction-linetables.obj.coff-2012-i368
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/multifunction-linetables.obj.coff-2012-x86_64 b/llvm/test/tools/llvm-readobj/COFF/Inputs/multifunction-linetables.obj.coff-2012-x86_64
new file mode 100644
index 00000000000..8d30f325d70
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/multifunction-linetables.obj.coff-2012-x86_64
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/multifunction-linetables.obj.coff-2013-i368 b/llvm/test/tools/llvm-readobj/COFF/Inputs/multifunction-linetables.obj.coff-2013-i368
new file mode 100644
index 00000000000..4269b214546
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/multifunction-linetables.obj.coff-2013-i368
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/multifunction-linetables.obj.coff-2013-x86_64 b/llvm/test/tools/llvm-readobj/COFF/Inputs/multifunction-linetables.obj.coff-2013-x86_64
new file mode 100644
index 00000000000..65a1af061c8
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/multifunction-linetables.obj.coff-2013-x86_64
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/needed-libs.obj.coff-am64 b/llvm/test/tools/llvm-readobj/COFF/Inputs/needed-libs.obj.coff-am64
new file mode 100644
index 00000000000..4cfc6e25396
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/needed-libs.obj.coff-am64
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/nop.exe.coff-x86-64 b/llvm/test/tools/llvm-readobj/COFF/Inputs/nop.exe.coff-x86-64
new file mode 100644
index 00000000000..62b3b46c369
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/nop.exe.coff-x86-64
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/relocs-no-symtab.obj.coff-i386 b/llvm/test/tools/llvm-readobj/COFF/Inputs/relocs-no-symtab.obj.coff-i386
new file mode 100644
index 00000000000..5882daf4c59
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/relocs-no-symtab.obj.coff-i386
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/resources/cursor_small.bmp b/llvm/test/tools/llvm-readobj/COFF/Inputs/resources/cursor_small.bmp
new file mode 100644
index 00000000000..ce513261bc2
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/resources/cursor_small.bmp
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/resources/okay_small.bmp b/llvm/test/tools/llvm-readobj/COFF/Inputs/resources/okay_small.bmp
new file mode 100644
index 00000000000..e4005bf5ef9
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/resources/okay_small.bmp
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/resources/test_resource.obj.coff b/llvm/test/tools/llvm-readobj/COFF/Inputs/resources/test_resource.obj.coff
new file mode 100644
index 00000000000..b9a7908b1c5
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/resources/test_resource.obj.coff
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/resources/test_resource.rc b/llvm/test/tools/llvm-readobj/COFF/Inputs/resources/test_resource.rc
new file mode 100644
index 00000000000..fd616520dbe
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/resources/test_resource.rc
@@ -0,0 +1,44 @@
+#include "windows.h"
+
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+
+myaccelerators ACCELERATORS
+{
+ "^C", 999, VIRTKEY, ALT
+ "D", 1100, VIRTKEY, CONTROL, SHIFT
+ "^R", 444, ASCII, NOINVERT
+}
+
+cursor BITMAP "cursor_small.bmp"
+okay BITMAP "okay_small.bmp"
+
+14432 MENU
+LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
+{
+ MENUITEM "yu", 100
+ MENUITEM "shala", 101
+ MENUITEM "kaoya", 102
+}
+
+testdialog DIALOG 10, 10, 200, 300
+STYLE WS_POPUP | WS_BORDER
+CAPTION "Test"
+{
+ CTEXT "Continue:", 1, 10, 10, 230, 14
+ PUSHBUTTON "&OK", 2, 66, 134, 161, 13
+}
+
+12 ACCELERATORS
+{
+ "X", 164, VIRTKEY, ALT
+ "H", 5678, VIRTKEY, CONTROL, SHIFT
+ "^R", 444, ASCII, NOINVERT
+}
+
+"eat" MENU
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_AUS
+{
+ MENUITEM "fish", 100
+ MENUITEM "salad", 101
+ MENUITEM "duck", 102
+}
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/resources/test_resource.res b/llvm/test/tools/llvm-readobj/COFF/Inputs/resources/test_resource.res
new file mode 100644
index 00000000000..c577ecc3d63
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/resources/test_resource.res
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/trivial.exe.coff-arm b/llvm/test/tools/llvm-readobj/COFF/Inputs/trivial.exe.coff-arm
new file mode 100644
index 00000000000..121d820b6b0
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/trivial.exe.coff-arm
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/trivial.obj.coff-arm b/llvm/test/tools/llvm-readobj/COFF/Inputs/trivial.obj.coff-arm
new file mode 100644
index 00000000000..e3b5df4c778
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/trivial.obj.coff-arm
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/trivial.obj.coff-i386 b/llvm/test/tools/llvm-readobj/COFF/Inputs/trivial.obj.coff-i386
new file mode 100644
index 00000000000..7486562c978
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/trivial.obj.coff-i386
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/trivial.obj.coff-x86-64 b/llvm/test/tools/llvm-readobj/COFF/Inputs/trivial.obj.coff-x86-64
new file mode 100644
index 00000000000..8a7060e6107
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/trivial.obj.coff-x86-64
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/xcoff-basic-64.o b/llvm/test/tools/llvm-readobj/COFF/Inputs/xcoff-basic-64.o
new file mode 100644
index 00000000000..d6c79abd8cf
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/xcoff-basic-64.o
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/xcoff-basic-neg-sym-count.o b/llvm/test/tools/llvm-readobj/COFF/Inputs/xcoff-basic-neg-sym-count.o
new file mode 100644
index 00000000000..e7f63664acd
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/xcoff-basic-neg-sym-count.o
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/xcoff-basic-neg-time.o b/llvm/test/tools/llvm-readobj/COFF/Inputs/xcoff-basic-neg-time.o
new file mode 100644
index 00000000000..f814965f4f0
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/xcoff-basic-neg-time.o
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/xcoff-basic.o b/llvm/test/tools/llvm-readobj/COFF/Inputs/xcoff-basic.o
new file mode 100644
index 00000000000..c84056bdb00
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/xcoff-basic.o
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/xcoff-reloc-overflow.o b/llvm/test/tools/llvm-readobj/COFF/Inputs/xcoff-reloc-overflow.o
new file mode 100644
index 00000000000..16f058a2986
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/xcoff-reloc-overflow.o
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/Inputs/zero-string-table.obj.coff-i386 b/llvm/test/tools/llvm-readobj/COFF/Inputs/zero-string-table.obj.coff-i386
new file mode 100644
index 00000000000..f41f224f609
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/Inputs/zero-string-table.obj.coff-i386
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/COFF/arm-baserelocs.test b/llvm/test/tools/llvm-readobj/COFF/arm-baserelocs.test
new file mode 100644
index 00000000000..5d6b53831d5
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/arm-baserelocs.test
@@ -0,0 +1,7 @@
+# RUN: llvm-readobj --coff-basereloc %p/Inputs/trivial.exe.coff-arm | FileCheck %s
+
+# CHECK: Entry {
+# CHECK: Type: ARM_MOV32(T)
+# CHECK: Address: 0x9390
+# CHECK: }
+
diff --git a/llvm/test/tools/llvm-readobj/COFF/arm64-many-epilogs.s b/llvm/test/tools/llvm-readobj/COFF/arm64-many-epilogs.s
new file mode 100644
index 00000000000..a1b53980936
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/arm64-many-epilogs.s
@@ -0,0 +1,26 @@
+// REQUIRES: aarch64-registered-target
+// RUN: llvm-mc -filetype=obj -triple aarch64-windows %s -o - \
+// RUN: | not llvm-readobj --unwind - | FileCheck %s
+
+// Older versions of LLVM had a bug where we would accidentally
+// truncate the number of epilogue scopes to a uint8_t; make
+// sure this doesn't happen.
+//
+// We expect the llvm-readobj invocation to fail because the
+// xdata section is truncated (to reduce the size of the testcase).
+
+// CHECK: EpilogueScopes: 256
+
+.section .pdata,"dr"
+ .long "?func@@YAHXZ"@IMGREL
+ .long "$unwind$func@@YAHXZ"@IMGREL
+
+ .text
+ .globl "?func@@YAHXZ"
+ .p2align 3
+"?func@@YAHXZ":
+ ret
+
+.section .xdata,"dr"
+"$unwind$func@@YAHXZ":
+.long 0x00000000, 0x02010100, 0x09000000, 0x0A000000
diff --git a/llvm/test/tools/llvm-readobj/COFF/arm64-win-error1.s b/llvm/test/tools/llvm-readobj/COFF/arm64-win-error1.s
new file mode 100644
index 00000000000..4cf35902739
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/arm64-win-error1.s
@@ -0,0 +1,54 @@
+## Check that error handling for bad opcodes works.
+## .xdata below contains the bad opcode 0xdf in the 4th word of .xdata.
+
+// REQUIRES: aarch64-registered-target
+// RUN: llvm-mc -filetype=obj -triple aarch64-windows %s -o - \
+// RUN: | llvm-readobj --unwind - | FileCheck %s
+
+// CHECK: Prologue [
+// CHECK: 0xdf ; Bad opcode!
+// CHECK: 0xff ; Bad opcode!
+// CHECK: 0xd600 ; stp x19, lr, [sp, #0]
+// CHECK: 0x01 ; sub sp, #16
+// CHECK: 0xe4 ; end
+// CHECK: ]
+
+ .text
+ .globl "?func@@YAHXZ"
+ .p2align 3
+"?func@@YAHXZ":
+ sub sp,sp,#0x10
+ stp x19,lr,[sp]
+ sub sp,sp,#0x1F0
+ mov w19,w0
+ bl "?func2@@YAXXZ"
+ cmp w19,#2
+ ble .LBB0_1
+ bl "?func2@@YAHXZ"
+ add sp,sp,#0x1F0
+ ldp x19,lr,[sp]
+ add sp,sp,#0x10
+ ret
+.LBB0_1:
+ mov x0,sp
+ bl "?func3@@YAHPEAH@Z"
+ add sp,sp,#0x1F0
+ ldp x19,lr,[sp]
+ add sp,sp,#0x10
+ ret
+
+
+.section .pdata,"dr"
+ .long "?func@@YAHXZ"@IMGREL
+ .long "$unwind$func@@YAHXZ"@IMGREL
+
+
+.section .xdata,"dr"
+"$unwind$func@@YAHXZ":
+ .p2align 3
+ .long 0x10800012
+ .long 0x8
+ .long 0xe
+ .long 0x00d6ffdf
+ .long 0xe3e3e401
+
diff --git a/llvm/test/tools/llvm-readobj/COFF/arm64-win-error2.s b/llvm/test/tools/llvm-readobj/COFF/arm64-win-error2.s
new file mode 100644
index 00000000000..74a61dd0201
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/arm64-win-error2.s
@@ -0,0 +1,50 @@
+## Check that the sanity check for an inconsistent header works.
+## The first word contains the bad value for CodeWords, 0xf, which indicates
+## that we need 0x11110 << 2 = 120 bytes of space for the unwind codes.
+## It follows that the .xdata section is badly formed as only 8 bytes are
+## allocated for the unwind codes.
+
+// REQUIRES: aarch64-registered-target
+// RUN: llvm-mc -filetype=obj -triple aarch64-windows %s -o - \
+// RUN: | not llvm-readobj --unwind - 2>&1 | FileCheck %s
+
+// CHECK: LLVM ERROR: Malformed unwind data
+
+ .text
+ .globl "?func@@YAHXZ"
+ .p2align 3
+"?func@@YAHXZ":
+ sub sp,sp,#0x10
+ stp x19,lr,[sp]
+ sub sp,sp,#0x1F0
+ mov w19,w0
+ bl "?func2@@YAXXZ"
+ cmp w19,#2
+ ble .LBB0_1
+ bl "?func2@@YAHXZ"
+ add sp,sp,#0x1F0
+ ldp x19,lr,[sp]
+ add sp,sp,#0x10
+ ret
+.LBB0_1:
+ mov x0,sp
+ bl "?func3@@YAHPEAH@Z"
+ add sp,sp,#0x1F0
+ ldp x19,lr,[sp]
+ add sp,sp,#0x10
+ ret
+
+.section .pdata,"dr"
+ .long "?func@@YAHXZ"@IMGREL
+ .long "$unwind$func@@YAHXZ"@IMGREL
+
+
+.section .xdata,"dr"
+"$unwind$func@@YAHXZ":
+ .p2align 3
+ .long 0xf0800012
+ .long 0x8
+ .long 0xe
+ .long 0x100d61f
+ .long 0xe3e3e3e4
+
diff --git a/llvm/test/tools/llvm-readobj/COFF/arm64-win-error3.s b/llvm/test/tools/llvm-readobj/COFF/arm64-win-error3.s
new file mode 100644
index 00000000000..8e1e1e1321b
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/arm64-win-error3.s
@@ -0,0 +1,51 @@
+## Check that error handling for going past the unwind data works.
+## .xdata below contains bad opcodes in the last word. The last byte, 0xe0,
+## indicates that we have come across alloc_l, which requires 4 bytes. In this
+## case, unwind code processing will go past the allocated unwind data.
+
+// REQUIRES: aarch64-registered-target
+// RUN: llvm-mc -filetype=obj -triple aarch64-windows %s -o - \
+// RUN: | llvm-readobj --unwind - | FileCheck %s
+
+// CHECK: Prologue [
+// CHECK: Opcode 0xe0 goes past the unwind data
+
+ .text
+ .globl "?func@@YAHXZ"
+ .p2align 3
+"?func@@YAHXZ":
+ sub sp,sp,#0x10
+ stp x19,lr,[sp]
+ sub sp,sp,#0x1F0
+ mov w19,w0
+ bl "?func2@@YAXXZ"
+ cmp w19,#2
+ ble .LBB0_1
+ bl "?func2@@YAHXZ"
+ add sp,sp,#0x1F0
+ ldp x19,lr,[sp]
+ add sp,sp,#0x10
+ ret
+.LBB0_1:
+ mov x0,sp
+ bl "?func3@@YAHPEAH@Z"
+ add sp,sp,#0x1F0
+ ldp x19,lr,[sp]
+ add sp,sp,#0x10
+ ret
+
+
+.section .pdata,"dr"
+ .long "?func@@YAHXZ"@IMGREL
+ .long "$unwind$func@@YAHXZ"@IMGREL
+
+
+.section .xdata,"dr"
+"$unwind$func@@YAHXZ":
+ .p2align 3
+ .long 0x10800012
+ .long 0x8
+ .long 0xe
+ .long 0x100d61f
+ .long 0xe0000000
+
diff --git a/llvm/test/tools/llvm-readobj/COFF/basereloc.test b/llvm/test/tools/llvm-readobj/COFF/basereloc.test
new file mode 100644
index 00000000000..3256a3a4adb
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/basereloc.test
@@ -0,0 +1,24 @@
+RUN: llvm-readobj --coff-basereloc %p/Inputs/basereloc.obj.coff-i386 | FileCheck %s
+
+CHECK: Format: COFF-i386
+CHECK-NEXT: Arch: i386
+CHECK-NEXT: AddressSize: 32bit
+CHECK-NEXT: BaseReloc [
+CHECK-NEXT: Entry {
+CHECK-NEXT: Type: HIGHLOW
+CHECK-NEXT: Address: 0x1004
+CHECK-NEXT: }
+CHECK-NEXT: Entry {
+CHECK-NEXT: Type: HIGHLOW
+CHECK-NEXT: Address: 0x100A
+CHECK-NEXT: }
+CHECK-NEXT: Entry {
+CHECK-NEXT: Type: HIGHLOW
+CHECK-NEXT: Address: 0x1010
+CHECK-NEXT: }
+CHECK-NEXT: Entry {
+CHECK-NEXT: Type: ABSOLUTE
+CHECK-NEXT: Address: 0x1000
+CHECK-NEXT: }
+CHECK-NEXT: ]
+
diff --git a/llvm/test/tools/llvm-readobj/COFF/bigobj.test b/llvm/test/tools/llvm-readobj/COFF/bigobj.test
new file mode 100644
index 00000000000..10972144315
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/bigobj.test
@@ -0,0 +1,139 @@
+RUN: llvm-readobj --file-headers --sections --symbols --relocations %p/Inputs/bigobj.coff-x86-64 | FileCheck %s
+
+CHECK: File: {{(.*[/\\])?}}bigobj.coff-x86-64
+CHECK-NEXT: Format: COFF-x86-64
+CHECK-NEXT: Arch: x86_64
+CHECK-NEXT: AddressSize: 64bit
+CHECK-NEXT: ImageFileHeader {
+CHECK-NEXT: Machine: IMAGE_FILE_MACHINE_AMD64 (0x8664)
+CHECK-NEXT: SectionCount: 3
+CHECK-NEXT: TimeDateStamp: 1970-01-01 00:00:00 (0x0)
+CHECK-NEXT: PointerToSymbolTable: 0xB0
+CHECK-NEXT: SymbolCount: 8
+CHECK-NEXT: OptionalHeaderSize: 0
+CHECK-NEXT: Characteristics [ (0x0)
+CHECK-NEXT: ]
+CHECK-NEXT: }
+CHECK-NEXT: Sections [
+CHECK-NEXT: Section {
+CHECK-NEXT: Number: 1
+CHECK-NEXT: Name: .text (2E 74 65 78 74 00 00 00)
+CHECK-NEXT: VirtualSize: 0x0
+CHECK-NEXT: VirtualAddress: 0x0
+CHECK-NEXT: RawDataSize: 0
+CHECK-NEXT: PointerToRawData: 0x0
+CHECK-NEXT: PointerToRelocations: 0x0
+CHECK-NEXT: PointerToLineNumbers: 0x0
+CHECK-NEXT: RelocationCount: 0
+CHECK-NEXT: LineNumberCount: 0
+CHECK-NEXT: Characteristics [ (0x60500020)
+CHECK-NEXT: IMAGE_SCN_ALIGN_16BYTES (0x500000)
+CHECK-NEXT: IMAGE_SCN_CNT_CODE (0x20)
+CHECK-NEXT: IMAGE_SCN_MEM_EXECUTE (0x20000000)
+CHECK-NEXT: IMAGE_SCN_MEM_READ (0x40000000)
+CHECK-NEXT: ]
+CHECK-NEXT: }
+CHECK-NEXT: Section {
+CHECK-NEXT: Number: 2
+CHECK-NEXT: Name: .data (2E 64 61 74 61 00 00 00)
+CHECK-NEXT: VirtualSize: 0x0
+CHECK-NEXT: VirtualAddress: 0x0
+CHECK-NEXT: RawDataSize: 0
+CHECK-NEXT: PointerToRawData: 0x0
+CHECK-NEXT: PointerToRelocations: 0x0
+CHECK-NEXT: PointerToLineNumbers: 0x0
+CHECK-NEXT: RelocationCount: 0
+CHECK-NEXT: LineNumberCount: 0
+CHECK-NEXT: Characteristics [ (0xC0500040)
+CHECK-NEXT: IMAGE_SCN_ALIGN_16BYTES (0x500000)
+CHECK-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA (0x40)
+CHECK-NEXT: IMAGE_SCN_MEM_READ (0x40000000)
+CHECK-NEXT: IMAGE_SCN_MEM_WRITE (0x80000000)
+CHECK-NEXT: ]
+CHECK-NEXT: }
+CHECK-NEXT: Section {
+CHECK-NEXT: Number: 3
+CHECK-NEXT: Name: .bss (2E 62 73 73 00 00 00 00)
+CHECK-NEXT: VirtualSize: 0x0
+CHECK-NEXT: VirtualAddress: 0x0
+CHECK-NEXT: RawDataSize: 0
+CHECK-NEXT: PointerToRawData: 0x0
+CHECK-NEXT: PointerToRelocations: 0x0
+CHECK-NEXT: PointerToLineNumbers: 0x0
+CHECK-NEXT: RelocationCount: 0
+CHECK-NEXT: LineNumberCount: 0
+CHECK-NEXT: Characteristics [ (0xC0500080)
+CHECK-NEXT: IMAGE_SCN_ALIGN_16BYTES (0x500000)
+CHECK-NEXT: IMAGE_SCN_CNT_UNINITIALIZED_DATA (0x80)
+CHECK-NEXT: IMAGE_SCN_MEM_READ (0x40000000)
+CHECK-NEXT: IMAGE_SCN_MEM_WRITE (0x80000000)
+CHECK-NEXT: ]
+CHECK-NEXT: }
+CHECK-NEXT: ]
+CHECK-NEXT: Relocations [
+CHECK-NEXT: ]
+CHECK-NEXT: Symbols [
+CHECK-NEXT: Symbol {
+CHECK-NEXT: Name: .file
+CHECK-NEXT: Value: 0
+CHECK-NEXT: Section: IMAGE_SYM_DEBUG (-2)
+CHECK-NEXT: BaseType: Null (0x0)
+CHECK-NEXT: ComplexType: Null (0x0)
+CHECK-NEXT: StorageClass: File (0x67)
+CHECK-NEXT: AuxSymbolCount: 1
+CHECK-NEXT: AuxFileRecord {
+CHECK-NEXT: FileName: fake
+CHECK-NEXT: }
+CHECK-NEXT: }
+CHECK-NEXT: Symbol {
+CHECK-NEXT: Name: .text
+CHECK-NEXT: Value: 0
+CHECK-NEXT: Section: .text (1)
+CHECK-NEXT: BaseType: Null (0x0)
+CHECK-NEXT: ComplexType: Null (0x0)
+CHECK-NEXT: StorageClass: Static (0x3)
+CHECK-NEXT: AuxSymbolCount: 1
+CHECK-NEXT: AuxSectionDef {
+CHECK-NEXT: Length: 0
+CHECK-NEXT: RelocationCount: 0
+CHECK-NEXT: LineNumberCount: 0
+CHECK-NEXT: Checksum: 0x0
+CHECK-NEXT: Number: 0
+CHECK-NEXT: Selection: 0x0
+CHECK-NEXT: }
+CHECK-NEXT: }
+CHECK-NEXT: Symbol {
+CHECK-NEXT: Name: .data
+CHECK-NEXT: Value: 0
+CHECK-NEXT: Section: .data (2)
+CHECK-NEXT: BaseType: Null (0x0)
+CHECK-NEXT: ComplexType: Null (0x0)
+CHECK-NEXT: StorageClass: Static (0x3)
+CHECK-NEXT: AuxSymbolCount: 1
+CHECK-NEXT: AuxSectionDef {
+CHECK-NEXT: Length: 0
+CHECK-NEXT: RelocationCount: 0
+CHECK-NEXT: LineNumberCount: 0
+CHECK-NEXT: Checksum: 0x0
+CHECK-NEXT: Number: 0
+CHECK-NEXT: Selection: 0x0
+CHECK-NEXT: }
+CHECK-NEXT: }
+CHECK-NEXT: Symbol {
+CHECK-NEXT: Name: .bss
+CHECK-NEXT: Value: 0
+CHECK-NEXT: Section: .bss (3)
+CHECK-NEXT: BaseType: Null (0x0)
+CHECK-NEXT: ComplexType: Null (0x0)
+CHECK-NEXT: StorageClass: Static (0x3)
+CHECK-NEXT: AuxSymbolCount: 1
+CHECK-NEXT: AuxSectionDef {
+CHECK-NEXT: Length: 0
+CHECK-NEXT: RelocationCount: 0
+CHECK-NEXT: LineNumberCount: 0
+CHECK-NEXT: Checksum: 0x0
+CHECK-NEXT: Number: 0
+CHECK-NEXT: Selection: 0x0
+CHECK-NEXT: }
+CHECK-NEXT: }
+CHECK-NEXT: ]
diff --git a/llvm/test/tools/llvm-readobj/COFF/codeview-inlinees.test b/llvm/test/tools/llvm-readobj/COFF/codeview-inlinees.test
new file mode 100644
index 00000000000..9f818dfc289
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/codeview-inlinees.test
@@ -0,0 +1,38 @@
+Compile the following like so to reproduce the input:
+$ cl -c -O2 t.c -Z7
+void g();
+static inline void f() { g(); }
+static inline void h() { g(); }
+void k() {
+ f();
+ h();
+}
+
+RUN: llvm-readobj --codeview %p/Inputs/codeview-inlinees.obj | FileCheck %s
+
+CHECK: SubSectionType: InlineeLines (0xF6)
+CHECK: Inlinee: f (0x1003)
+CHECK: Inlinee: h (0x1004)
+CHECK-NOT: Inlinee:
+
+CHECK: GlobalProcIdSym {
+CHECK: Kind: S_GPROC32_ID (0x1147)
+CHECK: DisplayName: k
+CHECK: LinkageName: k
+CHECK: }
+CHECK: InlineSiteSym
+CHECK: Kind: S_INLINESITE (0x114D)
+CHECK: Inlinee: h (0x1004)
+CHECK: InlineSiteSym
+CHECK: Kind: S_INLINESITE (0x114D)
+CHECK: Inlinee: f (0x1003)
+CHECK: InlineesSym {
+CHECK-NEXT: Kind: S_INLINEES (0x1168)
+CHECK-NEXT: Callers [
+CHECK-NEXT: FuncID: f (0x1003)
+CHECK-NEXT: FuncID: h (0x1004)
+CHECK-NEXT: ]
+CHECK: }
+CHECK: ProcEnd {
+CHECK: Kind: S_PROC_ID_END (0x114F)
+CHECK: }
diff --git a/llvm/test/tools/llvm-readobj/COFF/codeview-inlining.test b/llvm/test/tools/llvm-readobj/COFF/codeview-inlining.test
new file mode 100644
index 00000000000..14c4f1af75c
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/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/llvm/test/tools/llvm-readobj/COFF/codeview-label.test b/llvm/test/tools/llvm-readobj/COFF/codeview-label.test
new file mode 100644
index 00000000000..66afcb377e9
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/codeview-label.test
@@ -0,0 +1,16 @@
+; RUN: llvm-readobj --codeview %S/Inputs/codeview-label.obj | FileCheck %s
+
+; CHECK-LABEL: Label (0x1000) {
+; CHECK-NEXT: TypeLeafKind: LF_LABEL (0xE)
+; CHECK-NEXT: Mode: Near (0x0)
+; CHECK-NEXT: }
+
+; To reproduce codeview-label.obj:
+; $ cat codeview-label.asm
+; .model flat, C
+; .code
+; public foo
+; foo:
+; ret
+; end
+; $ ml -c -Zi codeview-label.asm
diff --git a/llvm/test/tools/llvm-readobj/COFF/codeview-linetables.test b/llvm/test/tools/llvm-readobj/COFF/codeview-linetables.test
new file mode 100644
index 00000000000..81d193ad30e
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/codeview-linetables.test
@@ -0,0 +1,586 @@
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; The following two object files were generated using the following command:
+; D:\> cl /Z7 /c source.c
+; with the following contents of D:\source.c:
+; void z(void);
+;
+; void x(void) {
+; z();
+; }
+;
+; void y(void) {
+; z();
+; }
+;
+; void f(void) {
+; x();
+; y();
+; z();
+; }
+; using 32-/64-bit versions of CL v17.00.61030 and v18.00.21005.1 respectively.
+RUN: llvm-readobj -S --codeview --section-symbols %p/Inputs/multifunction-linetables.obj.coff-2012-i368 \
+RUN: | FileCheck %s -check-prefix MFUN32
+RUN: llvm-readobj -S --codeview --section-symbols %p/Inputs/multifunction-linetables.obj.coff-2013-i368 \
+RUN: | FileCheck %s -check-prefix MFUN32
+RUN: llvm-readobj -S --codeview --section-symbols %p/Inputs/multifunction-linetables.obj.coff-2012-x86_64 \
+RUN: | FileCheck %s -check-prefix MFUN64
+RUN: llvm-readobj -S --codeview --section-symbols %p/Inputs/multifunction-linetables.obj.coff-2013-x86_64 \
+RUN: | FileCheck %s -check-prefix MFUN64
+
+MFUN32: CodeViewDebugInfo [
+MFUN32-NEXT: Section: .debug$S (2)
+MFUN32-NEXT: Magic: 0x4
+MFUN32-NEXT: Subsection [
+MFUN32-NEXT: SubSectionType: Symbols (0xF1)
+MFUN32-NEXT: SubSectionSize: 0x52
+MFUN32: ]
+MFUN32: Subsection [
+MFUN32-NEXT: SubSectionType: FrameData (0xF5)
+MFUN32-NEXT: SubSectionSize: 0x24
+MFUN32: ]
+MFUN32: Subsection [
+MFUN32-NEXT: SubSectionType: Symbols (0xF1)
+MFUN32-NEXT: SubSectionSize: 0x4B
+MFUN32: GlobalProcIdSym {
+MFUN32: CodeSize: 0xA
+MFUN32: DisplayName: x
+MFUN32: LinkageName: _x
+MFUN32: }
+MFUN32: ProcEnd
+MFUN32: ]
+MFUN32: Subsection [
+MFUN32-NEXT: SubSectionType: Lines (0xF2)
+MFUN32-NEXT: SubSectionSize: 0x30
+MFUN32: LinkageName: _x
+MFUN32-NEXT: ]
+MFUN32-NEXT: Subsection [
+MFUN32-NEXT: SubSectionType: FrameData (0xF5)
+MFUN32-NEXT: SubSectionSize: 0x24
+MFUN32: ]
+MFUN32: Subsection [
+MFUN32-NEXT: SubSectionType: Symbols (0xF1)
+MFUN32-NEXT: SubSectionSize: 0x4B
+MFUN32: GlobalProcIdSym {
+MFUN32: CodeSize: 0xA
+MFUN32: DisplayName: y
+MFUN32: LinkageName: _y
+MFUN32: }
+MFUN32: ProcEnd
+MFUN32: ]
+MFUN32-NEXT: Subsection [
+MFUN32-NEXT: SubSectionType: Lines (0xF2)
+MFUN32-NEXT: SubSectionSize: 0x30
+MFUN32: LinkageName: _y
+MFUN32-NEXT: ]
+MFUN32-NEXT: Subsection [
+MFUN32-NEXT: SubSectionType: FrameData (0xF5)
+MFUN32-NEXT: SubSectionSize: 0x24
+MFUN32: ]
+MFUN32: Subsection [
+MFUN32-NEXT: SubSectionType: Symbols (0xF1)
+MFUN32-NEXT: SubSectionSize: 0x4B
+MFUN32: GlobalProcIdSym {
+MFUN32: CodeSize: 0x14
+MFUN32: DisplayName: f
+MFUN32: LinkageName: _f
+MFUN32: }
+MFUN32: ProcEnd
+MFUN32: ]
+MFUN32: Subsection [
+MFUN32-NEXT: SubSectionType: Lines (0xF2)
+MFUN32-NEXT: SubSectionSize: 0x40
+MFUN32: LinkageName: _f
+MFUN32-NEXT: ]
+MFUN32-NEXT: Subsection [
+MFUN32-NEXT: SubSectionType: FileChecksums (0xF4)
+MFUN32-NEXT: SubSectionSize: 0x18
+MFUN32: ]
+MFUN32-NEXT: Subsection [
+MFUN32-NEXT: SubSectionType: StringTable (0xF3)
+MFUN32-NEXT: SubSectionSize: 0x46
+MFUN32: ]
+MFUN32-NEXT: Subsection [
+MFUN32-NEXT: SubSectionType: Symbols (0xF1)
+MFUN32-NEXT: SubSectionSize: 0x8
+MFUN32: ]
+MFUN32-NEXT: FunctionLineTable [
+MFUN32-NEXT LinkageName: _x
+MFUN32-NEXT Flags: 0x0
+MFUN32-NEXT CodeSize: 0xA
+MFUN32-NEXT FilenameSegment [
+MFUN32-NEXT Filename: d:\source.c
+MFUN32-NEXT +0x0 [
+MFUN32-NEXT LineNumberStart: 3
+MFUN32-NEXT LineNumberEndDelta: 0
+MFUN32-NEXT IsStatement: Yes
+MFUN32-NEXT ]
+MFUN32-NEXT +0x3 [
+MFUN32-NEXT LineNumberStart: 4
+MFUN32-NEXT LineNumberEndDelta: 0
+MFUN32-NEXT IsStatement: Yes
+MFUN32-NEXT ]
+MFUN32-NEXT +0x8 [
+MFUN32-NEXT LineNumberStart: 5
+MFUN32-NEXT LineNumberEndDelta: 0
+MFUN32-NEXT IsStatement: Yes
+MFUN32-NEXT ]
+MFUN32-NEXT ]
+MFUN32-NEXT ]
+MFUN32-NEXT FunctionLineTable [
+MFUN32-NEXT LinkageName: _y
+MFUN32-NEXT Flags: 0x0
+MFUN32-NEXT CodeSize: 0xA
+MFUN32-NEXT FilenameSegment [
+MFUN32-NEXT Filename: d:\source.c
+MFUN32-NEXT +0x0 [
+MFUN32-NEXT LineNumberStart: 7
+MFUN32-NEXT LineNumberEndDelta: 0
+MFUN32-NEXT IsStatement: Yes
+MFUN32-NEXT ]
+MFUN32-NEXT +0x3 [
+MFUN32-NEXT LineNumberStart: 8
+MFUN32-NEXT LineNumberEndDelta: 0
+MFUN32-NEXT IsStatement: Yes
+MFUN32-NEXT ]
+MFUN32-NEXT +0x8 [
+MFUN32-NEXT LineNumberStart: 9
+MFUN32-NEXT LineNumberEndDelta: 0
+MFUN32-NEXT IsStatement: Yes
+MFUN32-NEXT ]
+MFUN32-NEXT ]
+MFUN32-NEXT ]
+MFUN32-NEXT FunctionLineTable [
+MFUN32-NEXT LinkageName: _f
+MFUN32-NEXT Flags: 0x0
+MFUN32-NEXT CodeSize: 0x14
+MFUN32-NEXT FilenameSegment [
+MFUN32-NEXT Filename: d:\source.c
+MFUN32-NEXT +0x0 [
+MFUN32-NEXT LineNumberStart: 11
+MFUN32-NEXT LineNumberEndDelta: 0
+MFUN32-NEXT IsStatement: Yes
+MFUN32-NEXT ]
+MFUN32-NEXT +0x3 [
+MFUN32-NEXT LineNumberStart: 12
+MFUN32-NEXT LineNumberEndDelta: 0
+MFUN32-NEXT IsStatement: Yes
+MFUN32-NEXT ]
+MFUN32-NEXT +0x8 [
+MFUN32-NEXT LineNumberStart: 13
+MFUN32-NEXT LineNumberEndDelta: 0
+MFUN32-NEXT IsStatement: Yes
+MFUN32-NEXT ]
+MFUN32-NEXT +0xD [
+MFUN32-NEXT LineNumberStart: 14
+MFUN32-NEXT LineNumberEndDelta: 0
+MFUN32-NEXT IsStatement: Yes
+MFUN32-NEXT ]
+MFUN32-NEXT +0x12 [
+MFUN32-NEXT LineNumberStart: 15
+MFUN32-NEXT LineNumberEndDelta: 0
+MFUN32-NEXT IsStatement: Yes
+MFUN32-NEXT ]
+MFUN32-NEXT ]
+MFUN32-NEXT ]
+MFUN32: ]
+
+MFUN64: CodeViewDebugInfo [
+MFUN64: Magic: 0x4
+MFUN64-NEXT: Subsection [
+MFUN64-NEXT: SubSectionType: Symbols (0xF1)
+MFUN64-NEXT: SubSectionSize: 0x52
+MFUN64: ]
+MFUN64: Subsection [
+MFUN64-NEXT: SubSectionType: Symbols (0xF1)
+MFUN64-NEXT: SubSectionSize: 0x4B
+MFUN64: GlobalProcIdSym {
+MFUN64: CodeSize: 0xE
+MFUN64: DisplayName: x
+MFUN64: LinkageName: x
+MFUN64: }
+MFUN64: ProcEnd
+MFUN64: ]
+MFUN64-NEXT: Subsection [
+MFUN64-NEXT: SubSectionType: Lines (0xF2)
+MFUN64-NEXT: SubSectionSize: 0x30
+MFUN64: LinkageName: x
+MFUN64-NEXT: ]
+MFUN64-NEXT: Subsection [
+MFUN64-NEXT: SubSectionType: Symbols (0xF1)
+MFUN64-NEXT: SubSectionSize: 0x4B
+MFUN64: GlobalProcIdSym {
+MFUN64: CodeSize: 0xE
+MFUN64: DisplayName: y
+MFUN64: LinkageName: y
+MFUN64: }
+MFUN64: ProcEnd
+MFUN64: ]
+MFUN64-NEXT: Subsection [
+MFUN64-NEXT: SubSectionType: Lines (0xF2)
+MFUN64-NEXT: SubSectionSize: 0x30
+MFUN64: LinkageName: y
+MFUN64-NEXT: ]
+MFUN64-NEXT: Subsection [
+MFUN64-NEXT: SubSectionType: Symbols (0xF1)
+MFUN64-NEXT: SubSectionSize: 0x4B
+MFUN64: GlobalProcIdSym {
+MFUN64: CodeSize: 0x18
+MFUN64: DisplayName: f
+MFUN64: LinkageName: f
+MFUN64: }
+MFUN64: ProcEnd
+MFUN64: ]
+MFUN64-NEXT: Subsection [
+MFUN64-NEXT: SubSectionType: Lines (0xF2)
+MFUN64-NEXT: SubSectionSize: 0x40
+MFUN64: LinkageName: f
+MFUN64-NEXT: ]
+MFUN64-NEXT: Subsection [
+MFUN64-NEXT: SubSectionType: FileChecksums (0xF4)
+MFUN64-NEXT: SubSectionSize: 0x18
+MFUN64: ]
+MFUN64-NEXT: Subsection [
+MFUN64-NEXT: SubSectionType: StringTable (0xF3)
+MFUN64-NEXT: SubSectionSize: 0xD
+MFUN64: ]
+MFUN64-NEXT: Subsection [
+MFUN64-NEXT: SubSectionType: Symbols (0xF1)
+MFUN64-NEXT: SubSectionSize: 0x8
+MFUN64: ]
+MFUN64-NEXT: FunctionLineTable [
+MFUN64-NEXT: LinkageName: x
+MFUN64-NEXT: Flags: 0x0
+MFUN64-NEXT: CodeSize: 0xE
+MFUN64-NEXT: FilenameSegment [
+MFUN64-NEXT: Filename: d:\source.c
+MFUN64-NEXT: +0x0 [
+MFUN64-NEXT: LineNumberStart: 3
+MFUN64-NEXT: LineNumberEndDelta: 0
+MFUN64-NEXT: IsStatement: Yes
+MFUN64-NEXT: ]
+MFUN64-NEXT: +0x4 [
+MFUN64-NEXT: LineNumberStart: 4
+MFUN64-NEXT: LineNumberEndDelta: 0
+MFUN64-NEXT: IsStatement: Yes
+MFUN64-NEXT: ]
+MFUN64-NEXT: +0x9 [
+MFUN64-NEXT: LineNumberStart: 5
+MFUN64-NEXT: LineNumberEndDelta: 0
+MFUN64-NEXT: IsStatement: Yes
+MFUN64-NEXT: ]
+MFUN64-NEXT: ]
+MFUN64-NEXT: ]
+MFUN64-NEXT: FunctionLineTable [
+MFUN64-NEXT: LinkageName: y
+MFUN64-NEXT: Flags: 0x0
+MFUN64-NEXT: CodeSize: 0xE
+MFUN64-NEXT: FilenameSegment [
+MFUN64-NEXT: Filename: d:\source.c
+MFUN64-NEXT: +0x0 [
+MFUN64-NEXT: LineNumberStart: 7
+MFUN64-NEXT: LineNumberEndDelta: 0
+MFUN64-NEXT: IsStatement: Yes
+MFUN64-NEXT: ]
+MFUN64-NEXT: +0x4 [
+MFUN64-NEXT: LineNumberStart: 8
+MFUN64-NEXT: LineNumberEndDelta: 0
+MFUN64-NEXT: IsStatement: Yes
+MFUN64-NEXT: ]
+MFUN64-NEXT: +0x9 [
+MFUN64-NEXT: LineNumberStart: 9
+MFUN64-NEXT: LineNumberEndDelta: 0
+MFUN64-NEXT: IsStatement: Yes
+MFUN64-NEXT: ]
+MFUN64-NEXT: ]
+MFUN64-NEXT: ]
+MFUN64-NEXT: FunctionLineTable [
+MFUN64-NEXT: LinkageName: f
+MFUN64-NEXT: Flags: 0x0
+MFUN64-NEXT: CodeSize: 0x18
+MFUN64-NEXT: FilenameSegment [
+MFUN64-NEXT: Filename: d:\source.c
+MFUN64-NEXT: +0x0 [
+MFUN64-NEXT: LineNumberStart: 11
+MFUN64-NEXT: LineNumberEndDelta: 0
+MFUN64-NEXT: IsStatement: Yes
+MFUN64-NEXT: ]
+MFUN64-NEXT: +0x4 [
+MFUN64-NEXT: LineNumberStart: 12
+MFUN64-NEXT: LineNumberEndDelta: 0
+MFUN64-NEXT: IsStatement: Yes
+MFUN64-NEXT: ]
+MFUN64-NEXT: +0x9 [
+MFUN64-NEXT: LineNumberStart: 13
+MFUN64-NEXT: LineNumberEndDelta: 0
+MFUN64-NEXT: IsStatement: Yes
+MFUN64-NEXT: ]
+MFUN64-NEXT: +0xE [
+MFUN64-NEXT: LineNumberStart: 14
+MFUN64-NEXT: LineNumberEndDelta: 0
+MFUN64-NEXT: IsStatement: Yes
+MFUN64-NEXT: ]
+MFUN64-NEXT: +0x13 [
+MFUN64-NEXT: LineNumberStart: 15
+MFUN64-NEXT: LineNumberEndDelta: 0
+MFUN64-NEXT: IsStatement: Yes
+MFUN64-NEXT: ]
+MFUN64-NEXT: ]
+MFUN64-NEXT: ]
+MFUN64: ]
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; The following two object files were generated using the following command:
+; D:\> cl /Z7 /c input.c
+; with the following contents of D:\input.c:
+; void g(void);
+;
+; void f(void) {
+; #line 1 "one.c"
+; g();
+; #line 2 "two.c"
+; g();
+; #line 7 "one.c"
+; g();
+; }
+; using 32-/64-bit versions of CL v17.00.61030 and v18.00.21005.1 respectively.
+RUN: llvm-readobj -S --codeview --section-symbols %p/Inputs/multifile-linetables.obj.coff-2012-i368 \
+RUN: | FileCheck %s -check-prefix MFILE32
+RUN: llvm-readobj -S --codeview --section-symbols %p/Inputs/multifile-linetables.obj.coff-2013-i368 \
+RUN: | FileCheck %s -check-prefix MFILE32
+RUN: llvm-readobj -S --codeview --section-symbols %p/Inputs/multifile-linetables.obj.coff-2012-x86_64 \
+RUN: | FileCheck %s -check-prefix MFILE64
+RUN: llvm-readobj -S --codeview --section-symbols %p/Inputs/multifile-linetables.obj.coff-2013-x86_64 \
+RUN: | FileCheck %s -check-prefix MFILE64
+
+MFILE32: CodeViewDebugInfo [
+MFILE32: Magic: 0x4
+MFILE32-NEXT: Subsection [
+MFILE32-NEXT: SubSectionType: Symbols (0xF1)
+MFILE32-NEXT: SubSectionSize: 0x51
+MFILE32: ]
+MFILE32: Subsection [
+MFILE32-NEXT: SubSectionType: FrameData (0xF5)
+MFILE32-NEXT: SubSectionSize: 0x24
+MFILE32: ]
+MFILE32: Subsection [
+MFILE32-NEXT: SubSectionType: Symbols (0xF1)
+MFILE32-NEXT: SubSectionSize: 0x4B
+MFILE32: GlobalProcIdSym {
+MFILE32: CodeSize: 0x14
+MFILE32: DisplayName: f
+MFILE32: LinkageName: _f
+MFILE32: }
+MFILE32: ProcEnd
+MFILE32: ]
+MFILE32-NEXT: Subsection [
+MFILE32-NEXT: SubSectionType: Lines (0xF2)
+MFILE32-NEXT: SubSectionSize: 0x64
+MFILE32: LinkageName: _f
+MFILE32-NEXT: ]
+MFILE32-NEXT: Subsection [
+MFILE32-NEXT: SubSectionType: FileChecksums (0xF4)
+MFILE32-NEXT: SubSectionSize: 0x28
+MFILE32: ]
+MFILE32-NEXT: Subsection [
+MFILE32-NEXT: SubSectionType: StringTable (0xF3)
+MFILE32-NEXT: SubSectionSize: 0x57
+MFILE32: ]
+MFILE32-NEXT: Subsection [
+MFILE32-NEXT: SubSectionType: Symbols (0xF1)
+MFILE32-NEXT: SubSectionSize: 0x8
+MFILE32: ]
+MFILE32-NEXT: FunctionLineTable [
+MFILE32-NEXT: LinkageName: _f
+MFILE32-NEXT: Flags: 0x0
+MFILE32-NEXT: CodeSize: 0x14
+MFILE32-NEXT: FilenameSegment [
+MFILE32-NEXT: Filename: d:\input.c
+MFILE32-NEXT: +0x0 [
+MFILE32-NEXT: LineNumberStart: 3
+MFILE32-NEXT: LineNumberEndDelta: 0
+MFILE32-NEXT: IsStatement: Yes
+MFILE32-NEXT: ]
+MFILE32-NEXT: ]
+MFILE32-NEXT: FilenameSegment [
+MFILE32-NEXT: Filename: d:\one.c
+MFILE32-NEXT: +0x3 [
+MFILE32-NEXT: LineNumberStart: 1
+MFILE32-NEXT: LineNumberEndDelta: 0
+MFILE32-NEXT: IsStatement: Yes
+MFILE32-NEXT: ]
+MFILE32-NEXT: ]
+MFILE32-NEXT: FilenameSegment [
+MFILE32-NEXT: Filename: d:\two.c
+MFILE32-NEXT: +0x8 [
+MFILE32-NEXT: LineNumberStart: 2
+MFILE32-NEXT: LineNumberEndDelta: 0
+MFILE32-NEXT: IsStatement: Yes
+MFILE32-NEXT: ]
+MFILE32-NEXT: ]
+MFILE32-NEXT: FilenameSegment [
+MFILE32-NEXT: Filename: d:\one.c
+MFILE32-NEXT: +0xD [
+MFILE32-NEXT: LineNumberStart: 7
+MFILE32-NEXT: LineNumberEndDelta: 0
+MFILE32-NEXT: IsStatement: Yes
+MFILE32-NEXT: ]
+MFILE32-NEXT: +0x12 [
+MFILE32-NEXT: LineNumberStart: 8
+MFILE32-NEXT: LineNumberEndDelta: 0
+MFILE32-NEXT: IsStatement: Yes
+MFILE32-NEXT: ]
+MFILE32-NEXT: ]
+MFILE32-NEXT: ]
+MFILE32: ]
+
+MFILE64: CodeViewDebugInfo [
+MFILE64: Magic: 0x4
+MFILE64-NEXT: Subsection [
+MFILE64-NEXT: SubSectionType: Symbols (0xF1)
+MFILE64-NEXT: SubSectionSize: 0x51
+MFILE64: ]
+MFILE64: Subsection [
+MFILE64-NEXT: SubSectionType: Symbols (0xF1)
+MFILE64-NEXT: SubSectionSize: 0x4B
+MFILE64: GlobalProcIdSym {
+MFILE64: CodeSize: 0x18
+MFILE64: DisplayName: f
+MFILE64: LinkageName: f
+MFILE64: }
+MFILE64: ProcEnd
+MFILE64: ]
+MFILE64-NEXT: Subsection [
+MFILE64-NEXT: SubSectionType: Lines (0xF2)
+MFILE64-NEXT: SubSectionSize: 0x64
+MFILE64: LinkageName: f
+MFILE64-NEXT: ]
+MFILE64-NEXT: Subsection [
+MFILE64-NEXT: SubSectionType: FileChecksums (0xF4)
+MFILE64-NEXT: SubSectionSize: 0x28
+MFILE64: ]
+MFILE64-NEXT: Subsection [
+MFILE64-NEXT: SubSectionType: StringTable (0xF3)
+MFILE64-NEXT: SubSectionSize: 0x1E
+MFILE64: ]
+MFILE64-NEXT: Subsection [
+MFILE64-NEXT: SubSectionType: Symbols (0xF1)
+MFILE64-NEXT: SubSectionSize: 0x8
+MFILE64: ]
+MFILE64-NEXT: FunctionLineTable [
+MFILE64-NEXT: LinkageName: f
+MFILE64-NEXT: Flags: 0x0
+MFILE64-NEXT: CodeSize: 0x18
+MFILE64-NEXT: FilenameSegment [
+MFILE64-NEXT: Filename: d:\input.c
+MFILE64-NEXT: +0x0 [
+MFILE64-NEXT: LineNumberStart: 3
+MFILE64-NEXT: LineNumberEndDelta: 0
+MFILE64-NEXT: IsStatement: Yes
+MFILE64-NEXT: ]
+MFILE64-NEXT: ]
+MFILE64-NEXT: FilenameSegment [
+MFILE64-NEXT: Filename: d:\one.c
+MFILE64-NEXT: +0x4 [
+MFILE64-NEXT: LineNumberStart: 1
+MFILE64-NEXT: LineNumberEndDelta: 0
+MFILE64-NEXT: IsStatement: Yes
+MFILE64-NEXT: ]
+MFILE64-NEXT: ]
+MFILE64-NEXT: FilenameSegment [
+MFILE64-NEXT: Filename: d:\two.c
+MFILE64-NEXT: +0x9 [
+MFILE64-NEXT: LineNumberStart: 2
+MFILE64-NEXT: LineNumberEndDelta: 0
+MFILE64-NEXT: IsStatement: Yes
+MFILE64-NEXT: ]
+MFILE64-NEXT: ]
+MFILE64-NEXT: FilenameSegment [
+MFILE64-NEXT: Filename: d:\one.c
+MFILE64-NEXT: +0xE [
+MFILE64-NEXT: LineNumberStart: 7
+MFILE64-NEXT: LineNumberEndDelta: 0
+MFILE64-NEXT: IsStatement: Yes
+MFILE64-NEXT: ]
+MFILE64-NEXT: +0x13 [
+MFILE64-NEXT: LineNumberStart: 8
+MFILE64-NEXT: LineNumberEndDelta: 0
+MFILE64-NEXT: IsStatement: Yes
+MFILE64-NEXT: ]
+MFILE64-NEXT: ]
+MFILE64: ]
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; The following object files were generated using the following command:
+; C:\src> cl /Z7 /Gy /c test.cc
+; with the following contents of C:\src\test.cc:
+; int f()
+; {
+; return 0;
+; }
+;
+; int g()
+; {
+; return 0;
+; }
+; using 32-version of CL v17.00.61030 and v18.00.21005.1 respectively.
+RUN: llvm-readobj -S --codeview --section-symbols %p/Inputs/comdat-function-linetables.obj.coff-2012-i386 \
+RUN: | FileCheck %s -check-prefix MCOMDAT
+RUN: llvm-readobj -S --codeview --section-symbols %p/Inputs/comdat-function-linetables.obj.coff-2013-i386 \
+RUN: | FileCheck %s -check-prefix MCOMDAT
+
+MCOMDAT: GlobalProcIdSym {
+MCOMDAT: CodeSize: 0x7
+MCOMDAT: DisplayName: f
+MCOMDAT: LinkageName: ?f@@YAHXZ
+MCOMDAT: }
+MCOMDAT: FunctionLineTable [
+MCOMDAT-NEXT: LinkageName: ?f@@YAHXZ
+MCOMDAT-NEXT: Flags: 0x0
+MCOMDAT-NEXT: CodeSize: 0x7
+MCOMDAT-NEXT: FilenameSegment [
+MCOMDAT-NEXT: Filename: c:\src\test.cc
+MCOMDAT-NEXT: +0x0 [
+MCOMDAT-NEXT: LineNumberStart: 2
+MCOMDAT-NEXT: LineNumberEndDelta: 0
+MCOMDAT-NEXT: IsStatement: Yes
+MCOMDAT-NEXT: ]
+MCOMDAT-NEXT: +0x3 [
+MCOMDAT-NEXT: LineNumberStart: 3
+MCOMDAT-NEXT: LineNumberEndDelta: 0
+MCOMDAT-NEXT: IsStatement: Yes
+MCOMDAT-NEXT: ]
+MCOMDAT-NEXT: +0x5 [
+MCOMDAT-NEXT: LineNumberStart: 4
+MCOMDAT-NEXT: LineNumberEndDelta: 0
+MCOMDAT-NEXT: IsStatement: Yes
+MCOMDAT-NEXT: ]
+MCOMDAT-NEXT: ]
+MCOMDAT-NEXT: ]
+MCOMDAT: GlobalProcIdSym {
+MCOMDAT: CodeSize: 0x7
+MCOMDAT: DisplayName: g
+MCOMDAT: LinkageName: ?g@@YAHXZ
+MCOMDAT: }
+MCOMDAT: FunctionLineTable [
+MCOMDAT-NEXT: LinkageName: ?g@@YAHXZ
+MCOMDAT-NEXT: Flags: 0x0
+MCOMDAT-NEXT: CodeSize: 0x7
+MCOMDAT-NEXT: FilenameSegment [
+MCOMDAT-NEXT: Filename: c:\src\test.cc
+MCOMDAT-NEXT: +0x0 [
+MCOMDAT-NEXT: LineNumberStart: 7
+MCOMDAT-NEXT: LineNumberEndDelta: 0
+MCOMDAT-NEXT: IsStatement: Yes
+MCOMDAT-NEXT: ]
+MCOMDAT-NEXT: +0x3 [
+MCOMDAT-NEXT: LineNumberStart: 8
+MCOMDAT-NEXT: LineNumberEndDelta: 0
+MCOMDAT-NEXT: IsStatement: Yes
+MCOMDAT-NEXT: ]
+MCOMDAT-NEXT: +0x5 [
+MCOMDAT-NEXT: LineNumberStart: 9
+MCOMDAT-NEXT: LineNumberEndDelta: 0
+MCOMDAT-NEXT: IsStatement: Yes
+MCOMDAT-NEXT: ]
+MCOMDAT-NEXT: ]
+MCOMDAT-NEXT: ]
diff --git a/llvm/test/tools/llvm-readobj/COFF/codeview-merging-anon.test b/llvm/test/tools/llvm-readobj/COFF/codeview-merging-anon.test
new file mode 100644
index 00000000000..bbc40f9a25e
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/codeview-merging-anon.test
@@ -0,0 +1,29 @@
+# Test what happens when the first type record (0x1000) is a LF_FIELDLIST
+# record.
+
+# Steps to regenerate input:
+# $ cat t.c
+# struct { int x; } o;
+# $ cl -Z7 t.c
+
+RUN: llvm-readobj --codeview %S/Inputs/codeview-merging-anon.obj | FileCheck %s
+RUN: llvm-readobj --codeview-merged-types %S/Inputs/codeview-merging-anon.obj | FileCheck %s
+
+CHECK-LABEL: FieldList (0x1000) {
+CHECK-NEXT: TypeLeafKind: LF_FIELDLIST (0x1203)
+CHECK-NEXT: DataMember {
+CHECK-NEXT: TypeLeafKind: LF_MEMBER (0x150D)
+CHECK-NEXT: AccessSpecifier: Public (0x3)
+CHECK-NEXT: Type: int (0x74)
+CHECK-NEXT: FieldOffset: 0x0
+CHECK-NEXT: Name: x
+CHECK-NEXT: }
+CHECK-NEXT: }
+CHECK-LABEL: Struct (0x1001) {
+CHECK: TypeLeafKind: LF_STRUCTURE (0x1505)
+CHECK: MemberCount: 1
+CHECK: FieldList: <field list> (0x1000)
+CHECK: Name: <unnamed-tag>
+CHECK: LinkageName: .?AU<unnamed-tag>@@
+CHECK: }
+CHECK-LABEL: StringId
diff --git a/llvm/test/tools/llvm-readobj/COFF/codeview-merging-cycle.test b/llvm/test/tools/llvm-readobj/COFF/codeview-merging-cycle.test
new file mode 100644
index 00000000000..b7c63c84392
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/codeview-merging-cycle.test
@@ -0,0 +1,19 @@
+; RUN: not llvm-readobj --codeview-merged-types %S/Inputs/codeview-cycle.obj 2>&1 | FileCheck %s
+
+; CHECK: error{{.*}} Input type graph contains cycles
+
+; To reproduce codeview-cycle.obj:
+; $ cat codeview-cycle.asm
+; .model flat, C
+; .code
+; pfoo_list TYPEDEF PTR foo_list
+; foo_list STRUCT
+; next pfoo_list ?
+; data dd ?
+; foo_list ENDS
+; public foo
+; foo proc dst:ptr foo_list
+; ret
+; foo endp
+; end
+; $ ml -c -Zi codeview-cycle.asm
diff --git a/llvm/test/tools/llvm-readobj/COFF/codeview-merging-ghash.test b/llvm/test/tools/llvm-readobj/COFF/codeview-merging-ghash.test
new file mode 100644
index 00000000000..7c57cf0b5dc
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/codeview-merging-ghash.test
@@ -0,0 +1,132 @@
+# RUN: yaml2obj %s -o=%t.obj
+# RUN: llvm-readobj --codeview-merged-types %t.obj | FileCheck %s --check-prefix=MERGED
+# RUN: llvm-readobj --codeview-merged-types --codeview-ghash %t.obj | FileCheck %s --check-prefix=MERGED
+
+# MERGED: Format: COFF-x86-64
+# MERGED-NEXT: Arch: x86_64
+# MERGED-NEXT: AddressSize: 64bit
+# MERGED-NEXT: MergedTypeStream [
+# MERGED-NEXT: ArgList (0x1000) {
+# MERGED-NEXT: TypeLeafKind: LF_ARGLIST (0x1201)
+# MERGED-NEXT: NumArgs: 0
+# MERGED-NEXT: Arguments [
+# MERGED-NEXT: ]
+# MERGED-NEXT: }
+# MERGED-NEXT: Modifier (0x1001) {
+# MERGED-NEXT: TypeLeafKind: LF_MODIFIER (0x1001)
+# MERGED-NEXT: ModifiedType: void (0x3)
+# MERGED-NEXT: Modifiers [ (0x3)
+# MERGED-NEXT: Const (0x1)
+# MERGED-NEXT: Volatile (0x2)
+# MERGED-NEXT: ]
+# MERGED-NEXT: }
+# MERGED-NEXT: Procedure (0x1002) {
+# MERGED-NEXT: TypeLeafKind: LF_PROCEDURE (0x1008)
+# MERGED-NEXT: ReturnType: void (0x3)
+# MERGED-NEXT: CallingConvention: NearC (0x0)
+# MERGED-NEXT: FunctionOptions [ (0x0)
+# MERGED-NEXT: ]
+# MERGED-NEXT: NumParameters: 0
+# MERGED-NEXT: ArgListType: () (0x1000)
+# MERGED-NEXT: }
+# MERGED-NEXT: Pointer (0x1003) {
+# MERGED-NEXT: TypeLeafKind: LF_POINTER (0x1002)
+# MERGED-NEXT: PointeeType: const volatile void (0x1001)
+# MERGED-NEXT: PtrType: Near64 (0xC)
+# MERGED-NEXT: PtrMode: Pointer (0x0)
+# MERGED-NEXT: IsFlat: 0
+# MERGED-NEXT: IsConst: 1
+# MERGED-NEXT: IsVolatile: 0
+# MERGED-NEXT: IsUnaligned: 0
+# MERGED-NEXT: IsRestrict: 0
+# MERGED-NEXT: IsThisPtr&: 0
+# MERGED-NEXT: IsThisPtr&&: 0
+# MERGED-NEXT: SizeOf: 8
+# MERGED-NEXT: }
+# MERGED-NEXT: Pointer (0x1004) {
+# MERGED-NEXT: TypeLeafKind: LF_POINTER (0x1002)
+# MERGED-NEXT: PointeeType: const volatile void* const (0x1003)
+# MERGED-NEXT: PtrType: Near64 (0xC)
+# MERGED-NEXT: PtrMode: Pointer (0x0)
+# MERGED-NEXT: IsFlat: 0
+# MERGED-NEXT: IsConst: 1
+# MERGED-NEXT: IsVolatile: 0
+# MERGED-NEXT: IsUnaligned: 0
+# MERGED-NEXT: IsRestrict: 0
+# MERGED-NEXT: IsThisPtr&: 0
+# MERGED-NEXT: IsThisPtr&&: 0
+# MERGED-NEXT: SizeOf: 8
+# MERGED-NEXT: }
+# MERGED-NEXT: Pointer (0x1005) {
+# MERGED-NEXT: TypeLeafKind: LF_POINTER (0x1002)
+# MERGED-NEXT: PointeeType: const volatile void* const* const (0x1004)
+# MERGED-NEXT: PtrType: Near64 (0xC)
+# MERGED-NEXT: PtrMode: Pointer (0x0)
+# MERGED-NEXT: IsFlat: 0
+# MERGED-NEXT: IsConst: 1
+# MERGED-NEXT: IsVolatile: 0
+# MERGED-NEXT: IsUnaligned: 0
+# MERGED-NEXT: IsRestrict: 0
+# MERGED-NEXT: IsThisPtr&: 0
+# MERGED-NEXT: IsThisPtr&&: 0
+# MERGED-NEXT: SizeOf: 8
+# MERGED-NEXT: }
+# MERGED-NEXT: Pointer (0x1006) {
+# MERGED-NEXT: TypeLeafKind: LF_POINTER (0x1002)
+# MERGED-NEXT: PointeeType: const volatile void* const* const* const (0x1005)
+# MERGED-NEXT: PtrType: Near64 (0xC)
+# MERGED-NEXT: PtrMode: Pointer (0x0)
+# MERGED-NEXT: IsFlat: 0
+# MERGED-NEXT: IsConst: 1
+# MERGED-NEXT: IsVolatile: 0
+# MERGED-NEXT: IsUnaligned: 0
+# MERGED-NEXT: IsRestrict: 0
+# MERGED-NEXT: IsThisPtr&: 0
+# MERGED-NEXT: IsThisPtr&&: 0
+# MERGED-NEXT: SizeOf: 8
+# MERGED-NEXT: }
+# MERGED-NEXT: ]
+# MERGED-NEXT: MergedIDStream [
+# MERGED-NEXT: ]
+
+--- !COFF
+header:
+ Machine: IMAGE_FILE_MACHINE_AMD64
+ Characteristics: [ ]
+sections:
+ - Name: '.debug$T'
+ Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ]
+ Alignment: 1
+ Types:
+ - Kind: LF_PROCEDURE
+ Procedure:
+ ReturnType: 3
+ CallConv: NearC
+ Options: [ None ]
+ ParameterCount: 0
+ ArgumentList: 4097
+ - Kind: LF_ARGLIST
+ ArgList:
+ ArgIndices: [ ]
+ - Kind: LF_POINTER
+ Pointer:
+ ReferentType: 4099
+ Attrs: 66572
+ - Kind: LF_POINTER
+ Pointer:
+ ReferentType: 4100
+ Attrs: 66572
+ - Kind: LF_POINTER
+ Pointer:
+ ReferentType: 4101
+ Attrs: 66572
+ - Kind: LF_MODIFIER
+ Modifier:
+ ModifiedType: 3
+ Modifiers: [ None, Const, Volatile ]
+ - Kind: LF_POINTER
+ Pointer:
+ ReferentType: 4098
+ Attrs: 66572
+symbols:
+...
diff --git a/llvm/test/tools/llvm-readobj/COFF/codeview-merging-unsorted.test b/llvm/test/tools/llvm-readobj/COFF/codeview-merging-unsorted.test
new file mode 100644
index 00000000000..a52755a3c8a
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/codeview-merging-unsorted.test
@@ -0,0 +1,40 @@
+; RUN: llvm-readobj --codeview %S/Inputs/codeview-unsorted.obj | FileCheck %s
+; RUN: llvm-readobj --codeview-merged-types %S/Inputs/codeview-unsorted.obj | FileCheck %s --check-prefix=MERGED
+
+; The input type stream has records that refer to later type indices in the same
+; stream:
+
+; CHECK: Pointer (0x1000)
+; CHECK: Struct (0x1001)
+; CHECK: FieldList: {{.*}} (0x1002)
+; CHECK: FieldList (0x1002)
+; CHECK: Pointer (0x1003)
+; CHECK: Procedure (0x1004)
+; CHECK: ArgListType: {{.*}} (0x1005)
+; CHECK: ArgList (0x1005)
+
+; MERGED: Pointer (0x1000)
+; MERGED: FieldList (0x1001)
+; MERGED: Struct (0x1002)
+; MERGED: FieldList: {{.*}} (0x1001)
+; MERGED: Pointer (0x1003)
+; MERGED: ArgList (0x1004)
+; MERGED: Procedure (0x1005)
+; MERGED: ArgListType: {{.*}} (0x1004)
+
+
+; To reproduce codeview-unsorted.obj:
+; $ cat codeview-unsorted.asm
+; .model flat, C
+; .code
+; PBYTE TYPEDEF PTR BYTE
+; foo_list STRUCT
+; next PBYTE ?
+; data dd ?
+; foo_list ENDS
+; public foo
+; foo proc dst:ptr foo_list
+; ret
+; foo endp
+; end
+; $ ml -c -Zi codeview-unsorted.asm
diff --git a/llvm/test/tools/llvm-readobj/COFF/codeview-merging.test b/llvm/test/tools/llvm-readobj/COFF/codeview-merging.test
new file mode 100644
index 00000000000..af7b29f7e7c
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/codeview-merging.test
@@ -0,0 +1,113 @@
+# 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: Procedure ({{.*}}) {
+OBJ1-NEXT: TypeLeafKind: LF_PROCEDURE (0x1008)
+OBJ1-NEXT: ReturnType: int (0x74)
+OBJ1-NEXT: CallingConvention: NearC (0x0)
+OBJ1-NEXT: FunctionOptions [ (0x0)
+OBJ1-NEXT: ]
+OBJ1-NEXT: NumParameters: 1
+OBJ1-NEXT: ArgListType: (A*) (0x1002)
+OBJ1-NEXT: }
+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: MergedTypeStream [
+CHECK: Procedure ({{.*}}) {
+CHECK-NEXT: TypeLeafKind: LF_PROCEDURE (0x1008)
+CHECK-NEXT: ReturnType: int (0x74)
+CHECK-NEXT: CallingConvention: NearC (0x0)
+CHECK-NEXT: FunctionOptions [ (0x0)
+CHECK-NEXT: ]
+CHECK-NEXT: NumParameters: 1
+CHECK-NEXT: ArgListType: (A*) (0x1002)
+CHECK-NEXT: }
+CHECK: Struct (0x1007) {
+CHECK-NEXT: TypeLeafKind: LF_STRUCTURE (0x1505)
+CHECK-NEXT: MemberCount: 1
+CHECK-NEXT: Properties [ (0x200)
+CHECK-NEXT: HasUniqueName (0x200)
+CHECK-NEXT: ]
+CHECK-NEXT: FieldList: <field list> (0x1006)
+CHECK-NEXT: DerivedFrom: 0x0
+CHECK-NEXT: VShape: 0x0
+CHECK-NEXT: SizeOf: 8
+CHECK-NEXT: Name: B
+CHECK-NEXT: LinkageName: .?AUB@@
+CHECK-NEXT: }
+CHECK: ]
+
+CHECK: MergedIDStream [
+CHECK-NEXT: StringId (0x1000) {
+CHECK-NEXT: TypeLeafKind: LF_STRING_ID (0x1605)
+CHECK-NEXT: Id: 0x0
+CHECK-NEXT: StringData: d:\src\llvm\build\t.cpp
+CHECK-NEXT: }
+# Test that we contextually dump item ids and type ids from different databases.
+CHECK-NEXT: UdtSourceLine (0x1001) {
+CHECK-NEXT: TypeLeafKind: LF_UDT_SRC_LINE (0x1606)
+CHECK-NEXT: UDT: B (0x1007)
+CHECK-NEXT: SourceFile: d:\src\llvm\build\t.cpp (0x1000)
+CHECK-NEXT: LineNumber: 3
+CHECK-NEXT: }
+CHECK: FuncId (0x1002) {
+CHECK-NEXT: TypeLeafKind: LF_FUNC_ID (0x1601)
+CHECK-NEXT: ParentScope: 0x0
+CHECK-NEXT: FunctionType: int (B*)
+CHECK-NEXT: Name: g
+CHECK-NEXT: }
+CHECK-NEXT: FuncId (0x1003) {
+CHECK-NEXT: TypeLeafKind: LF_FUNC_ID (0x1601)
+CHECK-NEXT: ParentScope: 0x0
+CHECK-NEXT: FunctionType: int (A*)
+CHECK-NEXT: Name: f
+CHECK-NEXT: }
+CHECK-NOT: FuncId
+CHECK: ]
diff --git a/llvm/test/tools/llvm-readobj/COFF/codeview-types.test b/llvm/test/tools/llvm-readobj/COFF/codeview-types.test
new file mode 100644
index 00000000000..3c2939611fa
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/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/llvm/test/tools/llvm-readobj/COFF/codeview-vftable.test b/llvm/test/tools/llvm-readobj/COFF/codeview-vftable.test
new file mode 100644
index 00000000000..fb7acad11ea
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/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/llvm/test/tools/llvm-readobj/COFF/const-import.test b/llvm/test/tools/llvm-readobj/COFF/const-import.test
new file mode 100644
index 00000000000..432dee0e6eb
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/const-import.test
@@ -0,0 +1,7 @@
+RUN: llvm-readobj --coff-exports %S/Inputs/const-import.lib | FileCheck %s
+
+CHECK: Type: const
+CHECK: Name type: noprefix
+CHECK: Symbol: __imp____CFConstantStringClassReference
+CHECK: Symbol: ___CFConstantStringClassReference
+
diff --git a/llvm/test/tools/llvm-readobj/COFF/cxx-cli-aux.test b/llvm/test/tools/llvm-readobj/COFF/cxx-cli-aux.test
new file mode 100644
index 00000000000..6b16f0fe3aa
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/cxx-cli-aux.test
@@ -0,0 +1,40 @@
+Ensure that we can read the COFF auxiliary symbols 'section definition' and
+'CLR token definition' as used in C++/CLI object files. Auxiliary section
+definitions usually only follow a symbol with static storage class, but
+non-const appdomain globals (external ABS) also get one.
+
+RUN: llvm-readobj --symbols %p/Inputs/cxx-cli-aux.obj.coff-i386 | FileCheck %s
+
+CHECK: Symbols [
+CHECK: Symbol {
+CHECK: Name: ?PerAppDomain@@$$Q3HA
+CHECK-NEXT: Value: 4
+CHECK-NEXT: Section: IMAGE_SYM_ABSOLUTE (-1)
+CHECK-NEXT: BaseType: Null (0x0)
+CHECK-NEXT: ComplexType: Null (0x0)
+CHECK-NEXT: StorageClass: External (0x2)
+CHECK-NEXT: AuxSymbolCount: 1
+CHECK-NEXT: AuxSectionDef {
+CHECK-NEXT: Length: 0
+CHECK-NEXT: RelocationCount: 0
+CHECK-NEXT: LineNumberCount: 0
+CHECK-NEXT: Checksum: 0x0
+CHECK-NEXT: Number: 0
+CHECK-NEXT: Selection: NoDuplicates (0x1)
+CHECK-NEXT: }
+CHECK-NEXT: }
+
+CHECK: Symbol {
+CHECK: Name: 04000001
+CHECK-NEXT: Value: 4
+CHECK-NEXT: Section: IMAGE_SYM_ABSOLUTE (-1)
+CHECK-NEXT: BaseType: Null (0x0)
+CHECK-NEXT: ComplexType: Null (0x0)
+CHECK-NEXT: StorageClass: CLRToken (0x6B)
+CHECK-NEXT: AuxSymbolCount: 1
+CHECK-NEXT: AuxCLRToken {
+CHECK-NEXT: AuxType: 1
+CHECK-NEXT: Reserved: 0
+CHECK-NEXT: SymbolTableIndex: ?PerAppDomain@@$$Q3HA (19)
+CHECK-NEXT: }
+CHECK-NEXT: }
diff --git a/llvm/test/tools/llvm-readobj/COFF/debug-directory.test b/llvm/test/tools/llvm-readobj/COFF/debug-directory.test
new file mode 100644
index 00000000000..f67eb70d820
--- /dev/null
+++ b/llvm/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/llvm/test/tools/llvm-readobj/COFF/directives.test b/llvm/test/tools/llvm-readobj/COFF/directives.test
new file mode 100644
index 00000000000..a932583b4e0
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/directives.test
@@ -0,0 +1,2 @@
+RUN: llvm-readobj --coff-directives %p/Inputs/directives.obj.coff-x86_64 | FileCheck %s
+CHECK: Directive(s): /DEFAULTLIB:"LIBCMT" /DEFAULTLIB:"OLDNAMES"
diff --git a/llvm/test/tools/llvm-readobj/COFF/exports-implib.test b/llvm/test/tools/llvm-readobj/COFF/exports-implib.test
new file mode 100644
index 00000000000..75d0809ecbb
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/exports-implib.test
@@ -0,0 +1,26 @@
+RUN: llvm-readobj --coff-exports %p/Inputs/library.lib | FileCheck %s
+
+CHECK: File: library.dll
+CHECK: Format: COFF-import-file
+CHECK: Type: const
+CHECK: Name type: undecorate
+CHECK: Symbol: __imp__constant
+
+CHECK: File: library.dll
+CHECK: Format: COFF-import-file
+CHECK: Type: data
+CHECK: Name type: noprefix
+CHECK: Symbol: __imp__data
+
+CHECK: File: library.dll
+CHECK: Format: COFF-import-file
+CHECK: Type: code
+CHECK: Name type: name
+CHECK: Symbol: __imp__function
+
+CHECK: File: library.dll
+CHECK: Format: COFF-import-file
+CHECK: Type: code
+CHECK: Name type: ordinal
+CHECK: Symbol: __imp__ordinal
+
diff --git a/llvm/test/tools/llvm-readobj/COFF/exports.test b/llvm/test/tools/llvm-readobj/COFF/exports.test
new file mode 100644
index 00000000000..c0c977d9d4b
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/exports.test
@@ -0,0 +1,11 @@
+RUN: llvm-readobj --coff-exports %p/Inputs/export-x86.dll | FileCheck %s -check-prefix CHECK -check-prefix CHECK-X86
+RUN: llvm-readobj --coff-exports %p/Inputs/export-x64.dll | FileCheck %s -check-prefix CHECK -check-prefix CHECK-X64
+RUN: llvm-readobj --coff-exports %p/Inputs/export-arm.dll | FileCheck %s -check-prefix CHECK -check-prefix CHECK-ARM
+
+CHECK: Export {
+CHECK: Ordinal: 1
+CHECK: Name: function
+CHECK-X86: RVA: 0x1000
+CHECK-X64: RVA: 0x1000
+CHECK-ARM: RVA: 0x1001
+CHECK: }
diff --git a/llvm/test/tools/llvm-readobj/COFF/file-headers.test b/llvm/test/tools/llvm-readobj/COFF/file-headers.test
new file mode 100644
index 00000000000..77efe0146be
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/file-headers.test
@@ -0,0 +1,321 @@
+# RUN: yaml2obj %s --docnum=1 -o %t.arm
+# RUN: llvm-readobj -h %t.arm \
+# RUN: | FileCheck %s --strict-whitespace --match-full-lines -DFILE=%t.arm --check-prefix ARM
+
+# ARM:File: [[FILE]]
+# ARM-NEXT:Format: COFF-ARM
+# ARM-NEXT:Arch: thumb
+# ARM-NEXT:AddressSize: 32bit
+# ARM-NEXT:ImageFileHeader {
+# ARM-NEXT: Machine: IMAGE_FILE_MACHINE_ARMNT (0x1C4)
+# ARM-NEXT: SectionCount: 0
+# ARM-NEXT: TimeDateStamp: 1970-01-01 00:00:00 (0x0)
+# ARM-NEXT: PointerToSymbolTable: 0x0
+# ARM-NEXT: SymbolCount: 0
+# ARM-NEXT: OptionalHeaderSize: 0
+# ARM-NEXT: Characteristics [ (0x0)
+# ARM-NEXT: ]
+# ARM-NEXT:}
+# ARM-NOT:{{.}}
+
+--- !COFF
+header:
+ Machine: IMAGE_FILE_MACHINE_ARMNT
+ Characteristics: [ ]
+sections:
+symbols:
+
+# RUN: yaml2obj %s --docnum=2 -o %t.arm64
+# RUN: llvm-readobj -h %t.arm64 \
+# RUN: | FileCheck %s --strict-whitespace --match-full-lines -DFILE=%t.arm64 --check-prefix ARM64
+
+# ARM64:File: [[FILE]]
+# ARM64-NEXT:Format: COFF-ARM64
+# ARM64-NEXT:Arch: aarch64
+# ARM64-NEXT:AddressSize: 64bit
+# ARM64-NEXT:ImageFileHeader {
+# ARM64-NEXT: Machine: IMAGE_FILE_MACHINE_ARM64 (0xAA64)
+# ARM64-NEXT: SectionCount: 0
+# ARM64-NEXT: TimeDateStamp: 1970-01-01 00:00:00 (0x0)
+# ARM64-NEXT: PointerToSymbolTable: 0x0
+# ARM64-NEXT: SymbolCount: 0
+# ARM64-NEXT: OptionalHeaderSize: 0
+# ARM64-NEXT: Characteristics [ (0x0)
+# ARM64-NEXT: ]
+# ARM64-NEXT:}
+# ARM64-NOT:{{.}}
+
+--- !COFF
+header:
+ Machine: IMAGE_FILE_MACHINE_ARM64
+ Characteristics: [ ]
+sections:
+symbols:
+
+# RUN: yaml2obj %s --docnum=3 -o %t.i386
+# RUN: llvm-readobj -h %t.i386 \
+# RUN: | FileCheck %s --strict-whitespace --match-full-lines -DFILE=%t.i386 --check-prefix I386
+
+# I386:File: [[FILE]]
+# I386-NEXT:Format: COFF-i386
+# I386-NEXT:Arch: i386
+# I386-NEXT:AddressSize: 32bit
+# I386-NEXT:ImageFileHeader {
+# I386-NEXT: Machine: IMAGE_FILE_MACHINE_I386 (0x14C)
+# I386-NEXT: SectionCount: 0
+# I386-NEXT: TimeDateStamp: 1970-01-01 00:00:00 (0x0)
+# I386-NEXT: PointerToSymbolTable: 0x0
+# I386-NEXT: SymbolCount: 0
+# I386-NEXT: OptionalHeaderSize: 0
+# I386-NEXT: Characteristics [ (0x0)
+# I386-NEXT: ]
+# I386-NEXT:}
+# I386-NOT:{{.}}
+
+--- !COFF
+header:
+ Machine: IMAGE_FILE_MACHINE_I386
+ Characteristics: [ ]
+sections:
+symbols:
+
+# RUN: yaml2obj %s --docnum=4 -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
+
+# X86-64:File: [[FILE]]
+# X86-64-NEXT:Format: COFF-x86-64
+# X86-64-NEXT:Arch: x86_64
+# X86-64-NEXT:AddressSize: 64bit
+# X86-64-NEXT:ImageFileHeader {
+# X86-64-NEXT: Machine: IMAGE_FILE_MACHINE_AMD64 (0x8664)
+# X86-64-NEXT: SectionCount: 0
+# X86-64-NEXT: TimeDateStamp: 1970-01-01 00:00:00 (0x0)
+# X86-64-NEXT: PointerToSymbolTable: 0x0
+# X86-64-NEXT: SymbolCount: 0
+# X86-64-NEXT: OptionalHeaderSize: 0
+# X86-64-NEXT: Characteristics [ (0x0)
+# X86-64-NEXT: ]
+# X86-64-NEXT:}
+# X86-64-NOT:{{.}}
+
+--- !COFF
+header:
+ Machine: IMAGE_FILE_MACHINE_AMD64
+ Characteristics: [ ]
+sections:
+symbols:
+
+# RUN: yaml2obj %s --docnum=5 -o %t.i386
+# RUN: llvm-readobj -h %t.i386 \
+# RUN: | FileCheck %s --strict-whitespace --match-full-lines -DFILE=%t.i386 --check-prefix I386-CUSTOM-HEADER
+
+# I386-CUSTOM-HEADER:File: [[FILE]]
+# I386-CUSTOM-HEADER-NEXT:Format: COFF-i386
+# I386-CUSTOM-HEADER-NEXT:Arch: i386
+# I386-CUSTOM-HEADER-NEXT:AddressSize: 32bit
+# I386-CUSTOM-HEADER-NEXT:ImageFileHeader {
+# I386-CUSTOM-HEADER-NEXT: Machine: IMAGE_FILE_MACHINE_I386 (0x14C)
+# I386-CUSTOM-HEADER-NEXT: SectionCount: 0
+# I386-CUSTOM-HEADER-NEXT: TimeDateStamp: 1970-01-01 00:00:00 (0x0)
+# I386-CUSTOM-HEADER-NEXT: PointerToSymbolTable: 0x0
+# I386-CUSTOM-HEADER-NEXT: SymbolCount: 0
+# I386-CUSTOM-HEADER-NEXT: OptionalHeaderSize: 224
+# I386-CUSTOM-HEADER-NEXT: Characteristics [ (0x102)
+# I386-CUSTOM-HEADER-NEXT: IMAGE_FILE_32BIT_MACHINE (0x100)
+# I386-CUSTOM-HEADER-NEXT: IMAGE_FILE_EXECUTABLE_IMAGE (0x2)
+# I386-CUSTOM-HEADER-NEXT: ]
+# I386-CUSTOM-HEADER-NEXT:}
+# I386-CUSTOM-HEADER-NEXT:ImageOptionalHeader {
+# I386-CUSTOM-HEADER-NEXT: Magic: 0x10B
+# I386-CUSTOM-HEADER-NEXT: MajorLinkerVersion: 0
+# I386-CUSTOM-HEADER-NEXT: MinorLinkerVersion: 0
+# I386-CUSTOM-HEADER-NEXT: SizeOfCode: 0
+# I386-CUSTOM-HEADER-NEXT: SizeOfInitializedData: 0
+# I386-CUSTOM-HEADER-NEXT: SizeOfUninitializedData: 0
+# I386-CUSTOM-HEADER-NEXT: AddressOfEntryPoint: 0x1000
+# I386-CUSTOM-HEADER-NEXT: BaseOfCode: 0x0
+# I386-CUSTOM-HEADER-NEXT: BaseOfData: 0x0
+# I386-CUSTOM-HEADER-NEXT: ImageBase: 0x400000
+# I386-CUSTOM-HEADER-NEXT: SectionAlignment: 4096
+# I386-CUSTOM-HEADER-NEXT: FileAlignment: 512
+# I386-CUSTOM-HEADER-NEXT: MajorOperatingSystemVersion: 6
+# I386-CUSTOM-HEADER-NEXT: MinorOperatingSystemVersion: 0
+# I386-CUSTOM-HEADER-NEXT: MajorImageVersion: 0
+# I386-CUSTOM-HEADER-NEXT: MinorImageVersion: 0
+# I386-CUSTOM-HEADER-NEXT: MajorSubsystemVersion: 6
+# I386-CUSTOM-HEADER-NEXT: MinorSubsystemVersion: 0
+# I386-CUSTOM-HEADER-NEXT: SizeOfImage: 4096
+# I386-CUSTOM-HEADER-NEXT: SizeOfHeaders: 512
+# I386-CUSTOM-HEADER-NEXT: Subsystem: IMAGE_SUBSYSTEM_WINDOWS_CUI (0x3)
+# I386-CUSTOM-HEADER-NEXT: Characteristics [ (0x8140)
+# I386-CUSTOM-HEADER-NEXT: IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE (0x40)
+# I386-CUSTOM-HEADER-NEXT: IMAGE_DLL_CHARACTERISTICS_NX_COMPAT (0x100)
+# I386-CUSTOM-HEADER-NEXT: IMAGE_DLL_CHARACTERISTICS_TERMINAL_SERVER_AWARE (0x8000)
+# I386-CUSTOM-HEADER-NEXT: ]
+# I386-CUSTOM-HEADER-NEXT: SizeOfStackReserve: 1048576
+# I386-CUSTOM-HEADER-NEXT: SizeOfStackCommit: 4096
+# I386-CUSTOM-HEADER-NEXT: SizeOfHeapReserve: 1048576
+# I386-CUSTOM-HEADER-NEXT: SizeOfHeapCommit: 4096
+# I386-CUSTOM-HEADER-NEXT: NumberOfRvaAndSize: 16
+# I386-CUSTOM-HEADER-NEXT: DataDirectory {
+# I386-CUSTOM-HEADER-NEXT: ExportTableRVA: 0x0
+# I386-CUSTOM-HEADER-NEXT: ExportTableSize: 0x0
+# I386-CUSTOM-HEADER-NEXT: ImportTableRVA: 0x0
+# I386-CUSTOM-HEADER-NEXT: ImportTableSize: 0x0
+# I386-CUSTOM-HEADER-NEXT: ResourceTableRVA: 0x0
+# I386-CUSTOM-HEADER-NEXT: ResourceTableSize: 0x0
+# I386-CUSTOM-HEADER-NEXT: ExceptionTableRVA: 0x0
+# I386-CUSTOM-HEADER-NEXT: ExceptionTableSize: 0x0
+# I386-CUSTOM-HEADER-NEXT: CertificateTableRVA: 0x0
+# I386-CUSTOM-HEADER-NEXT: CertificateTableSize: 0x0
+# I386-CUSTOM-HEADER-NEXT: BaseRelocationTableRVA: 0x0
+# I386-CUSTOM-HEADER-NEXT: BaseRelocationTableSize: 0x0
+# I386-CUSTOM-HEADER-NEXT: DebugRVA: 0x0
+# I386-CUSTOM-HEADER-NEXT: DebugSize: 0x0
+# I386-CUSTOM-HEADER-NEXT: ArchitectureRVA: 0x0
+# I386-CUSTOM-HEADER-NEXT: ArchitectureSize: 0x0
+# I386-CUSTOM-HEADER-NEXT: GlobalPtrRVA: 0x0
+# I386-CUSTOM-HEADER-NEXT: GlobalPtrSize: 0x0
+# I386-CUSTOM-HEADER-NEXT: TLSTableRVA: 0x0
+# I386-CUSTOM-HEADER-NEXT: TLSTableSize: 0x0
+# I386-CUSTOM-HEADER-NEXT: LoadConfigTableRVA: 0x0
+# I386-CUSTOM-HEADER-NEXT: LoadConfigTableSize: 0x0
+# I386-CUSTOM-HEADER-NEXT: BoundImportRVA: 0x0
+# I386-CUSTOM-HEADER-NEXT: BoundImportSize: 0x0
+# I386-CUSTOM-HEADER-NEXT: IATRVA: 0x0
+# I386-CUSTOM-HEADER-NEXT: IATSize: 0x0
+# I386-CUSTOM-HEADER-NEXT: DelayImportDescriptorRVA: 0x0
+# I386-CUSTOM-HEADER-NEXT: DelayImportDescriptorSize: 0x0
+# I386-CUSTOM-HEADER-NEXT: CLRRuntimeHeaderRVA: 0x0
+# I386-CUSTOM-HEADER-NEXT: CLRRuntimeHeaderSize: 0x0
+# I386-CUSTOM-HEADER-NEXT: ReservedRVA: 0x0
+# I386-CUSTOM-HEADER-NEXT: ReservedSize: 0x0
+# I386-CUSTOM-HEADER-NEXT: }
+# I386-CUSTOM-HEADER-NEXT:}
+# I386-CUSTOM-HEADER-NEXT:DOSHeader {
+# I386-CUSTOM-HEADER-NEXT: Magic: MZ
+# I386-CUSTOM-HEADER-NEXT: UsedBytesInTheLastPage: 0
+# I386-CUSTOM-HEADER-NEXT: FileSizeInPages: 0
+# I386-CUSTOM-HEADER-NEXT: NumberOfRelocationItems: 0
+# I386-CUSTOM-HEADER-NEXT: HeaderSizeInParagraphs: 0
+# I386-CUSTOM-HEADER-NEXT: MinimumExtraParagraphs: 0
+# I386-CUSTOM-HEADER-NEXT: MaximumExtraParagraphs: 0
+# I386-CUSTOM-HEADER-NEXT: InitialRelativeSS: 0
+# I386-CUSTOM-HEADER-NEXT: InitialSP: 0
+# I386-CUSTOM-HEADER-NEXT: Checksum: 0
+# I386-CUSTOM-HEADER-NEXT: InitialIP: 0
+# I386-CUSTOM-HEADER-NEXT: InitialRelativeCS: 0
+# I386-CUSTOM-HEADER-NEXT: AddressOfRelocationTable: 64
+# I386-CUSTOM-HEADER-NEXT: OverlayNumber: 0
+# I386-CUSTOM-HEADER-NEXT: OEMid: 0
+# I386-CUSTOM-HEADER-NEXT: OEMinfo: 0
+# I386-CUSTOM-HEADER-NEXT: AddressOfNewExeHeader: 128
+# I386-CUSTOM-HEADER-NEXT:}
+# I386-CUSTOM-HEADER-NOT:{{.}}
+
+--- !COFF
+OptionalHeader:
+ AddressOfEntryPoint: 4096
+ ImageBase: 4194304
+ SectionAlignment: 4096
+ FileAlignment: 512
+ MajorOperatingSystemVersion: 6
+ MinorOperatingSystemVersion: 0
+ MajorImageVersion: 0
+ MinorImageVersion: 0
+ MajorSubsystemVersion: 6
+ MinorSubsystemVersion: 0
+ Subsystem: IMAGE_SUBSYSTEM_WINDOWS_CUI
+ DLLCharacteristics: [ IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE, IMAGE_DLL_CHARACTERISTICS_NX_COMPAT, IMAGE_DLL_CHARACTERISTICS_TERMINAL_SERVER_AWARE ]
+ SizeOfStackReserve: 1048576
+ SizeOfStackCommit: 4096
+ SizeOfHeapReserve: 1048576
+ SizeOfHeapCommit: 4096
+ ExportTable:
+ RelativeVirtualAddress: 0
+ Size: 0
+ ImportTable:
+ RelativeVirtualAddress: 0
+ Size: 0
+ ResourceTable:
+ RelativeVirtualAddress: 0
+ Size: 0
+ ExceptionTable:
+ RelativeVirtualAddress: 0
+ Size: 0
+ CertificateTable:
+ RelativeVirtualAddress: 0
+ Size: 0
+ BaseRelocationTable:
+ RelativeVirtualAddress: 0
+ Size: 0
+ Debug:
+ RelativeVirtualAddress: 0
+ Size: 0
+ Architecture:
+ RelativeVirtualAddress: 0
+ Size: 0
+ GlobalPtr:
+ RelativeVirtualAddress: 0
+ Size: 0
+ TlsTable:
+ RelativeVirtualAddress: 0
+ Size: 0
+ LoadConfigTable:
+ RelativeVirtualAddress: 0
+ Size: 0
+ BoundImport:
+ RelativeVirtualAddress: 0
+ Size: 0
+ IAT:
+ RelativeVirtualAddress: 0
+ Size: 0
+ DelayImportDescriptor:
+ RelativeVirtualAddress: 0
+ Size: 0
+ ClrRuntimeHeader:
+ RelativeVirtualAddress: 0
+ Size: 0
+header:
+ Machine: IMAGE_FILE_MACHINE_I386
+ Characteristics: [ IMAGE_FILE_EXECUTABLE_IMAGE, IMAGE_FILE_32BIT_MACHINE ]
+sections:
+symbols: []
+...
+
+# RUN: yaml2obj %s --docnum=6 -o %t.unknown
+# RUN: llvm-readobj -h %t.unknown \
+# RUN: | FileCheck %s --strict-whitespace --match-full-lines --check-prefix UNKNOWN
+
+# UNKNOWN:Format: COFF-<unknown arch>
+# UNKNOWN-NEXT:Arch: unknown
+# UNKNOWN-NEXT:AddressSize: 32bit
+# UNKNOWN-NEXT:ImageFileHeader {
+# UNKNOWN-NEXT: Machine: IMAGE_FILE_MACHINE_UNKNOWN (0x0)
+# UNKNOWN-NEXT: SectionCount: 0
+# UNKNOWN-NEXT: TimeDateStamp: 1970-01-01 00:00:00 (0x0)
+# UNKNOWN-NEXT: PointerToSymbolTable: 0x0
+# UNKNOWN-NEXT: SymbolCount: 0
+# UNKNOWN-NEXT: OptionalHeaderSize: 0
+# UNKNOWN-NEXT: Characteristics [ (0x0)
+# UNKNOWN-NEXT: ]
+# UNKNOWN-NEXT:}
+# UNKNOWN-NOT:{{.}}
+
+--- !COFF
+header:
+ Machine: IMAGE_FILE_MACHINE_UNKNOWN
+ Characteristics: [ ]
+sections:
+symbols:
+
+# RUN: llvm-readobj -h %p/Inputs/magic.coff-importlib \
+# RUN: | FileCheck %s --strict-whitespace --match-full-lines --check-prefix IMPORTLIB
+
+# IMPORTLIB:Format: COFF-import-file
+# IMPORTLIB-NEXT:Type: code
+# IMPORTLIB-NEXT:Name type: noprefix
+# IMPORTLIB-NEXT:Symbol: __imp__func
+# IMPORTLIB-NEXT:Symbol: _func
+# IMPORTLIB-NOT:{{.}}
diff --git a/llvm/test/tools/llvm-readobj/COFF/file-sections-reading.test b/llvm/test/tools/llvm-readobj/COFF/file-sections-reading.test
new file mode 100644
index 00000000000..a60f03349f7
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/file-sections-reading.test
@@ -0,0 +1,39 @@
+# RUN: yaml2obj %s | llvm-readobj --symbols - | FileCheck %s
+
+# CHECK: Symbols [
+# CHECK: Symbol {
+# CHECK: Name: .file
+# CHECK: Value: 0
+# CHECK: Section: IMAGE_SYM_DEBUG (-2)
+# CHECK: BaseType: Null (0x0)
+# CHECK: ComplexType: Null (0x0)
+# CHECK: StorageClass: File (0x67)
+# CHECK: AuxSymbolCount: 3
+# CHECK: AuxFileRecord {
+# CHECK: FileName: first-section-has-eighteen-characters.asm
+# CHECK: }
+# CHECK-NOT: AuxFileRecord {
+# CHECK: }
+# CHECK: ]
+
+!COFF
+header: !Header
+ Machine: IMAGE_FILE_MACHINE_I386 # (0x14c)
+ Characteristics: [ IMAGE_FILE_DEBUG_STRIPPED ]
+sections:
+symbols:
+ - !Symbol
+ Name: .file
+ Value: 0
+ SectionNumber: -2
+ SimpleType: IMAGE_SYM_TYPE_NULL
+ ComplexType: IMAGE_SYM_DTYPE_NULL
+ StorageClass: IMAGE_SYM_CLASS_FILE
+ File: first-section-has-eighteen-characters.asm
+ - !Symbol
+ Name: '@comp.id'
+ Value: 13485607
+ SectionNumber: -1
+ SimpleType: IMAGE_SYM_TYPE_NULL
+ ComplexType: IMAGE_SYM_DTYPE_NULL
+ StorageClass: IMAGE_SYM_CLASS_STATIC
diff --git a/llvm/test/tools/llvm-readobj/COFF/imports.test b/llvm/test/tools/llvm-readobj/COFF/imports.test
new file mode 100644
index 00000000000..58512f42adc
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/imports.test
@@ -0,0 +1,88 @@
+RUN: llvm-readobj --coff-imports %p/Inputs/imports.exe.coff-i386 | FileCheck -check-prefix=X86 %s
+RUN: llvm-readobj --coff-imports %p/Inputs/imports.exe.coff-x86-64 | FileCheck -check-prefix=X64 %s
+
+X86: Import {
+X86-NEXT: Name: KERNEL32.dll
+X86-NEXT: ImportLookupTableRVA: 0x2108
+X86-NEXT: ImportAddressTableRVA: 0x2000
+X86-NEXT: Symbol: ExitProcess (337)
+X86-NEXT: Symbol: GetProcAddress (669)
+X86-NEXT: Symbol: FreeLibrary (414)
+X86-NEXT: Symbol: GetLastError (592)
+X86-NEXT: Symbol: RaiseException (1087)
+X86-NEXT: Symbol: LoadLibraryExA (934)
+X86-NEXT: }
+X86-NEXT: Import {
+X86-NEXT: Name: USER32.dll
+X86-NEXT: ImportLookupTableRVA: 0x2124
+X86-NEXT: ImportAddressTableRVA: 0x201C
+X86-NEXT: Symbol: MessageBoxA (582)
+X86-NEXT: }
+X86-NEXT: Import {
+X86-NEXT: Name: mydll.dll
+X86-NEXT: ImportLookupTableRVA: 0x212C
+X86-NEXT: ImportAddressTableRVA: 0x2024
+X86-NEXT: Symbol: Func1 (0)
+X86-NEXT: Symbol: Func2 (1)
+X86-NEXT: Symbol: (3)
+X86-NEXT: }
+X86-NEXT: DelayImport {
+X86-NEXT: Name: lazyload.dll
+X86-NEXT: Attributes: 0x1
+X86-NEXT: ModuleHandle: 0x301C
+X86-NEXT: ImportAddressTable: 0x3010
+X86-NEXT: ImportNameTable: 0x2090
+X86-NEXT: BoundDelayImportTable: 0x20AC
+X86-NEXT: UnloadDelayImportTable: 0x0
+X86-NEXT: Import {
+X86-NEXT: Symbol: Func5 (0)
+X86-NEXT: Address: 0x401073
+X86-NEXT: }
+X86-NEXT: Import {
+X86-NEXT: Symbol: Func4 (0)
+X86-NEXT: Address: 0x401052
+X86-NEXT: }
+X86-NEXT: }
+
+X64: Import {
+X64-NEXT: Name: KERNEL32.dll
+X64-NEXT: ImportLookupTableRVA: 0x2170
+X64-NEXT: ImportAddressTableRVA: 0x2000
+X64-NEXT: Symbol: ExitProcess (343)
+X64-NEXT: Symbol: GetProcAddress (676)
+X64-NEXT: Symbol: FreeLibrary (420)
+X64-NEXT: Symbol: GetLastError (598)
+X64-NEXT: Symbol: RaiseException (1091)
+X64-NEXT: Symbol: LoadLibraryExA (937)
+X64-NEXT: }
+X64-NEXT: Import {
+X64-NEXT: Name: USER32.dll
+X64-NEXT: ImportLookupTableRVA: 0x21A8
+X64-NEXT: ImportAddressTableRVA: 0x2038
+X64-NEXT: Symbol: MessageBoxA (586)
+X64-NEXT: }
+X64-NEXT: Import {
+X64-NEXT: Name: mydll.dll
+X64-NEXT: ImportLookupTableRVA: 0x21B8
+X64-NEXT: ImportAddressTableRVA: 0x2048
+X64-NEXT: Symbol: Func1 (0)
+X64-NEXT: Symbol: Func2 (1)
+X64-NEXT: Symbol: (3)
+X64-NEXT: }
+X64-NEXT: DelayImport {
+X64-NEXT: Name: lazyload.dll
+X64-NEXT: Attributes: 0x1
+X64-NEXT: ModuleHandle: 0x3028
+X64-NEXT: ImportAddressTable: 0x3010
+X64-NEXT: ImportNameTable: 0x20E0
+X64-NEXT: BoundDelayImportTable: 0x2108
+X64-NEXT: UnloadDelayImportTable: 0x0
+X64-NEXT: Import {
+X64-NEXT: Symbol: Func5 (0)
+X64-NEXT: Address: 0x1400010F1
+X64-NEXT: }
+X64-NEXT: Import {
+X64-NEXT: Symbol: Func4 (0)
+X64-NEXT: Address: 0x140001066
+X64-NEXT: }
+X64-NEXT: }
diff --git a/llvm/test/tools/llvm-readobj/COFF/load-config.test b/llvm/test/tools/llvm-readobj/COFF/load-config.test
new file mode 100644
index 00000000000..b65c83b8ace
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/load-config.test
@@ -0,0 +1,98 @@
+RUN: llvm-readobj --coff-load-config %S/Inputs/coff-load-config-x86.dll | FileCheck %s --check-prefix=X86
+RUN: llvm-readobj --coff-load-config %S/Inputs/coff-load-config-x64.dll | FileCheck %s --check-prefix=X64
+
+RUN: llvm-readobj --coff-load-config %S/Inputs/coff-load-config-data-end.exe | FileCheck %s --check-prefix=DATAEND
+
+RUN: llvm-readobj --coff-load-config %S/Inputs/coff-no-load-config.exe | FileCheck %s --check-prefix=NOCONFIG
+
+X86: LoadConfig [
+X86: Size: 0x5C
+X86: TimeDateStamp: 1970-01-01 00:00:00 (0x0)
+X86: MajorVersion: 0x0
+X86: MinorVersion: 0x0
+X86: GlobalFlagsClear: 0x0
+X86: GlobalFlagsSet: 0x0
+X86: CriticalSectionDefaultTimeout: 0x0
+X86: DeCommitFreeBlockThreshold: 0x0
+X86: DeCommitTotalFreeThreshold: 0x0
+X86: LockPrefixTable: 0x0
+X86: MaximumAllocationSize: 0x0
+X86: VirtualMemoryThreshold: 0x0
+X86: ProcessHeapFlags: 0x0
+X86: ProcessAffinityMask: 0x0
+X86: CSDVersion: 0x0
+X86: DependentLoadFlags: 0x0
+X86: EditList: 0x0
+X86: SecurityCookie: 0x10003004
+X86: SEHandlerTable: 0x100021C0
+X86: SEHandlerCount: 2
+X86: GuardCFCheckFunction: 0x1000207C
+X86: GuardCFCheckDispatch: 0x0
+X86: GuardCFFunctionTable: 0x100020A4
+X86: GuardCFFunctionCount: 11
+X86: GuardFlags: 0x13500
+X86: ]
+X86: SEHTable [
+X86: 0x10001BE0
+X86: 0x10001E30
+X86: ]
+X86: GuardFidTable [
+X86: 0x10001000
+X86: 0x10001040
+X86: 0x10001060
+X86: 0x10001100
+X86: 0x10001120
+X86: 0x10001150
+X86: 0x10001460
+X86: 0x100019B0
+X86: 0x10001B40
+X86: 0x10001BE0
+X86: 0x10001DC0
+X86: ]
+
+X64: LoadConfig [
+X64: Size: 0x94
+X64: TimeDateStamp: 1970-01-01 00:00:00 (0x0)
+X64: MajorVersion: 0x0
+X64: MinorVersion: 0x0
+X64: GlobalFlagsClear: 0x0
+X64: GlobalFlagsSet: 0x0
+X64: CriticalSectionDefaultTimeout: 0x0
+X64: DeCommitFreeBlockThreshold: 0x0
+X64: DeCommitTotalFreeThreshold: 0x0
+X64: LockPrefixTable: 0x0
+X64: MaximumAllocationSize: 0x0
+X64: VirtualMemoryThreshold: 0x0
+X64: ProcessHeapFlags: 0x0
+X64: ProcessAffinityMask: 0x0
+X64: CSDVersion: 0x0
+X64: DependentLoadFlags: 0x0
+X64: EditList: 0x0
+X64: SecurityCookie: 0x180003018
+X64: SEHandlerTable: 0
+X64: SEHandlerCount: 0
+X64: GuardCFCheckFunction: 0x180002100
+X64: GuardCFCheckDispatch: 0x180002108
+X64: GuardCFFunctionTable: 0x180002158
+X64: GuardCFFunctionCount: 9
+X64: GuardFlags: 0x13500
+X64: ]
+X64-NOT: SEHTable
+X64: GuardFidTable [
+X64: 0x180001000
+X64: 0x180001050
+X64: 0x180001070
+X64: 0x1800010E0
+X64: 0x180001110
+X64: 0x180001460
+X64: 0x180001970
+X64: 0x180001B50
+X64: 0x180001D90
+X64: ]
+
+DATAEND: SEHTable [
+DATAEND-NEXT: 0x402006
+DATAEND-NEXT: ]
+
+NOCONFIG: Format: COFF-x86-64
+NOCONFIG-NOT: LoadConfig
diff --git a/llvm/test/tools/llvm-readobj/COFF/needed-libs.test b/llvm/test/tools/llvm-readobj/COFF/needed-libs.test
new file mode 100644
index 00000000000..7009f9c1a2e
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/needed-libs.test
@@ -0,0 +1,5 @@
+RUN: llvm-readobj --needed-libs %p/Inputs/needed-libs.obj.coff-am64 | FileCheck %s
+
+CHECK: NeededLibraries [
+CHECK-NEXT: KERNEL32.dll
+CHECK-NEXT: ]
diff --git a/llvm/test/tools/llvm-readobj/COFF/non-null-terminated-file.test b/llvm/test/tools/llvm-readobj/COFF/non-null-terminated-file.test
new file mode 100644
index 00000000000..960f8f3f79e
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/non-null-terminated-file.test
@@ -0,0 +1,41 @@
+# RUN: yaml2obj %s | llvm-readobj --symbols - | FileCheck %s
+
+# CHECK: Symbols [
+# CHECK: Symbol {
+# CHECK: Name: .file
+# CHECK: Value: 0
+# CHECK: StorageClass: File
+# CHECK: AuxSymbolCount: 1
+# CHECK: AuxFileRecord {
+# CHECK: FileName: eighteen-chars.obj{{$}}
+# CHECK: }
+# CHECK: }
+# CHECK: Symbol {
+# CHECK: Name: @comp.id
+# CHECK: Value: 13485607
+# CHECK: StorageClass: Static
+# CHECK: AuxSymbolCount: 0
+# CHECK: }
+# CHECK: ]
+
+!COFF
+header: !Header
+ Machine: IMAGE_FILE_MACHINE_I386 # (0x14c)
+ Characteristics: [ IMAGE_FILE_DEBUG_STRIPPED ]
+sections:
+symbols:
+ - !Symbol
+ Name: .file
+ Value: 0
+ SectionNumber: -2
+ SimpleType: IMAGE_SYM_TYPE_NULL
+ ComplexType: IMAGE_SYM_DTYPE_NULL
+ StorageClass: IMAGE_SYM_CLASS_FILE
+ File: eighteen-chars.obj
+ - !Symbol
+ Name: '@comp.id'
+ Value: 13485607
+ SectionNumber: -1
+ SimpleType: IMAGE_SYM_TYPE_NULL
+ ComplexType: IMAGE_SYM_DTYPE_NULL
+ StorageClass: IMAGE_SYM_CLASS_STATIC
diff --git a/llvm/test/tools/llvm-readobj/COFF/peplus.test b/llvm/test/tools/llvm-readobj/COFF/peplus.test
new file mode 100644
index 00000000000..ff21d91372b
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/peplus.test
@@ -0,0 +1,84 @@
+RUN: llvm-readobj --file-headers %p/Inputs/nop.exe.coff-x86-64 | FileCheck %s
+
+CHECK: Format: COFF-x86-64
+CHECK: Arch: x86_64
+CHECK: AddressSize: 64bit
+CHECK: ImageFileHeader {
+CHECK: Machine: IMAGE_FILE_MACHINE_AMD64 (0x8664)
+CHECK: SectionCount: 1
+CHECK: TimeDateStamp: 2014-01-26 03:43:56 (0x52E4847C)
+CHECK: PointerToSymbolTable: 0x0
+CHECK: SymbolCount: 0
+CHECK: OptionalHeaderSize: 240
+CHECK: Characteristics [ (0x22)
+CHECK: IMAGE_FILE_EXECUTABLE_IMAGE (0x2)
+CHECK: IMAGE_FILE_LARGE_ADDRESS_AWARE (0x20)
+CHECK: ]
+CHECK: }
+CHECK: ImageOptionalHeader {
+CHECK: Magic: 0x20B
+CHECK: MajorLinkerVersion: 11
+CHECK: MinorLinkerVersion: 0
+CHECK: SizeOfCode: 512
+CHECK: SizeOfInitializedData: 0
+CHECK: SizeOfUninitializedData: 0
+CHECK: AddressOfEntryPoint: 0x1000
+CHECK: BaseOfCode: 0x1000
+CHECK: ImageBase: 0x140000000
+CHECK: SectionAlignment: 4096
+CHECK: FileAlignment: 512
+CHECK: MajorOperatingSystemVersion: 6
+CHECK: MinorOperatingSystemVersion: 0
+CHECK: MajorImageVersion: 0
+CHECK: MinorImageVersion: 0
+CHECK: MajorSubsystemVersion: 6
+CHECK: MinorSubsystemVersion: 0
+CHECK: SizeOfImage: 8192
+CHECK: SizeOfHeaders: 512
+CHECK: Subsystem: IMAGE_SUBSYSTEM_WINDOWS_CUI (0x3)
+CHECK: Characteristics [ (0x8160)
+CHECK: IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE (0x40)
+CHECK: IMAGE_DLL_CHARACTERISTICS_HIGH_ENTROPY_VA (0x20)
+CHECK: IMAGE_DLL_CHARACTERISTICS_NX_COMPAT (0x100)
+CHECK: IMAGE_DLL_CHARACTERISTICS_TERMINAL_SERVER_AWARE (0x8000)
+CHECK: ]
+CHECK: SizeOfStackReserve: 1048576
+CHECK: SizeOfStackCommit: 4096
+CHECK: SizeOfHeapReserve: 1048576
+CHECK: SizeOfHeapCommit: 4096
+CHECK: NumberOfRvaAndSize: 16
+CHECK: DataDirectory {
+CHECK: ExportTableRVA: 0x0
+CHECK: ExportTableSize: 0x0
+CHECK: ImportTableRVA: 0x0
+CHECK: ImportTableSize: 0x0
+CHECK: ResourceTableRVA: 0x0
+CHECK: ResourceTableSize: 0x0
+CHECK: ExceptionTableRVA: 0x0
+CHECK: ExceptionTableSize: 0x0
+CHECK: CertificateTableRVA: 0x0
+CHECK: CertificateTableSize: 0x0
+CHECK: BaseRelocationTableRVA: 0x0
+CHECK: BaseRelocationTableSize: 0x0
+CHECK: DebugRVA: 0x0
+CHECK: DebugSize: 0x0
+CHECK: ArchitectureRVA: 0x0
+CHECK: ArchitectureSize: 0x0
+CHECK: GlobalPtrRVA: 0x0
+CHECK: GlobalPtrSize: 0x0
+CHECK: TLSTableRVA: 0x0
+CHECK: TLSTableSize: 0x0
+CHECK: LoadConfigTableRVA: 0x0
+CHECK: LoadConfigTableSize: 0x0
+CHECK: BoundImportRVA: 0x0
+CHECK: BoundImportSize: 0x0
+CHECK: IATRVA: 0x0
+CHECK: IATSize: 0x0
+CHECK: DelayImportDescriptorRVA: 0x0
+CHECK: DelayImportDescriptorSize: 0x0
+CHECK: CLRRuntimeHeaderRVA: 0x0
+CHECK: CLRRuntimeHeaderSize: 0x0
+CHECK: ReservedRVA: 0x0
+CHECK: ReservedSize: 0x0
+CHECK: }
+CHECK: }
diff --git a/llvm/test/tools/llvm-readobj/COFF/reloc-types-coff-i386.test b/llvm/test/tools/llvm-readobj/COFF/reloc-types-coff-i386.test
new file mode 100644
index 00000000000..466530c53ed
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/reloc-types-coff-i386.test
@@ -0,0 +1,63 @@
+## Test that llvm-readobj/llvm-readelf shows proper relocation type
+## names and values for coff-i386 target.
+
+# RUN: yaml2obj %s -o %t-coff-i386.o
+# RUN: llvm-readobj -r --expand-relocs %t-coff-i386.o | FileCheck %s
+
+# CHECK: Type: IMAGE_REL_I386_ABSOLUTE (0)
+# CHECK: Type: IMAGE_REL_I386_DIR16 (1)
+# CHECK: Type: IMAGE_REL_I386_REL16 (2)
+# CHECK: Type: IMAGE_REL_I386_DIR32 (6)
+# CHECK: Type: IMAGE_REL_I386_DIR32NB (7)
+# CHECK: Type: IMAGE_REL_I386_SEG12 (9)
+# CHECK: Type: IMAGE_REL_I386_SECTION (10)
+# CHECK: Type: IMAGE_REL_I386_SECREL (11)
+# CHECK: Type: IMAGE_REL_I386_TOKEN (12)
+# CHECK: Type: IMAGE_REL_I386_SECREL7 (13)
+# CHECK: Type: IMAGE_REL_I386_REL32 (20)
+
+--- !COFF
+header:
+ Machine: IMAGE_FILE_MACHINE_I386
+ Characteristics: [ ]
+sections:
+ - Name: .text
+ Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]
+ Alignment: 4
+ SectionData: 00
+ Relocations:
+ - VirtualAddress: 3
+ Type: IMAGE_REL_I386_ABSOLUTE
+ - VirtualAddress: 10
+ Type: IMAGE_REL_I386_DIR16
+ - VirtualAddress: 17
+ Type: IMAGE_REL_I386_REL16
+ - VirtualAddress: 24
+ Type: IMAGE_REL_I386_DIR32
+ - VirtualAddress: 31
+ Type: IMAGE_REL_I386_DIR32NB
+ - VirtualAddress: 38
+ Type: IMAGE_REL_I386_SEG12
+ - VirtualAddress: 45
+ Type: IMAGE_REL_I386_SECTION
+ - VirtualAddress: 52
+ Type: IMAGE_REL_I386_SECREL
+ - VirtualAddress: 59
+ Type: IMAGE_REL_I386_TOKEN
+ - VirtualAddress: 66
+ Type: IMAGE_REL_I386_SECREL7
+ - VirtualAddress: 73
+ Type: IMAGE_REL_I386_REL32
+symbols:
+ - Name: .text
+ Value: 0
+ SectionNumber: 1
+ SimpleType: IMAGE_SYM_TYPE_NULL
+ ComplexType: IMAGE_SYM_DTYPE_NULL
+ StorageClass: IMAGE_SYM_CLASS_STATIC
+ SectionDefinition:
+ Length: 77
+ NumberOfRelocations: 11
+ NumberOfLinenumbers: 0
+ CheckSum: 0
+ Number: 1
diff --git a/llvm/test/tools/llvm-readobj/COFF/reloc-types-coff-x64.test b/llvm/test/tools/llvm-readobj/COFF/reloc-types-coff-x64.test
new file mode 100644
index 00000000000..b78cc037073
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/reloc-types-coff-x64.test
@@ -0,0 +1,81 @@
+## Test that llvm-readobj/llvm-readelf shows proper relocation type
+## names and values for coff-x64 target.
+
+# RUN: yaml2obj %s -o %t-coff-x86_64.o
+# RUN: llvm-readobj -r --expand-relocs %t-coff-x86_64.o | FileCheck %s
+
+# CHECK: Type: IMAGE_REL_AMD64_ABSOLUTE (0)
+# CHECK: Type: IMAGE_REL_AMD64_ADDR64 (1)
+# CHECK: Type: IMAGE_REL_AMD64_ADDR32 (2)
+# CHECK: Type: IMAGE_REL_AMD64_ADDR32NB (3)
+# CHECK: Type: IMAGE_REL_AMD64_REL32 (4)
+# CHECK: Type: IMAGE_REL_AMD64_REL32_1 (5)
+# CHECK: Type: IMAGE_REL_AMD64_REL32_2 (6)
+# CHECK: Type: IMAGE_REL_AMD64_REL32_3 (7)
+# CHECK: Type: IMAGE_REL_AMD64_REL32_4 (8)
+# CHECK: Type: IMAGE_REL_AMD64_REL32_5 (9)
+# CHECK: Type: IMAGE_REL_AMD64_SECTION (10)
+# CHECK: Type: IMAGE_REL_AMD64_SECREL (11)
+# CHECK: Type: IMAGE_REL_AMD64_SECREL7 (12)
+# CHECK: Type: IMAGE_REL_AMD64_TOKEN (13)
+# CHECK: Type: IMAGE_REL_AMD64_SREL32 (14)
+# CHECK: Type: IMAGE_REL_AMD64_PAIR (15)
+# CHECK: Type: IMAGE_REL_AMD64_SSPAN32 (16)
+
+--- !COFF
+header:
+ Machine: IMAGE_FILE_MACHINE_AMD64
+ Characteristics: [ ]
+sections:
+ - Name: .text
+ Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]
+ Alignment: 4
+ SectionData: 00
+ Relocations:
+ - VirtualAddress: 4
+ Type: IMAGE_REL_AMD64_ABSOLUTE
+ - VirtualAddress: 12
+ Type: IMAGE_REL_AMD64_ADDR64
+ - VirtualAddress: 20
+ Type: IMAGE_REL_AMD64_ADDR32
+ - VirtualAddress: 28
+ Type: IMAGE_REL_AMD64_ADDR32NB
+ - VirtualAddress: 36
+ Type: IMAGE_REL_AMD64_REL32
+ - VirtualAddress: 44
+ Type: IMAGE_REL_AMD64_REL32_1
+ - VirtualAddress: 52
+ Type: IMAGE_REL_AMD64_REL32_2
+ - VirtualAddress: 60
+ Type: IMAGE_REL_AMD64_REL32_3
+ - VirtualAddress: 68
+ Type: IMAGE_REL_AMD64_REL32_4
+ - VirtualAddress: 76
+ Type: IMAGE_REL_AMD64_REL32_5
+ - VirtualAddress: 84
+ Type: IMAGE_REL_AMD64_SECTION
+ - VirtualAddress: 92
+ Type: IMAGE_REL_AMD64_SECREL
+ - VirtualAddress: 100
+ Type: IMAGE_REL_AMD64_SECREL7
+ - VirtualAddress: 108
+ Type: IMAGE_REL_AMD64_TOKEN
+ - VirtualAddress: 116
+ Type: IMAGE_REL_AMD64_SREL32
+ - VirtualAddress: 124
+ Type: IMAGE_REL_AMD64_PAIR
+ - VirtualAddress: 132
+ Type: IMAGE_REL_AMD64_SSPAN32
+symbols:
+ - Name: .text
+ Value: 0
+ SectionNumber: 1
+ SimpleType: IMAGE_SYM_TYPE_NULL
+ ComplexType: IMAGE_SYM_DTYPE_NULL
+ StorageClass: IMAGE_SYM_CLASS_STATIC
+ SectionDefinition:
+ Length: 136
+ NumberOfRelocations: 17
+ NumberOfLinenumbers: 0
+ CheckSum: 0
+ Number: 1
diff --git a/llvm/test/tools/llvm-readobj/COFF/reloc_overflow.test b/llvm/test/tools/llvm-readobj/COFF/reloc_overflow.test
new file mode 100644
index 00000000000..accb9e0ab55
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/reloc_overflow.test
@@ -0,0 +1,80 @@
+# RUN: llvm-readobj --sections %p/Inputs/xcoff-reloc-overflow.o | \
+# RUN: FileCheck --check-prefix=SECOVERFLOW %s
+
+# RUN: llvm-readobj --relocs --expand-relocs %p/Inputs/xcoff-reloc-overflow.o | \
+# RUN: FileCheck --check-prefix=RELOCOVERFLOW %s
+
+# SECOVERFLOW: File: {{.*}}xcoff-reloc-overflow.o
+# SECOVERFLOW-NEXT: Format: aixcoff-rs6000
+# SECOVERFLOW-NEXT: Arch: powerpc
+# SECOVERFLOW-NEXT: AddressSize: 32bit
+# SECOVERFLOW-NEXT: Sections [
+# SECOVERFLOW-NEXT: Section {
+# SECOVERFLOW-NEXT: Index: 1
+# SECOVERFLOW-NEXT: Name: .text
+# SECOVERFLOW-NEXT: PhysicalAddress: 0x0
+# SECOVERFLOW-NEXT: VirtualAddress: 0x0
+# SECOVERFLOW-NEXT: Size: 0x38
+# SECOVERFLOW-NEXT: RawDataOffset: 0x8C
+# SECOVERFLOW-NEXT: RelocationPointer: 0x0
+# SECOVERFLOW-NEXT: LineNumberPointer: 0x0
+# SECOVERFLOW-NEXT: NumberOfRelocations: 0
+# SECOVERFLOW-NEXT: NumberOfLineNumbers: 0
+# SECOVERFLOW-NEXT: Type: STYP_TEXT (0x20)
+# SECOVERFLOW-NEXT: }
+# SECOVERFLOW-NEXT: Section {
+# SECOVERFLOW-NEXT: Index: 2
+# SECOVERFLOW-NEXT: Name: .data
+# SECOVERFLOW-NEXT: PhysicalAddress: 0x38
+# SECOVERFLOW-NEXT: VirtualAddress: 0x38
+# SECOVERFLOW-NEXT: Size: 0x1C
+# SECOVERFLOW-NEXT: RawDataOffset: 0xC4
+# SECOVERFLOW-NEXT: RelocationPointer: 0xE0
+# SECOVERFLOW-NEXT: LineNumberPointer: 0x0
+# SECOVERFLOW-NEXT: NumberOfRelocations: 65535
+# SECOVERFLOW-NEXT: NumberOfLineNumbers: 65535
+# SECOVERFLOW-NEXT: Type: STYP_DATA (0x40)
+# SECOVERFLOW-NEXT: }
+# SECOVERFLOW-NEXT: Section {
+# SECOVERFLOW-NEXT: Index: 3
+# SECOVERFLOW-NEXT: Name: .ovrflo
+# SECOVERFLOW-NEXT: NumberOfRelocations: 3
+# SECOVERFLOW-NEXT: NumberOfLineNumbers: 3
+# SECOVERFLOW-NEXT: Size: 0x0
+# SECOVERFLOW-NEXT: RawDataOffset: 0x0
+# SECOVERFLOW-NEXT: RelocationPointer: 0xE0
+# SECOVERFLOW-NEXT: LineNumberPointer: 0x0
+# SECOVERFLOW-NEXT: IndexOfSectionOverflowed: 2
+# SECOVERFLOW-NEXT: IndexOfSectionOverflowed: 2
+# SECOVERFLOW-NEXT: Type: STYP_OVRFLO (0x8000)
+# SECOVERFLOW-NEXT: }
+# SECOVERFLOW-NEXT: ]
+
+# RELOCOVERFLOW: Relocations [
+# RELOCOVERFLOW-NEXT: Section (index: 2) .data {
+# RELOCOVERFLOW-NEXT: Relocation {
+# RELOCOVERFLOW-NEXT: Virtual Address: 0x38
+# RELOCOVERFLOW-NEXT: Symbol: .pb (4)
+# RELOCOVERFLOW-NEXT: IsSigned: No
+# RELOCOVERFLOW-NEXT: FixupBitValue: 0
+# RELOCOVERFLOW-NEXT: Length: 32
+# RELOCOVERFLOW-NEXT: Type: R_POS (0x0)
+# RELOCOVERFLOW-NEXT: }
+# RELOCOVERFLOW-NEXT: Relocation {
+# RELOCOVERFLOW-NEXT: Virtual Address: 0x3C
+# RELOCOVERFLOW-NEXT: Symbol: TOC (12)
+# RELOCOVERFLOW-NEXT: IsSigned: No
+# RELOCOVERFLOW-NEXT: FixupBitValue: 0
+# RELOCOVERFLOW-NEXT: Length: 32
+# RELOCOVERFLOW-NEXT: Type: R_POS (0x0)
+# RELOCOVERFLOW-NEXT: }
+# RELOCOVERFLOW-NEXT: Relocation {
+# RELOCOVERFLOW-NEXT: Virtual Address: 0x50
+# RELOCOVERFLOW-NEXT: Symbol: .text (2)
+# RELOCOVERFLOW-NEXT: IsSigned: No
+# RELOCOVERFLOW-NEXT: FixupBitValue: 0
+# RELOCOVERFLOW-NEXT: Length: 32
+# RELOCOVERFLOW-NEXT: Type: R_POS (0x0)
+# RELOCOVERFLOW-NEXT: }
+# RELOCOVERFLOW-NEXT: }
+# RELOCOVERFLOW-NEXT: ]
diff --git a/llvm/test/tools/llvm-readobj/COFF/res-resources.test b/llvm/test/tools/llvm-readobj/COFF/res-resources.test
new file mode 100644
index 00000000000..561eb4dc06f
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/res-resources.test
@@ -0,0 +1,163 @@
+// Check dumping of the resources stored in .res files.
+// The input was generated with the following commands, using the original Windows
+// rc.exe:
+// > rc /fo test_resource.res /nologo test_resource.rc
+
+// RUN: llvm-readobj %p/Inputs/resources/test_resource.res | FileCheck %s
+
+// CHECK: Resource type (int): ACCELERATOR (ID 9)
+// CHECK-NEXT: Resource name (string): MYACCELERATORS
+// CHECK-NEXT: Data version: 0
+// CHECK-NEXT: Memory flags: 0x30
+// CHECK-NEXT: Language ID: 1033
+// CHECK-NEXT: Version (major): 0
+// CHECK-NEXT: Version (minor): 0
+// CHECK-NEXT: Characteristics: 0
+// CHECK-NEXT: Data size: 24
+// CHECK-NEXT: Data: (
+// CHECK-NEXT: 0000: 11000300 E7030000 0D004400 4C040000 |..........D.L...|
+// CHECK-NEXT: 0010: 82001200 BC010000 |........|
+// CHECK-NEXT: )
+
+// CHECK-DAG: Resource type (int): BITMAP (ID 2)
+// CHECK-NEXT: Resource name (string): CURSOR
+// CHECK-NEXT: Data version: 0
+// CHECK-NEXT: Memory flags: 0x30
+// CHECK-NEXT: Language ID: 1033
+// CHECK-NEXT: Version (major): 0
+// CHECK-NEXT: Version (minor): 0
+// CHECK-NEXT: Characteristics: 0
+// CHECK-NEXT: Data size: 808
+// CHECK-NEXT: Data: (
+// CHECK-NEXT: 0000: 28000000 10000000 10000000 01001800 |(...............|
+// CHECK-NEXT: 0010: 00000000 00030000 C40E0000 C40E0000 |................|
+// CHECK-NEXT: 0020: 00000000 00000000 FFFFFFFF FFFFFFFF |................|
+// CHECK-NEXT: 0030: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF |................|
+// CHECK-NEXT: 0040: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF |................|
+// CHECK-NEXT: 0050: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF |................|
+// CHECK-NEXT: 0060: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF |................|
+// CHECK-NEXT: 0070: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF |................|
+// CHECK-NEXT: 0080: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF |................|
+// CHECK-NEXT: 0090: FFFFFFFF FFFFFFFF FFFFFFFF FF7F7F7F |................|
+// CHECK-NEXT: 00A0: 7C7C7C78 78787575 75FFFFFF FFFFFFFF ||||xxxuuu.......|
+// CHECK-NEXT: 00B0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF |................|
+// CHECK-NEXT: 00C0: FFFFFFFF 979797FF FFFFFFFF FF838383 |................|
+// CHECK-NEXT: 00D0: AAAAAADB DBDB7979 79757575 FFFFFFFF |......yyyuuu....|
+// CHECK-NEXT: 00E0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF |................|
+// CHECK-NEXT: 00F0: FFFFFFFF 9C9C9C98 9898FFFF FF888888 |................|
+// CHECK-NEXT: 0100: DBDBDBB7 B7B77D7D 7DFFFFFF FFFFFFFF |......}}}.......|
+// CHECK-NEXT: 0110: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF |................|
+// CHECK-NEXT: 0120: FFFFFFFF A0A0A09C 9C9C9393 93ADADAD |................|
+// CHECK-NEXT: 0130: F2F2F284 84848181 81FFFFFF FFFFFFFF |................|
+// CHECK-NEXT: 0140: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF |................|
+// CHECK-NEXT: 0150: FFFFFFFF A4A4A4D7 D7D79D9D 9DD0D0D0 |................|
+// CHECK-NEXT: 0160: EEEEEE91 91918D8D 8DFFFFFF FFFFFF81 |................|
+// CHECK-NEXT: 0170: 81817E7E 7EFFFFFF FFFFFFFF FFFFFFFF |..~~~...........|
+// CHECK-NEXT: 0180: FFFFFFFF A9A9A9F2 F2F2E5E5 E5E2E2E2 |................|
+// CHECK-NEXT: 0190: 95959591 91918D8D 8D898989 868686FF |................|
+// CHECK-NEXT: 01A0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF |................|
+// CHECK-NEXT: 01B0: FFFFFFFF ADADADF2 F2F2E1E1 E1DFDFDF |................|
+// CHECK-NEXT: 01C0: E7E7E7E4 E4E4BBBB BB8E8E8E FFFFFFFF |................|
+// CHECK-NEXT: 01D0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF |................|
+// CHECK-NEXT: 01E0: FFFFFFFF B5B5B5F2 F2F2E8E8 E8E7E7E7 |................|
+// CHECK-NEXT: 01F0: EAEAEAC6 C6C69E9E 9EFFFFFF FFFFFFFF |................|
+// CHECK-NEXT: 0200: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF |................|
+// CHECK-NEXT: 0210: FFFFFFFF B9B9B9F4 F4F4ECEC ECEDEDED |................|
+// CHECK-NEXT: 0220: CBCBCBA7 A7A7FFFF FFFFFFFF FFFFFFFF |................|
+// CHECK-NEXT: 0230: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF |................|
+// CHECK-NEXT: 0240: FFFFFFFF BDBDBDF7 F7F7EFEF EFD0D0D0 |................|
+// CHECK-NEXT: 0250: AFAFAFFF FFFFFFFF FFFFFFFF FFFFFFFF |................|
+// CHECK-NEXT: 0260: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF |................|
+// CHECK-NEXT: 0270: FFFFFFFF C1C1C1F7 F7F7D5D5 D5B6B6B6 |................|
+// CHECK-NEXT: 0280: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF |................|
+// CHECK-NEXT: 0290: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF |................|
+// CHECK-NEXT: 02A0: FFFFFFFF C4C4C4D9 D9D9BEBE BEFFFFFF |................|
+// CHECK-NEXT: 02B0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF |................|
+// CHECK-NEXT: 02C0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF |................|
+// CHECK-NEXT: 02D0: FFFFFFFF C8C8C8C5 C5C5FFFF FFFFFFFF |................|
+// CHECK-NEXT: 02E0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF |................|
+// CHECK-NEXT: 02F0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF |................|
+// CHECK-NEXT: 0300: FFFFFFFF CBCBCBFF FFFFFFFF FFFFFFFF |................|
+// CHECK-NEXT: 0310: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF |................|
+// CHECK-NEXT: 0320: FFFFFFFF FFFFFFFF |........|
+// CHECK-NEXT: )
+
+// CHECK-DAG: Resource type (int): BITMAP (ID 2)
+// CHECK-NEXT: Resource name (string): OKAY
+// CHECK-NEXT: Data version: 0
+// CHECK-NEXT: Memory flags: 0x30
+// CHECK-NEXT: Language ID: 1033
+// CHECK-NEXT: Version (major): 0
+// CHECK-NEXT: Version (minor): 0
+// CHECK-NEXT: Characteristics: 0
+// CHECK-NEXT: Data size: 808
+// CHECK-NEXT: Data: (
+// CHECK-NEXT: 0000: 28000000 10000000 10000000 01001800 |(...............|
+// CHECK-NEXT: 0010: 00000000 00030000 C40E0000 C40E0000 |................|
+// (...)
+// CHECK-DAG: 0310: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF |................|
+// CHECK-NEXT: 0320: FFFFFFFF FFFFFFFF |........|
+// CHECK-NEXT: )
+
+// CHECK-DAG: Resource type (int): MENU (ID 4)
+// CHECK-NEXT: Resource name (int): 14432
+// CHECK-NEXT: Data version: 0
+// CHECK-NEXT: Memory flags: 0x1030
+// CHECK-NEXT: Language ID: 2052
+// CHECK-NEXT: Version (major): 0
+// CHECK-NEXT: Version (minor): 0
+// CHECK-NEXT: Characteristics: 0
+// CHECK-NEXT: Data size: 46
+// CHECK-NEXT: Data: (
+// CHECK-NEXT: 0000: 00000000 00006400 79007500 00000000 |......d.y.u.....|
+// CHECK-NEXT: 0010: 65007300 68006100 6C006100 00008000 |e.s.h.a.l.a.....|
+// CHECK-NEXT: 0020: 66006B00 61006F00 79006100 0000 |f.k.a.o.y.a...|
+// CHECK-NEXT: )
+
+// CHECK-DAG: Resource type (int): DIALOG (ID 5)
+// CHECK-NEXT: Resource name (string): TESTDIALOG
+// CHECK-NEXT: Data version: 0
+// CHECK-NEXT: Memory flags: 0x1030
+// CHECK-NEXT: Language ID: 1033
+// CHECK-NEXT: Version (major): 0
+// CHECK-NEXT: Version (minor): 0
+// CHECK-NEXT: Characteristics: 0
+// CHECK-NEXT: Data size: 108
+// CHECK-NEXT: Data: (
+// CHECK-NEXT: 0000: 0000C080 00000000 02000A00 0A00C800 |................|
+// CHECK-NEXT: 0010: 2C010000 00005400 65007300 74000000 |,.....T.e.s.t...|
+// CHECK-NEXT: 0020: 01000250 00000000 0A000A00 E6000E00 |...P............|
+// CHECK-NEXT: 0030: 0100FFFF 82004300 6F006E00 74006900 |......C.o.n.t.i.|
+// CHECK-NEXT: 0040: 6E007500 65003A00 00000000 00000150 |n.u.e.:........P|
+// CHECK-NEXT: 0050: 00000000 42008600 A1000D00 0200FFFF |....B...........|
+// CHECK-NEXT: 0060: 80002600 4F004B00 00000000 |..&.O.K.....|
+// CHECK-NEXT: )
+
+// CHECK-DAG: Resource type (int): ACCELERATOR (ID 9)
+// CHECK-NEXT: Resource name (int): 12
+// CHECK-NEXT: Data version: 0
+// CHECK-NEXT: Memory flags: 0x30
+// CHECK-NEXT: Language ID: 1033
+// CHECK-NEXT: Version (major): 0
+// CHECK-NEXT: Version (minor): 0
+// CHECK-NEXT: Characteristics: 0
+// CHECK-NEXT: Data size: 24
+// CHECK-NEXT: Data: (
+// CHECK-NEXT: 0000: 11005800 A4000000 0D004800 2E160000 |..X.......H.....|
+// CHECK-NEXT: 0010: 82001200 BC010000 |........|
+// CHECK-NEXT: )
+
+// CHECK-DAG: Resource type (int): MENU (ID 4)
+// CHECK-NEXT: Resource name (string): "EAT"
+// CHECK-NEXT: Data version: 0
+// CHECK-NEXT: Memory flags: 0x1030
+// CHECK-NEXT: Language ID: 3081
+// CHECK-NEXT: Version (major): 0
+// CHECK-NEXT: Version (minor): 0
+// CHECK-NEXT: Characteristics: 0
+// CHECK-NEXT: Data size: 48
+// CHECK-NEXT: Data: (
+// CHECK-NEXT: 0000: 00000000 00006400 66006900 73006800 |......d.f.i.s.h.|
+// CHECK-NEXT: 0010: 00000000 65007300 61006C00 61006400 |....e.s.a.l.a.d.|
+// CHECK-NEXT: 0020: 00008000 66006400 75006300 6B000000 |....f.d.u.c.k...|
+// CHECK-NEXT: )
diff --git a/llvm/test/tools/llvm-readobj/COFF/resources.test b/llvm/test/tools/llvm-readobj/COFF/resources.test
new file mode 100644
index 00000000000..0d91755a668
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/resources.test
@@ -0,0 +1,210 @@
+// Check dumping of the .rsrc section(s)
+// The input was generated with the following commands, using the original Windows
+// rc.exe and cvtres.exe:
+// > rc /fo test_resource.res /nologo test_resource.rc
+// > cvtres /machine:X86 /readonly /nologo /out:test_resource.o test_resource.res
+
+RUN: llvm-readobj --coff-resources --section-data %p/Inputs/zero-string-table.obj.coff-i386 \
+RUN: | FileCheck %s -check-prefix ZERO
+RUN: llvm-readobj --coff-resources %p/Inputs/resources/test_resource.obj.coff \
+RUN: | FileCheck %s -check-prefix TEST_RES
+
+ZERO: Resources [
+ZERO-NEXT: Total Number of Resources: 1
+ZERO-NEXT: Base Table Address: 0x188
+ZERO-DAG: Number of String Entries: 0
+ZERO-NEXT: Number of ID Entries: 1
+ZERO-NEXT: Type: STRINGTABLE (ID 6) [
+ZERO-NEXT: Table Offset: 0x18
+ZERO-NEXT: Number of String Entries: 0
+ZERO-NEXT: Number of ID Entries: 1
+ZERO-NEXT: Name: (ID 1) [
+ZERO-NEXT: Table Offset: 0x30
+ZERO-NEXT: Number of String Entries: 0
+ZERO-NEXT: Number of ID Entries: 1
+ZERO-NEXT: Language: (ID 1033) [
+ZERO-NEXT: Entry Offset: 0x48
+ZERO-NEXT: Time/Date Stamp: 1970-01-01 00:00:00 (0x0)
+ZERO-NEXT: Major Version: 0
+ZERO-NEXT: Minor Version: 0
+ZERO-NEXT: Characteristics: 0
+ZERO-NEXT: Data [
+ZERO-NEXT: DataRVA: 0x0
+ZERO-NEXT: DataSize: 42
+ZERO-NEXT: Codepage: 0
+ZERO-NEXT: Reserved: 0
+ZERO-NEXT: Data (
+ZERO-NEXT: 0000: 00000500 48006500 6C006C00 6F000000 |....H.e.l.l.o...|
+ZERO-NEXT: 0010: 00000000 00000000 00000000 00000000 |................|
+ZERO-NEXT: 0020: 00000000 00000000 0000 |..........|
+ZERO-NEXT: )
+ZERO-NEXT: ]
+ZERO-NEXT: ]
+ZERO-NEXT: ]
+ZERO-NEXT: ]
+
+TEST_RES: Resources [
+TEST_RES-NEXT: Total Number of Resources: 7
+TEST_RES-NEXT: Base Table Address: 0x1C0
+TEST_RES-DAG: Number of String Entries: 0
+TEST_RES-NEXT: Number of ID Entries: 4
+TEST_RES-NEXT: Type: BITMAP (ID 2) [
+TEST_RES-NEXT: Table Offset: 0x30
+TEST_RES-NEXT: Number of String Entries: 2
+TEST_RES-NEXT: Number of ID Entries: 0
+TEST_RES-NEXT: Name: CURSOR [
+TEST_RES-NEXT: Table Offset: 0xA8
+TEST_RES-NEXT: Number of String Entries: 0
+TEST_RES-NEXT: Number of ID Entries: 1
+TEST_RES-NEXT: Language: (ID 1033) [
+TEST_RES-NEXT: Entry Offset: 0x150
+TEST_RES-NEXT: Time/Date Stamp: 1970-01-01 00:00:00 (0x0)
+TEST_RES-NEXT: Major Version: 0
+TEST_RES-NEXT: Minor Version: 0
+TEST_RES-NEXT: Characteristics: 0
+TEST_RES-NEXT: Data [
+TEST_RES-NEXT: DataRVA: 0x0
+TEST_RES-NEXT: DataSize: 808
+TEST_RES-NEXT: Codepage: 0
+TEST_RES-NEXT: Reserved: 0
+TEST_RES-NEXT: Data (
+TEST_RES: )
+TEST_RES-NEXT: ]
+TEST_RES-NEXT: ]
+TEST_RES-NEXT: ]
+TEST_RES-NEXT: Name: OKAY [
+TEST_RES-NEXT: Table Offset: 0xC0
+TEST_RES-NEXT: Number of String Entries: 0
+TEST_RES-NEXT: Number of ID Entries: 1
+TEST_RES-NEXT: Language: (ID 1033) [
+TEST_RES-NEXT: Entry Offset: 0x160
+TEST_RES-NEXT: Time/Date Stamp: 1970-01-01 00:00:00 (0x0)
+TEST_RES-NEXT: Major Version: 0
+TEST_RES-NEXT: Minor Version: 0
+TEST_RES-NEXT: Characteristics: 0
+TEST_RES-NEXT: Data [
+TEST_RES-NEXT: DataRVA: 0x0
+TEST_RES-NEXT: DataSize: 808
+TEST_RES-NEXT: Codepage: 0
+TEST_RES-NEXT: Reserved: 0
+TEST_RES-NEXT: Data (
+TEST_RES: )
+TEST_RES-NEXT: ]
+TEST_RES-NEXT: ]
+TEST_RES-NEXT: ]
+TEST_RES-NEXT: ]
+TEST_RES-NEXT: Type: MENU (ID 4) [
+TEST_RES-NEXT: Table Offset: 0x50
+TEST_RES-NEXT: Number of String Entries: 1
+TEST_RES-NEXT: Number of ID Entries: 1
+TEST_RES-NEXT: Name: "EAT" [
+TEST_RES-NEXT: Table Offset: 0xD8
+TEST_RES-NEXT: Number of String Entries: 0
+TEST_RES-NEXT: Number of ID Entries: 1
+TEST_RES-NEXT: Language: (ID 3081) [
+TEST_RES-NEXT: Entry Offset: 0x170
+TEST_RES-NEXT: Time/Date Stamp: 1970-01-01 00:00:00 (0x0)
+TEST_RES-NEXT: Major Version: 0
+TEST_RES-NEXT: Minor Version: 0
+TEST_RES-NEXT: Characteristics: 0
+TEST_RES-NEXT: Data [
+TEST_RES-NEXT: DataRVA: 0x0
+TEST_RES-NEXT: DataSize: 48
+TEST_RES-NEXT: Codepage: 0
+TEST_RES-NEXT: Reserved: 0
+TEST_RES-NEXT: Data (
+TEST_RES: )
+TEST_RES-NEXT: ]
+TEST_RES-NEXT: ]
+TEST_RES-NEXT: ]
+TEST_RES-NEXT: Name: (ID 14432) [
+TEST_RES-NEXT: Table Offset: 0xF0
+TEST_RES-NEXT: Number of String Entries: 0
+TEST_RES-NEXT: Number of ID Entries: 1
+TEST_RES-NEXT: Language: (ID 2052) [
+TEST_RES-NEXT: Entry Offset: 0x180
+TEST_RES-NEXT: Time/Date Stamp: 1970-01-01 00:00:00 (0x0)
+TEST_RES-NEXT: Major Version: 0
+TEST_RES-NEXT: Minor Version: 0
+TEST_RES-NEXT: Characteristics: 0
+TEST_RES-NEXT: Data [
+TEST_RES-NEXT: DataRVA: 0x0
+TEST_RES-NEXT: DataSize: 46
+TEST_RES-NEXT: Codepage: 0
+TEST_RES-NEXT: Reserved: 0
+TEST_RES-NEXT: Data (
+TEST_RES: )
+TEST_RES-NEXT: ]
+TEST_RES-NEXT: ]
+TEST_RES-NEXT: ]
+TEST_RES-NEXT: ]
+TEST_RES-NEXT: Type: DIALOG (ID 5) [
+TEST_RES-NEXT: Table Offset: 0x70
+TEST_RES-NEXT: Number of String Entries: 1
+TEST_RES-NEXT: Number of ID Entries: 0
+TEST_RES-NEXT: Name: TESTDIALOG [
+TEST_RES-NEXT: Table Offset: 0x108
+TEST_RES-NEXT: Number of String Entries: 0
+TEST_RES-NEXT: Number of ID Entries: 1
+TEST_RES-NEXT: Language: (ID 1033) [
+TEST_RES-NEXT: Entry Offset: 0x190
+TEST_RES-NEXT: Time/Date Stamp: 1970-01-01 00:00:00 (0x0)
+TEST_RES-NEXT: Major Version: 0
+TEST_RES-NEXT: Minor Version: 0
+TEST_RES-NEXT: Characteristics: 0
+TEST_RES-NEXT: Data [
+TEST_RES-NEXT: DataRVA: 0x0
+TEST_RES-NEXT: DataSize: 108
+TEST_RES-NEXT: Codepage: 0
+TEST_RES-NEXT: Reserved: 0
+TEST_RES-NEXT: Data (
+TEST_RES: )
+TEST_RES-NEXT: ]
+TEST_RES-NEXT: ]
+TEST_RES-NEXT: ]
+TEST_RES-NEXT: ]
+TEST_RES-NEXT: Type: ACCELERATOR (ID 9) [
+TEST_RES-NEXT: Table Offset: 0x88
+TEST_RES-NEXT: Number of String Entries: 1
+TEST_RES-NEXT: Number of ID Entries: 1
+TEST_RES-NEXT: Name: MYACCELERATORS [
+TEST_RES-NEXT: Table Offset: 0x120
+TEST_RES-NEXT: Number of String Entries: 0
+TEST_RES-NEXT: Number of ID Entries: 1
+TEST_RES-NEXT: Language: (ID 1033) [
+TEST_RES-NEXT: Entry Offset: 0x1A0
+TEST_RES-NEXT: Time/Date Stamp: 1970-01-01 00:00:00 (0x0)
+TEST_RES-NEXT: Major Version: 0
+TEST_RES-NEXT: Minor Version: 0
+TEST_RES-NEXT: Characteristics: 0
+TEST_RES-NEXT: Data [
+TEST_RES-NEXT: DataRVA: 0x0
+TEST_RES-NEXT: DataSize: 24
+TEST_RES-NEXT: Codepage: 0
+TEST_RES-NEXT: Reserved: 0
+TEST_RES-NEXT: Data (
+TEST_RES: )
+TEST_RES-NEXT: ]
+TEST_RES-NEXT: ]
+TEST_RES-NEXT: ]
+TEST_RES-NEXT: Name: (ID 12) [
+TEST_RES-NEXT: Table Offset: 0x138
+TEST_RES-NEXT: Number of String Entries: 0
+TEST_RES-NEXT: Number of ID Entries: 1
+TEST_RES-NEXT: Language: (ID 1033) [
+TEST_RES-NEXT: Entry Offset: 0x1B0
+TEST_RES-NEXT: Time/Date Stamp: 1970-01-01 00:00:00 (0x0)
+TEST_RES-NEXT: Major Version: 0
+TEST_RES-NEXT: Minor Version: 0
+TEST_RES-NEXT: Characteristics: 0
+TEST_RES-NEXT: Data [
+TEST_RES-NEXT: DataRVA: 0x0
+TEST_RES-NEXT: DataSize: 24
+TEST_RES-NEXT: Codepage: 0
+TEST_RES-NEXT: Reserved: 0
+TEST_RES-NEXT: Data (
+TEST_RES: )
+TEST_RES-NEXT: ]
+TEST_RES-NEXT: ]
+TEST_RES-NEXT: ]
+TEST_RES-NEXT: ]
diff --git a/llvm/test/tools/llvm-readobj/COFF/unwind-arm64-windows.test b/llvm/test/tools/llvm-readobj/COFF/unwind-arm64-windows.test
new file mode 100644
index 00000000000..17d05163346
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/unwind-arm64-windows.test
@@ -0,0 +1,69 @@
+RUN: llvm-readobj --unwind %p/Inputs/arm64-win1.obj | FileCheck %s -check-prefix=UNWIND1
+RUN: llvm-readobj --unwind %p/Inputs/arm64-win2.obj | FileCheck %s -check-prefix=UNWIND2
+
+UNWIND1: ExceptionData {
+UNWIND1-NEXT: FunctionLength: 340
+UNWIND1-NEXT: Version: 0
+UNWIND1-NEXT: ExceptionData: No
+UNWIND1-NEXT: EpiloguePacked: Yes
+UNWIND1-NEXT: EpilogueOffset: 15
+UNWIND1-NEXT: ByteCodeLength: 28
+UNWIND1-NEXT: Prologue [
+UNWIND1-NEXT: 0xe002dac8 ; sub sp, #2993280
+UNWIND1-NEXT: 0xe3 ; nop
+UNWIND1-NEXT: 0xe3 ; nop
+UNWIND1-NEXT: 0xe3 ; nop
+UNWIND1-NEXT: 0xd885 ; stp d10, d11, [sp, #40]
+UNWIND1-NEXT: 0xd803 ; stp d8, d9, [sp, #24]
+UNWIND1-NEXT: 0xd2c2 ; str x30, [sp, #16]
+UNWIND1-NEXT: 0x28 ; stp x19, x20, [sp, #-64]!
+UNWIND1-NEXT: 0xe4 ; end
+UNWIND1-NEXT: ]
+UNWIND1-NEXT: Epilogue [
+UNWIND1-NEXT: 0xe002dac8 ; add sp, #2993280
+UNWIND1-NEXT: 0xd885 ; ldp d10, d11, [sp, #40]
+UNWIND1-NEXT: 0xd803 ; ldp d8, d9, [sp, #24]
+UNWIND1-NEXT: 0xd2c2 ; ldr x30, [sp, #16]
+UNWIND1-NEXT: 0x28 ; ldp x19, x20, [sp], #64
+UNWIND1-NEXT: 0xe4 ; end
+UNWIND1-NEXT: ]
+UNWIND1_NEXT: }
+
+
+UNWIND2: ExceptionData {
+UNWIND2-NEXT: FunctionLength: 72
+UNWIND2-NEXT: Version: 0
+UNWIND2-NEXT: ExceptionData: No
+UNWIND2-NEXT: EpiloguePacked: No
+UNWIND2-NEXT: EpilogueScopes: 2
+UNWIND2-NEXT: ByteCodeLength: 8
+UNWIND2-NEXT: Prologue [
+UNWIND2-NEXT: 0x1f ; sub sp, #496
+UNWIND2-NEXT: 0xd600 ; stp x19, lr, [sp, #0]
+UNWIND2-NEXT: 0x01 ; sub sp, #16
+UNWIND2-NEXT: 0xe4 ; end
+UNWIND2-NEXT: ]
+UNWIND2-NEXT: EpilogueScopes [
+UNWIND2-NEXT: EpilogueScope {
+UNWIND2-NEXT: StartOffset: 8
+UNWIND2-NEXT: EpilogueStartIndex: 0
+UNWIND2-NEXT: Opcodes [
+UNWIND2-NEXT: 0x1f ; add sp, #496
+UNWIND2-NEXT: 0xd600 ; ldp x19, lr, [sp, #0]
+UNWIND2-NEXT: 0x01 ; add sp, #16
+UNWIND2-NEXT: 0xe4 ; end
+UNWIND2-NEXT: ]
+UNWIND2-NEXT: }
+UNWIND2-NEXT: EpilogueScope {
+UNWIND2-NEXT: StartOffset: 14
+UNWIND2-NEXT: EpilogueStartIndex: 0
+UNWIND2-NEXT: Opcodes [
+UNWIND2-NEXT: 0x1f ; add sp, #496
+UNWIND2-NEXT: 0xd600 ; ldp x19, lr, [sp, #0]
+UNWIND2-NEXT: 0x01 ; add sp, #16
+UNWIND2-NEXT: 0xe4 ; end
+UNWIND2-NEXT: ]
+UNWIND2-NEXT: }
+UNWIND2-NEXT: ]
+UNWIND2-NEXT: }
+
diff --git a/llvm/test/tools/llvm-readobj/COFF/xcoff-basic.test b/llvm/test/tools/llvm-readobj/COFF/xcoff-basic.test
new file mode 100644
index 00000000000..8219f20e53d
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/xcoff-basic.test
@@ -0,0 +1,160 @@
+# RUN: llvm-readobj --file-header %p/Inputs/xcoff-basic.o | \
+# RUN: FileCheck --check-prefix=FILEHEADER %s
+#
+# RUN: llvm-readobj --file-header %p/Inputs/xcoff-basic-64.o | \
+# RUN: FileCheck --check-prefix=FILEHEADER64 %s
+
+# RUN: llvm-readobj --file-header %p/Inputs/xcoff-basic-neg-time.o | \
+# RUN: FileCheck --check-prefix=NEGTIME %s
+
+# RUN: llvm-readobj --file-header %p/Inputs/xcoff-basic-neg-sym-count.o | \
+# RUN: FileCheck --check-prefix=NEGSYMCOUNT %s
+
+# RUN: llvm-readobj --relocs --expand-relocs %p/Inputs/xcoff-basic.o | \
+# RUN: FileCheck --check-prefix=RELOCSEXP %s
+
+# FILEHEADER: File: {{.*}}xcoff-basic.o
+# FILEHEADER-NEXT: Format: aixcoff-rs6000
+# FILEHEADER-NEXT: Arch: powerpc
+# FILEHEADER-NEXT: AddressSize: 32bit
+# FILEHEADER-NEXT: FileHeader {
+# FILEHEADER-NEXT: Magic: 0x1DF
+# FILEHEADER-NEXT: NumberOfSections: 6
+# FILEHEADER-NEXT: TimeStamp: 2019-03-12T14:04:43Z (0x5C87BC7B)
+# FILEHEADER-NEXT: SymbolTableOffset: 0x52E
+# FILEHEADER-NEXT: SymbolTableEntries: 120
+# FILEHEADER-NEXT: OptionalHeaderSize: 0x1C
+# FILEHEADER-NEXT: Flags: 0x0
+# FILEHEADER-NEXT: }
+
+# FILEHEADER64: File: {{.*}}xcoff-basic-64.o
+# FILEHEADER64-NEXT: Format: aix5coff64-rs6000
+# FILEHEADER64-NEXT: Arch: powerpc64
+# FILEHEADER64-NEXT: AddressSize: 64bit
+# FILEHEADER64-NEXT: FileHeader {
+# FILEHEADER64-NEXT: Magic: 0x1F7
+# FILEHEADER64-NEXT: NumberOfSections: 5
+# FILEHEADER64-NEXT: TimeStamp: 2019-03-18T20:03:47Z (0x5C8FF9A3)
+# FILEHEADER64-NEXT: SymbolTableOffset: 0x54C
+# FILEHEADER64-NEXT: SymbolTableEntries: 58
+# FILEHEADER64-NEXT: OptionalHeaderSize: 0x0
+# FILEHEADER64-NEXT: Flags: 0x0
+# FILEHEADER64-NEXT: }
+
+# NEGTIME: File: {{.*}}xcoff-basic-neg-time.o
+# NEGTIME-NEXT: Format: aixcoff-rs6000
+# NEGTIME-NEXT: Arch: powerpc
+# NEGTIME-NEXT: AddressSize: 32bit
+# NEGTIME-NEXT: FileHeader {
+# NEGTIME-NEXT: Magic: 0x1DF
+# NEGTIME-NEXT: NumberOfSections: 6
+# NEGTIME-NEXT: TimeStamp: Reserved Value (0xDC87BC7B)
+# NEGTIME-NEXT: SymbolTableOffset: 0x52E
+# NEGTIME-NEXT: SymbolTableEntries: 120
+# NEGTIME-NEXT: OptionalHeaderSize: 0x1C
+# NEGTIME-NEXT: Flags: 0x0
+# NEGTIME-NEXT: }
+
+# NEGSYMCOUNT: File: {{.*}}xcoff-basic-neg-sym-count.o
+# NEGSYMCOUNT-NEXT: Format: aixcoff-rs6000
+# NEGSYMCOUNT-NEXT: Arch: powerpc
+# NEGSYMCOUNT-NEXT: AddressSize: 32bit
+# NEGSYMCOUNT-NEXT: FileHeader {
+# NEGSYMCOUNT-NEXT: Magic: 0x1DF
+# NEGSYMCOUNT-NEXT: NumberOfSections: 5
+# NEGSYMCOUNT-NEXT: TimeStamp: 2019-03-12T14:04:43Z (0x5C87BC7B)
+# NEGSYMCOUNT-NEXT: SymbolTableOffset: 0x0
+# NEGSYMCOUNT-NEXT: SymbolTableEntries: Reserved Value (0x80000000)
+# NEGSYMCOUNT-NEXT: OptionalHeaderSize: 0x1C
+# NEGSYMCOUNT-NEXT: Flags: 0xD
+# NEGSYMCOUNT-NEXT: }
+
+# xcoff-basic.o was compiled with `xlc -qtls -O3 -g -c xcoff-basic.c`
+# from the following source:
+# int a = 55;
+# int b;
+# __thread int j = 55;
+# __thread double d;
+# int A() { return a; }
+# int B() { return b; }
+# int J() { return j; }
+# double D() { return d; }
+#
+# xcoff-basic-neg-time.o was manually edited to include a negative time stamp.
+# xcoff-basic-neg-sym-count.o was stripped using the 'strip' utility, and
+# manually edited to have a negative symbol table entry count.
+
+# RELOCSEXP: File: {{.*}}xcoff-basic.o
+# RELOCSEXP-NEXT: Format: aixcoff-rs6000
+# RELOCSEXP-NEXT: Arch: powerpc
+# RELOCSEXP-NEXT: AddressSize: 32bit
+# RELOCSEXP-NEXT: Relocations [
+# RELOCSEXP-NEXT: Section (index: 1) .text {
+# RELOCSEXP-NEXT: Relocation {
+# RELOCSEXP-NEXT: Virtual Address: 0x2
+# RELOCSEXP-NEXT: Symbol: a (85)
+# RELOCSEXP-NEXT: IsSigned: Yes
+# RELOCSEXP-NEXT: FixupBitValue: 0
+# RELOCSEXP-NEXT: Length: 16
+# RELOCSEXP-NEXT: Type: R_TOC (0x3)
+# RELOCSEXP-NEXT: }
+
+# RELOCSEXP: Virtual Address: 0x90
+# RELOCSEXP-NEXT: Symbol: .__tls_get_addr (118)
+# RELOCSEXP-NEXT: IsSigned: Yes
+# RELOCSEXP-NEXT: FixupBitValue: 0
+# RELOCSEXP-NEXT: Length: 26
+# RELOCSEXP-NEXT: Type: R_RBA (0x18)
+# RELOCSEXP-NEXT: }
+# RELOCSEXP-NEXT: }
+# RELOCSEXP-NEXT: Section (index: 2) .data {
+# RELOCSEXP-NEXT: Relocation {
+# RELOCSEXP-NEXT: Virtual Address: 0x100
+# RELOCSEXP-NEXT: Symbol: A (78)
+# RELOCSEXP-NEXT: IsSigned: No
+# RELOCSEXP-NEXT: FixupBitValue: 0
+# RELOCSEXP-NEXT: Length: 32
+# RELOCSEXP-NEXT: Type: R_POS (0x0)
+# RELOCSEXP-NEXT: }
+
+# RELOCSEXP: Virtual Address: 0x110
+# RELOCSEXP-NEXT: Symbol: J (96)
+# RELOCSEXP-NEXT: IsSigned: No
+# RELOCSEXP-NEXT: FixupBitValue: 0
+# RELOCSEXP-NEXT: Length: 32
+# RELOCSEXP-NEXT: Type: R_POS (0x0)
+# RELOCSEXP-NEXT: }
+
+# RELOCSEXP: Virtual Address: 0x114
+# RELOCSEXP-NEXT: Symbol: j (100)
+# RELOCSEXP-NEXT: IsSigned: No
+# RELOCSEXP-NEXT: FixupBitValue: 0
+# RELOCSEXP-NEXT: Length: 32
+# RELOCSEXP-NEXT: Type: R_TLS (0x20)
+# RELOCSEXP-NEXT: }
+
+# RELOCSEXP: Virtual Address: 0x124
+# RELOCSEXP-NEXT: Symbol: d (111)
+# RELOCSEXP-NEXT: IsSigned: No
+# RELOCSEXP-NEXT: FixupBitValue: 0
+# RELOCSEXP-NEXT: Length: 32
+# RELOCSEXP-NEXT: Type: R_TLSM (0x24)
+# RELOCSEXP-NEXT: }
+
+# RELOCSEXP: Virtual Address: 0x128
+# RELOCSEXP-NEXT: Symbol: (76)
+# RELOCSEXP-NEXT: IsSigned: No
+# RELOCSEXP-NEXT: FixupBitValue: 0
+# RELOCSEXP-NEXT: Length: 32
+# RELOCSEXP-NEXT: Type: R_POS (0x0)
+# RELOCSEXP-NEXT: }
+
+# RELOCSEXP: Virtual Address: 0x154
+# RELOCSEXP-NEXT: Symbol: TOC (72)
+# RELOCSEXP-NEXT: IsSigned: No
+# RELOCSEXP-NEXT: FixupBitValue: 0
+# RELOCSEXP-NEXT: Length: 32
+# RELOCSEXP-NEXT: Type: R_POS (0x0)
+# RELOCSEXP-NEXT: }
+# RELOCSEXP-NEXT: }
+# RELOCSEXP-NEXT:]
diff --git a/llvm/test/tools/llvm-readobj/COFF/xcoff-overflow-section.test b/llvm/test/tools/llvm-readobj/COFF/xcoff-overflow-section.test
new file mode 100644
index 00000000000..8ff911b1d79
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/xcoff-overflow-section.test
@@ -0,0 +1,47 @@
+# RUN: llvm-readobj --sections %p/Inputs/xcoff-reloc-overflow.o | \
+# RUN: FileCheck --check-prefix=SECOVERFLOW %s
+# SECOVERFLOW: File: {{.*}}xcoff-reloc-overflow.o
+# SECOVERFLOW-NEXT: Format: aixcoff-rs6000
+# SECOVERFLOW-NEXT: Arch: powerpc
+# SECOVERFLOW-NEXT: AddressSize: 32bit
+# SECOVERFLOW-NEXT: Sections [
+# SECOVERFLOW-NEXT: Section {
+# SECOVERFLOW-NEXT: Index: 1
+# SECOVERFLOW-NEXT: Name: .text
+# SECOVERFLOW-NEXT: PhysicalAddress: 0x0
+# SECOVERFLOW-NEXT: VirtualAddress: 0x0
+# SECOVERFLOW-NEXT: Size: 0x38
+# SECOVERFLOW-NEXT: RawDataOffset: 0x8C
+# SECOVERFLOW-NEXT: RelocationPointer: 0x0
+# SECOVERFLOW-NEXT: LineNumberPointer: 0x0
+# SECOVERFLOW-NEXT: NumberOfRelocations: 0
+# SECOVERFLOW-NEXT: NumberOfLineNumbers: 0
+# SECOVERFLOW-NEXT: Type: STYP_TEXT (0x20)
+# SECOVERFLOW-NEXT: }
+# SECOVERFLOW-NEXT: Section {
+# SECOVERFLOW-NEXT: Index: 2
+# SECOVERFLOW-NEXT: Name: .data
+# SECOVERFLOW-NEXT: PhysicalAddress: 0x38
+# SECOVERFLOW-NEXT: VirtualAddress: 0x38
+# SECOVERFLOW-NEXT: Size: 0x1C
+# SECOVERFLOW-NEXT: RawDataOffset: 0xC4
+# SECOVERFLOW-NEXT: RelocationPointer: 0xE0
+# SECOVERFLOW-NEXT: LineNumberPointer: 0x0
+# SECOVERFLOW-NEXT: NumberOfRelocations: 65535
+# SECOVERFLOW-NEXT: NumberOfLineNumbers: 65535
+# SECOVERFLOW-NEXT: Type: STYP_DATA (0x40)
+# SECOVERFLOW-NEXT: }
+# SECOVERFLOW-NEXT: Section {
+# SECOVERFLOW-NEXT: Index: 3
+# SECOVERFLOW-NEXT: Name: .ovrflo
+# SECOVERFLOW-NEXT: NumberOfRelocations: 3
+# SECOVERFLOW-NEXT: NumberOfLineNumbers: 3
+# SECOVERFLOW-NEXT: Size: 0x0
+# SECOVERFLOW-NEXT: RawDataOffset: 0x0
+# SECOVERFLOW-NEXT: RelocationPointer: 0xE0
+# SECOVERFLOW-NEXT: LineNumberPointer: 0x0
+# SECOVERFLOW-NEXT: IndexOfSectionOverflowed: 2
+# SECOVERFLOW-NEXT: IndexOfSectionOverflowed: 2
+# SECOVERFLOW-NEXT: Type: STYP_OVRFLO (0x8000)
+# SECOVERFLOW-NEXT: }
+# SECOVERFLOW-NEXT: ]
diff --git a/llvm/test/tools/llvm-readobj/COFF/xcoff-sections.test b/llvm/test/tools/llvm-readobj/COFF/xcoff-sections.test
new file mode 100644
index 00000000000..d80f9d8e344
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/xcoff-sections.test
@@ -0,0 +1,164 @@
+# RUN: llvm-readobj --section-headers %p/Inputs/xcoff-basic.o | \
+# RUN: FileCheck --check-prefix=SEC32 %s
+
+# RUN: llvm-readobj --section-headers %p/Inputs/xcoff-basic-64.o | \
+# RUN: FileCheck --check-prefix=SEC64 %s
+
+# SEC32: File: {{.*}}xcoff-basic.o
+# SEC32-NEXT: Format: aixcoff-rs6000
+# SEC32-NEXT: Arch: powerpc
+# SEC32-NEXT: AddressSize: 32bit
+# SEC32-NEXT: Sections [
+# SEC32-NEXT: Section {
+# SEC32-NEXT: Index: 1
+# SEC32-NEXT: Name: .text
+# SEC32-NEXT: PhysicalAddress: 0x0
+# SEC32-NEXT: VirtualAddress: 0x0
+# SEC32-NEXT: Size: 0x100
+# SEC32-NEXT: RawDataOffset: 0x200
+# SEC32-NEXT: RelocationPointer: 0x3D8
+# SEC32-NEXT: LineNumberPointer: 0x4E6
+# SEC32-NEXT: NumberOfRelocations: 8
+# SEC32-NEXT: NumberOfLineNumbers: 12
+# SEC32-NEXT: Type: STYP_TEXT (0x20)
+# SEC32-NEXT: }
+# SEC32-NEXT: Section {
+# SEC32-NEXT: Index: 2
+# SEC32-NEXT: Name: .data
+# SEC32-NEXT: PhysicalAddress: 0x100
+# SEC32-NEXT: VirtualAddress: 0x100
+# SEC32-NEXT: Size: 0x68
+# SEC32-NEXT: RawDataOffset: 0x300
+# SEC32-NEXT: RelocationPointer: 0x428
+# SEC32-NEXT: LineNumberPointer: 0x0
+# SEC32-NEXT: NumberOfRelocations: 19
+# SEC32-NEXT: NumberOfLineNumbers: 0
+# SEC32-NEXT: Type: STYP_DATA (0x40)
+# SEC32-NEXT: }
+# SEC32-NEXT: Section {
+# SEC32-NEXT: Index: 3
+# SEC32-NEXT: Name: .bss
+# SEC32-NEXT: PhysicalAddress: 0x168
+# SEC32-NEXT: VirtualAddress: 0x168
+# SEC32-NEXT: Size: 0x4
+# SEC32-NEXT: RawDataOffset: 0x0
+# SEC32-NEXT: RelocationPointer: 0x0
+# SEC32-NEXT: LineNumberPointer: 0x0
+# SEC32-NEXT: NumberOfRelocations: 0
+# SEC32-NEXT: NumberOfLineNumbers: 0
+# SEC32-NEXT: Type: STYP_BSS (0x80)
+# SEC32-NEXT: }
+# SEC32-NEXT: Section {
+# SEC32-NEXT: Index: 4
+# SEC32-NEXT: Name: .tdata
+# SEC32-NEXT: PhysicalAddress: 0x0
+# SEC32-NEXT: VirtualAddress: 0x0
+# SEC32-NEXT: Size: 0x4
+# SEC32-NEXT: RawDataOffset: 0x368
+# SEC32-NEXT: RelocationPointer: 0x47A
+# SEC32-NEXT: LineNumberPointer: 0x0
+# SEC32-NEXT: NumberOfRelocations: 0
+# SEC32-NEXT: NumberOfLineNumbers: 0
+# SEC32-NEXT: Type: STYP_TDATA (0x400)
+# SEC32-NEXT: }
+# SEC32-NEXT: Section {
+# SEC32-NEXT: Index: 5
+# SEC32-NEXT: Name: .tbss
+# SEC32-NEXT: PhysicalAddress: 0x4
+# SEC32-NEXT: VirtualAddress: 0x4
+# SEC32-NEXT: Size: 0x8
+# SEC32-NEXT: RawDataOffset: 0x0
+# SEC32-NEXT: RelocationPointer: 0x0
+# SEC32-NEXT: LineNumberPointer: 0x0
+# SEC32-NEXT: NumberOfRelocations: 0
+# SEC32-NEXT: NumberOfLineNumbers: 0
+# SEC32-NEXT: Type: STYP_TBSS (0x800)
+# SEC32-NEXT: }
+# SEC32-NEXT: Section {
+# SEC32-NEXT: Index: 6
+# SEC32-NEXT: Name: .debug
+# SEC32-NEXT: PhysicalAddress: 0x0
+# SEC32-NEXT: VirtualAddress: 0x0
+# SEC32-NEXT: Size: 0x6C
+# SEC32-NEXT: RawDataOffset: 0x36C
+# SEC32-NEXT: RelocationPointer: 0x0
+# SEC32-NEXT: LineNumberPointer: 0x0
+# SEC32-NEXT: NumberOfRelocations: 0
+# SEC32-NEXT: NumberOfLineNumbers: 0
+# SEC32-NEXT: Type: STYP_DEBUG (0x2000)
+# SEC32-NEXT: }
+# SEC32-NEXT: ]
+
+
+# SEC64: File: {{.*}}xcoff-basic-64.o
+# SEC64-NEXT: Format: aix5coff64-rs6000
+# SEC64-NEXT: Arch: powerpc64
+# SEC64-NEXT: AddressSize: 64bit
+# SEC64-NEXT: Sections [
+# SEC64-NEXT: Section {
+# SEC64-NEXT: Index: 1
+# SEC64-NEXT: Name: .text
+# SEC64-NEXT: PhysicalAddress: 0x0
+# SEC64-NEXT: VirtualAddress: 0x0
+# SEC64-NEXT: Size: 0x100
+# SEC64-NEXT: RawDataOffset: 0x200
+# SEC64-NEXT: RelocationPointer: 0x3C4
+# SEC64-NEXT: LineNumberPointer: 0x0
+# SEC64-NEXT: NumberOfRelocations: 9
+# SEC64-NEXT: NumberOfLineNumbers: 0
+# SEC64-NEXT: Type: STYP_TEXT (0x20)
+# SEC64-NEXT: }
+# SEC64-NEXT: Section {
+# SEC64-NEXT: Index: 2
+# SEC64-NEXT: Name: .data
+# SEC64-NEXT: PhysicalAddress: 0x100
+# SEC64-NEXT: VirtualAddress: 0x100
+# SEC64-NEXT: Size: 0xC0
+# SEC64-NEXT: RawDataOffset: 0x300
+# SEC64-NEXT: RelocationPointer: 0x442
+# SEC64-NEXT: LineNumberPointer: 0x0
+# SEC64-NEXT: NumberOfRelocations: 19
+# SEC64-NEXT: NumberOfLineNumbers: 0
+# SEC64-NEXT: Type: STYP_DATA (0x40)
+# SEC64-NEXT: }
+# SEC64-NEXT: Section {
+# SEC64-NEXT: Index: 3
+# SEC64-NEXT: Name: .bss
+# SEC64-NEXT: PhysicalAddress: 0x1C0
+# SEC64-NEXT: VirtualAddress: 0x1C0
+# SEC64-NEXT: Size: 0x8
+# SEC64-NEXT: RawDataOffset: 0x0
+# SEC64-NEXT: RelocationPointer: 0x0
+# SEC64-NEXT: LineNumberPointer: 0x0
+# SEC64-NEXT: NumberOfRelocations: 0
+# SEC64-NEXT: NumberOfLineNumbers: 0
+# SEC64-NEXT: Type: STYP_BSS (0x80)
+# SEC64-NEXT: }
+# SEC64-NEXT: Section {
+# SEC64-NEXT: Index: 4
+# SEC64-NEXT: Name: .tdata
+# SEC64-NEXT: PhysicalAddress: 0x0
+# SEC64-NEXT: VirtualAddress: 0x0
+# SEC64-NEXT: Size: 0x4
+# SEC64-NEXT: RawDataOffset: 0x3C0
+# SEC64-NEXT: RelocationPointer: 0x54C
+# SEC64-NEXT: LineNumberPointer: 0x0
+# SEC64-NEXT: NumberOfRelocations: 0
+# SEC64-NEXT: NumberOfLineNumbers: 0
+# SEC64-NEXT: Type: STYP_TDATA (0x400)
+# SEC64-NEXT: }
+# SEC64-NEXT: Section {
+# SEC64-NEXT: Index: 5
+# SEC64-NEXT: Name: .tbss
+# SEC64-NEXT: PhysicalAddress: 0x4
+# SEC64-NEXT: VirtualAddress: 0x4
+# SEC64-NEXT: Size: 0x8
+# SEC64-NEXT: RawDataOffset: 0x0
+# SEC64-NEXT: RelocationPointer: 0x0
+# SEC64-NEXT: LineNumberPointer: 0x0
+# SEC64-NEXT: NumberOfRelocations: 0
+# SEC64-NEXT: NumberOfLineNumbers: 0
+# SEC64-NEXT: Type: STYP_TBSS (0x800)
+# SEC64-NEXT: }
+# SEC64-NEXT: ]
+
diff --git a/llvm/test/tools/llvm-readobj/COFF/xcoff-symbols.test b/llvm/test/tools/llvm-readobj/COFF/xcoff-symbols.test
new file mode 100644
index 00000000000..15de3dba21b
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/xcoff-symbols.test
@@ -0,0 +1,446 @@
+# This file tests the ability of llvm-readobj to display the symbol table for a
+# 32-bit XCOFF object file.
+RUN: llvm-readobj --symbols %p/Inputs/aix_xcoff_xlc_test8.o | \
+RUN: FileCheck --check-prefix=SYMBOL32 %s
+
+SYMBOL32: File: {{.*}}aix_xcoff_xlc_test8.o
+SYMBOL32-NEXT: Format: aixcoff-rs6000
+SYMBOL32-NEXT: Arch: powerpc
+SYMBOL32-NEXT: AddressSize: 32bit
+SYMBOL32-NEXT: Symbols [
+SYMBOL32-NEXT: Symbol {
+SYMBOL32-NEXT: Index: 0
+SYMBOL32-NEXT: Name: .file
+SYMBOL32-NEXT: Value (SymbolTableIndex): 0x0
+SYMBOL32-NEXT: Section: N_DEBUG
+SYMBOL32-NEXT: Source Language ID: TB_C (0x0)
+SYMBOL32-NEXT: CPU Version ID: TCPU_COM (0x3)
+SYMBOL32-NEXT: StorageClass: C_FILE (0x67)
+SYMBOL32-NEXT: NumberOfAuxEntries: 3
+SYMBOL32-NEXT: File Auxiliary Entry {
+SYMBOL32-NEXT: Index: 1
+SYMBOL32-NEXT: Name: test8.c
+SYMBOL32-NEXT: Type: XFT_FN (0x0)
+SYMBOL32-NEXT: }
+SYMBOL32-NEXT: File Auxiliary Entry {
+SYMBOL32-NEXT: Index: 2
+SYMBOL32-NEXT: Name: Sun Apr 28 15:56:49 2019
+SYMBOL32-NEXT: Type: XFT_CT (0x1)
+SYMBOL32-NEXT: }
+SYMBOL32-NEXT: File Auxiliary Entry {
+SYMBOL32-NEXT: Index: 3
+SYMBOL32-NEXT: Name: IBM XL C for AIX, Version 16.1.0.2
+SYMBOL32-NEXT: Type: XFT_CV (0x2)
+SYMBOL32-NEXT: }
+SYMBOL32-NEXT: }
+SYMBOL32-NEXT: Symbol {
+SYMBOL32-NEXT: Index: 4
+SYMBOL32-NEXT: Name: .text
+SYMBOL32-NEXT: Value (RelocatableAddress): 0x0
+SYMBOL32-NEXT: Section: .text
+SYMBOL32-NEXT: Type: 0x0
+SYMBOL32-NEXT: StorageClass: C_STAT (0x3)
+SYMBOL32-NEXT: NumberOfAuxEntries: 1
+SYMBOL32-NEXT: Sect Auxiliary Entry For Stat {
+SYMBOL32-NEXT: Index: 5
+SYMBOL32-NEXT: SectionLength: 256
+SYMBOL32-NEXT: NumberOfRelocEnt: 4
+SYMBOL32-NEXT: NumberOfLineNum: 0
+SYMBOL32-NEXT: }
+SYMBOL32-NEXT: }
+SYMBOL32-NEXT: Symbol {
+SYMBOL32-NEXT: Index: 6
+SYMBOL32-NEXT: Name: .data
+SYMBOL32-NEXT: Value (RelocatableAddress): 0x100
+SYMBOL32-NEXT: Section: .data
+SYMBOL32-NEXT: Type: 0x0
+SYMBOL32-NEXT: StorageClass: C_STAT (0x3)
+SYMBOL32-NEXT: NumberOfAuxEntries: 1
+SYMBOL32-NEXT: Sect Auxiliary Entry For Stat {
+SYMBOL32-NEXT: Index: 7
+SYMBOL32-NEXT: SectionLength: 60
+SYMBOL32-NEXT: NumberOfRelocEnt: 11
+SYMBOL32-NEXT: NumberOfLineNum: 0
+SYMBOL32-NEXT: }
+SYMBOL32-NEXT: }
+SYMBOL32-NEXT: Symbol {
+SYMBOL32-NEXT: Index: 8
+SYMBOL32-NEXT: Name: .bss
+SYMBOL32-NEXT: Value (RelocatableAddress): 0x13C
+SYMBOL32-NEXT: Section: .bss
+SYMBOL32-NEXT: Type: 0x0
+SYMBOL32-NEXT: StorageClass: C_STAT (0x3)
+SYMBOL32-NEXT: NumberOfAuxEntries: 1
+SYMBOL32-NEXT: Sect Auxiliary Entry For Stat {
+SYMBOL32-NEXT: Index: 9
+SYMBOL32-NEXT: SectionLength: 4
+SYMBOL32-NEXT: NumberOfRelocEnt: 0
+SYMBOL32-NEXT: NumberOfLineNum: 0
+SYMBOL32-NEXT: }
+SYMBOL32-NEXT: }
+SYMBOL32-NEXT: Symbol {
+SYMBOL32-NEXT: Index: 10
+SYMBOL32-NEXT: Name:
+SYMBOL32-NEXT: Value (RelocatableAddress): 0x0
+SYMBOL32-NEXT: Section: .text
+SYMBOL32-NEXT: Type: 0x0
+SYMBOL32-NEXT: StorageClass: C_HIDEXT (0x6B)
+SYMBOL32-NEXT: NumberOfAuxEntries: 1
+SYMBOL32-NEXT: CSECT Auxiliary Entry {
+SYMBOL32-NEXT: Index: 11
+SYMBOL32-NEXT: SectionLen: 256
+SYMBOL32-NEXT: ParameterHashIndex: 0x0
+SYMBOL32-NEXT: TypeChkSectNum: 0x0
+SYMBOL32-NEXT: SymbolAlignmentLog2: 7
+SYMBOL32-NEXT: SymbolType: XTY_SD (0x1)
+SYMBOL32-NEXT: StorageMappingClass: XMC_PR (0x0)
+SYMBOL32-NEXT: StabInfoIndex: 0x0
+SYMBOL32-NEXT: StabSectNum: 0x0
+SYMBOL32-NEXT: }
+SYMBOL32-NEXT: }
+SYMBOL32-NEXT: Symbol {
+SYMBOL32-NEXT: Index: 12
+SYMBOL32-NEXT: Name: .fun1
+SYMBOL32-NEXT: Value (RelocatableAddress): 0x0
+SYMBOL32-NEXT: Section: .text
+SYMBOL32-NEXT: Type: 0x20
+SYMBOL32-NEXT: StorageClass: C_EXT (0x2)
+SYMBOL32-NEXT: NumberOfAuxEntries: 1
+SYMBOL32-NEXT: CSECT Auxiliary Entry {
+SYMBOL32-NEXT: Index: 13
+SYMBOL32-NEXT: ContainingCsectSymbolIndex: 10
+SYMBOL32-NEXT: ParameterHashIndex: 0x0
+SYMBOL32-NEXT: TypeChkSectNum: 0x0
+SYMBOL32-NEXT: SymbolAlignmentLog2: 0
+SYMBOL32-NEXT: SymbolType: XTY_LD (0x2)
+SYMBOL32-NEXT: StorageMappingClass: XMC_PR (0x0)
+SYMBOL32-NEXT: StabInfoIndex: 0x0
+SYMBOL32-NEXT: StabSectNum: 0x0
+SYMBOL32-NEXT: }
+SYMBOL32-NEXT: }
+SYMBOL32-NEXT: Symbol {
+SYMBOL32-NEXT: Index: 14
+SYMBOL32-NEXT: Name: .main
+SYMBOL32-NEXT: Value (RelocatableAddress): 0x60
+SYMBOL32-NEXT: Section: .text
+SYMBOL32-NEXT: Type: 0x20
+SYMBOL32-NEXT: StorageClass: C_EXT (0x2)
+SYMBOL32-NEXT: NumberOfAuxEntries: 1
+SYMBOL32-NEXT: CSECT Auxiliary Entry {
+SYMBOL32-NEXT: Index: 15
+SYMBOL32-NEXT: ContainingCsectSymbolIndex: 10
+SYMBOL32-NEXT: ParameterHashIndex: 0x0
+SYMBOL32-NEXT: TypeChkSectNum: 0x0
+SYMBOL32-NEXT: SymbolAlignmentLog2: 0
+SYMBOL32-NEXT: SymbolType: XTY_LD (0x2)
+SYMBOL32-NEXT: StorageMappingClass: XMC_PR (0x0)
+SYMBOL32-NEXT: StabInfoIndex: 0x0
+SYMBOL32-NEXT: StabSectNum: 0x0
+SYMBOL32-NEXT: }
+SYMBOL32-NEXT: }
+SYMBOL32-NEXT: Symbol {
+SYMBOL32-NEXT: Index: 16
+SYMBOL32-NEXT: Name: TOC
+SYMBOL32-NEXT: Value (RelocatableAddress): 0x100
+SYMBOL32-NEXT: Section: .data
+SYMBOL32-NEXT: Type: 0x0
+SYMBOL32-NEXT: StorageClass: C_HIDEXT (0x6B)
+SYMBOL32-NEXT: NumberOfAuxEntries: 1
+SYMBOL32-NEXT: CSECT Auxiliary Entry {
+SYMBOL32-NEXT: Index: 17
+SYMBOL32-NEXT: SectionLen: 0
+SYMBOL32-NEXT: ParameterHashIndex: 0x0
+SYMBOL32-NEXT: TypeChkSectNum: 0x0
+SYMBOL32-NEXT: SymbolAlignmentLog2: 2
+SYMBOL32-NEXT: SymbolType: XTY_SD (0x1)
+SYMBOL32-NEXT: StorageMappingClass: XMC_TC0 (0xF)
+SYMBOL32-NEXT: StabInfoIndex: 0x0
+SYMBOL32-NEXT: StabSectNum: 0x0
+SYMBOL32-NEXT: }
+SYMBOL32-NEXT: }
+SYMBOL32-NEXT: Symbol {
+SYMBOL32-NEXT: Index: 18
+SYMBOL32-NEXT: Name:
+SYMBOL32-NEXT: Value (RelocatableAddress): 0x114
+SYMBOL32-NEXT: Section: .data
+SYMBOL32-NEXT: Type: 0x0
+SYMBOL32-NEXT: StorageClass: C_HIDEXT (0x6B)
+SYMBOL32-NEXT: NumberOfAuxEntries: 1
+SYMBOL32-NEXT: CSECT Auxiliary Entry {
+SYMBOL32-NEXT: Index: 19
+SYMBOL32-NEXT: SectionLen: 4
+SYMBOL32-NEXT: ParameterHashIndex: 0x0
+SYMBOL32-NEXT: TypeChkSectNum: 0x0
+SYMBOL32-NEXT: SymbolAlignmentLog2: 2
+SYMBOL32-NEXT: SymbolType: XTY_SD (0x1)
+SYMBOL32-NEXT: StorageMappingClass: XMC_TC (0x3)
+SYMBOL32-NEXT: StabInfoIndex: 0x0
+SYMBOL32-NEXT: StabSectNum: 0x0
+SYMBOL32-NEXT: }
+SYMBOL32-NEXT: }
+SYMBOL32-NEXT: Symbol {
+SYMBOL32-NEXT: Index: 20
+SYMBOL32-NEXT: Name:
+SYMBOL32-NEXT: Value (RelocatableAddress): 0x134
+SYMBOL32-NEXT: Section: .data
+SYMBOL32-NEXT: Type: 0x0
+SYMBOL32-NEXT: StorageClass: C_HIDEXT (0x6B)
+SYMBOL32-NEXT: NumberOfAuxEntries: 1
+SYMBOL32-NEXT: CSECT Auxiliary Entry {
+SYMBOL32-NEXT: Index: 21
+SYMBOL32-NEXT: SectionLen: 5
+SYMBOL32-NEXT: ParameterHashIndex: 0x0
+SYMBOL32-NEXT: TypeChkSectNum: 0x0
+SYMBOL32-NEXT: SymbolAlignmentLog2: 3
+SYMBOL32-NEXT: SymbolType: XTY_SD (0x1)
+SYMBOL32-NEXT: StorageMappingClass: XMC_RO (0x1)
+SYMBOL32-NEXT: StabInfoIndex: 0x0
+SYMBOL32-NEXT: StabSectNum: 0x0
+SYMBOL32-NEXT: }
+SYMBOL32-NEXT: }
+SYMBOL32-NEXT: Symbol {
+SYMBOL32-NEXT: Index: 22
+SYMBOL32-NEXT: Name: _$STATIC_BSS
+SYMBOL32-NEXT: Value (RelocatableAddress): 0x13C
+SYMBOL32-NEXT: Section: .bss
+SYMBOL32-NEXT: Type: 0x0
+SYMBOL32-NEXT: StorageClass: C_HIDEXT (0x6B)
+SYMBOL32-NEXT: NumberOfAuxEntries: 1
+SYMBOL32-NEXT: CSECT Auxiliary Entry {
+SYMBOL32-NEXT: Index: 23
+SYMBOL32-NEXT: SectionLen: 4
+SYMBOL32-NEXT: ParameterHashIndex: 0x0
+SYMBOL32-NEXT: TypeChkSectNum: 0x0
+SYMBOL32-NEXT: SymbolAlignmentLog2: 2
+SYMBOL32-NEXT: SymbolType: XTY_CM (0x3)
+SYMBOL32-NEXT: StorageMappingClass: XMC_RW (0x5)
+SYMBOL32-NEXT: StabInfoIndex: 0x0
+SYMBOL32-NEXT: StabSectNum: 0x0
+SYMBOL32-NEXT: }
+SYMBOL32-NEXT: }
+SYMBOL32-NEXT: Symbol {
+SYMBOL32-NEXT: Index: 24
+SYMBOL32-NEXT: Name: _$STATIC_BSS
+SYMBOL32-NEXT: Value (RelocatableAddress): 0x104
+SYMBOL32-NEXT: Section: .data
+SYMBOL32-NEXT: Type: 0x0
+SYMBOL32-NEXT: StorageClass: C_HIDEXT (0x6B)
+SYMBOL32-NEXT: NumberOfAuxEntries: 1
+SYMBOL32-NEXT: CSECT Auxiliary Entry {
+SYMBOL32-NEXT: Index: 25
+SYMBOL32-NEXT: SectionLen: 4
+SYMBOL32-NEXT: ParameterHashIndex: 0x0
+SYMBOL32-NEXT: TypeChkSectNum: 0x0
+SYMBOL32-NEXT: SymbolAlignmentLog2: 2
+SYMBOL32-NEXT: SymbolType: XTY_SD (0x1)
+SYMBOL32-NEXT: StorageMappingClass: XMC_TC (0x3)
+SYMBOL32-NEXT: StabInfoIndex: 0x0
+SYMBOL32-NEXT: StabSectNum: 0x0
+SYMBOL32-NEXT: }
+SYMBOL32-NEXT: }
+SYMBOL32-NEXT: Symbol {
+SYMBOL32-NEXT: Index: 26
+SYMBOL32-NEXT: Name: fun1
+SYMBOL32-NEXT: Value (RelocatableAddress): 0x118
+SYMBOL32-NEXT: Section: .data
+SYMBOL32-NEXT: Type: 0x0
+SYMBOL32-NEXT: StorageClass: C_EXT (0x2)
+SYMBOL32-NEXT: NumberOfAuxEntries: 1
+SYMBOL32-NEXT: CSECT Auxiliary Entry {
+SYMBOL32-NEXT: Index: 27
+SYMBOL32-NEXT: SectionLen: 12
+SYMBOL32-NEXT: ParameterHashIndex: 0x0
+SYMBOL32-NEXT: TypeChkSectNum: 0x0
+SYMBOL32-NEXT: SymbolAlignmentLog2: 2
+SYMBOL32-NEXT: SymbolType: XTY_SD (0x1)
+SYMBOL32-NEXT: StorageMappingClass: XMC_DS (0xA)
+SYMBOL32-NEXT: StabInfoIndex: 0x0
+SYMBOL32-NEXT: StabSectNum: 0x0
+SYMBOL32-NEXT: }
+SYMBOL32-NEXT: }
+SYMBOL32-NEXT: Symbol {
+SYMBOL32-NEXT: Index: 28
+SYMBOL32-NEXT: Name: fun1
+SYMBOL32-NEXT: Value (RelocatableAddress): 0x100
+SYMBOL32-NEXT: Section: .data
+SYMBOL32-NEXT: Type: 0x0
+SYMBOL32-NEXT: StorageClass: C_HIDEXT (0x6B)
+SYMBOL32-NEXT: NumberOfAuxEntries: 1
+SYMBOL32-NEXT: CSECT Auxiliary Entry {
+SYMBOL32-NEXT: Index: 29
+SYMBOL32-NEXT: SectionLen: 4
+SYMBOL32-NEXT: ParameterHashIndex: 0x0
+SYMBOL32-NEXT: TypeChkSectNum: 0x0
+SYMBOL32-NEXT: SymbolAlignmentLog2: 2
+SYMBOL32-NEXT: SymbolType: XTY_SD (0x1)
+SYMBOL32-NEXT: StorageMappingClass: XMC_TC (0x3)
+SYMBOL32-NEXT: StabInfoIndex: 0x0
+SYMBOL32-NEXT: StabSectNum: 0x0
+SYMBOL32-NEXT: }
+SYMBOL32-NEXT: }
+SYMBOL32-NEXT: Symbol {
+SYMBOL32-NEXT: Index: 30
+SYMBOL32-NEXT: Name: p
+SYMBOL32-NEXT: Value (RelocatableAddress): 0x130
+SYMBOL32-NEXT: Section: .data
+SYMBOL32-NEXT: Type: 0x0
+SYMBOL32-NEXT: StorageClass: C_EXT (0x2)
+SYMBOL32-NEXT: NumberOfAuxEntries: 1
+SYMBOL32-NEXT: CSECT Auxiliary Entry {
+SYMBOL32-NEXT: Index: 31
+SYMBOL32-NEXT: SectionLen: 4
+SYMBOL32-NEXT: ParameterHashIndex: 0x0
+SYMBOL32-NEXT: TypeChkSectNum: 0x0
+SYMBOL32-NEXT: SymbolAlignmentLog2: 2
+SYMBOL32-NEXT: SymbolType: XTY_SD (0x1)
+SYMBOL32-NEXT: StorageMappingClass: XMC_RW (0x5)
+SYMBOL32-NEXT: StabInfoIndex: 0x0
+SYMBOL32-NEXT: StabSectNum: 0x0
+SYMBOL32-NEXT: }
+SYMBOL32-NEXT: }
+SYMBOL32-NEXT: Symbol {
+SYMBOL32-NEXT: Index: 32
+SYMBOL32-NEXT: Name: p
+SYMBOL32-NEXT: Value (RelocatableAddress): 0x108
+SYMBOL32-NEXT: Section: .data
+SYMBOL32-NEXT: Type: 0x0
+SYMBOL32-NEXT: StorageClass: C_HIDEXT (0x6B)
+SYMBOL32-NEXT: NumberOfAuxEntries: 1
+SYMBOL32-NEXT: CSECT Auxiliary Entry {
+SYMBOL32-NEXT: Index: 33
+SYMBOL32-NEXT: SectionLen: 4
+SYMBOL32-NEXT: ParameterHashIndex: 0x0
+SYMBOL32-NEXT: TypeChkSectNum: 0x0
+SYMBOL32-NEXT: SymbolAlignmentLog2: 2
+SYMBOL32-NEXT: SymbolType: XTY_SD (0x1)
+SYMBOL32-NEXT: StorageMappingClass: XMC_TC (0x3)
+SYMBOL32-NEXT: StabInfoIndex: 0x0
+SYMBOL32-NEXT: StabSectNum: 0x0
+SYMBOL32-NEXT: }
+SYMBOL32-NEXT: }
+SYMBOL32-NEXT: Symbol {
+SYMBOL32-NEXT: Index: 34
+SYMBOL32-NEXT: Name: main
+SYMBOL32-NEXT: Value (RelocatableAddress): 0x124
+SYMBOL32-NEXT: Section: .data
+SYMBOL32-NEXT: Type: 0x0
+SYMBOL32-NEXT: StorageClass: C_EXT (0x2)
+SYMBOL32-NEXT: NumberOfAuxEntries: 1
+SYMBOL32-NEXT: CSECT Auxiliary Entry {
+SYMBOL32-NEXT: Index: 35
+SYMBOL32-NEXT: SectionLen: 12
+SYMBOL32-NEXT: ParameterHashIndex: 0x0
+SYMBOL32-NEXT: TypeChkSectNum: 0x0
+SYMBOL32-NEXT: SymbolAlignmentLog2: 2
+SYMBOL32-NEXT: SymbolType: XTY_SD (0x1)
+SYMBOL32-NEXT: StorageMappingClass: XMC_DS (0xA)
+SYMBOL32-NEXT: StabInfoIndex: 0x0
+SYMBOL32-NEXT: StabSectNum: 0x0
+SYMBOL32-NEXT: }
+SYMBOL32-NEXT: }
+SYMBOL32-NEXT: Symbol {
+SYMBOL32-NEXT: Index: 36
+SYMBOL32-NEXT: Name: main
+SYMBOL32-NEXT: Value (RelocatableAddress): 0x10C
+SYMBOL32-NEXT: Section: .data
+SYMBOL32-NEXT: Type: 0x0
+SYMBOL32-NEXT: StorageClass: C_HIDEXT (0x6B)
+SYMBOL32-NEXT: NumberOfAuxEntries: 1
+SYMBOL32-NEXT: CSECT Auxiliary Entry {
+SYMBOL32-NEXT: Index: 37
+SYMBOL32-NEXT: SectionLen: 4
+SYMBOL32-NEXT: ParameterHashIndex: 0x0
+SYMBOL32-NEXT: TypeChkSectNum: 0x0
+SYMBOL32-NEXT: SymbolAlignmentLog2: 2
+SYMBOL32-NEXT: SymbolType: XTY_SD (0x1)
+SYMBOL32-NEXT: StorageMappingClass: XMC_TC (0x3)
+SYMBOL32-NEXT: StabInfoIndex: 0x0
+SYMBOL32-NEXT: StabSectNum: 0x0
+SYMBOL32-NEXT: }
+SYMBOL32-NEXT: }
+SYMBOL32-NEXT: Symbol {
+SYMBOL32-NEXT: Index: 38
+SYMBOL32-NEXT: Name: i
+SYMBOL32-NEXT: Value (RelocatableAddress): 0x0
+SYMBOL32-NEXT: Section: N_UNDEF
+SYMBOL32-NEXT: Type: 0x0
+SYMBOL32-NEXT: StorageClass: C_EXT (0x2)
+SYMBOL32-NEXT: NumberOfAuxEntries: 1
+SYMBOL32-NEXT: CSECT Auxiliary Entry {
+SYMBOL32-NEXT: Index: 39
+SYMBOL32-NEXT: SectionLen: 0
+SYMBOL32-NEXT: ParameterHashIndex: 0x0
+SYMBOL32-NEXT: TypeChkSectNum: 0x0
+SYMBOL32-NEXT: SymbolAlignmentLog2: 0
+SYMBOL32-NEXT: SymbolType: XTY_ER (0x0)
+SYMBOL32-NEXT: StorageMappingClass: XMC_UA (0x4)
+SYMBOL32-NEXT: StabInfoIndex: 0x0
+SYMBOL32-NEXT: StabSectNum: 0x0
+SYMBOL32-NEXT: }
+SYMBOL32-NEXT: }
+SYMBOL32-NEXT: Symbol {
+SYMBOL32-NEXT: Index: 40
+SYMBOL32-NEXT: Name: i
+SYMBOL32-NEXT: Value (RelocatableAddress): 0x110
+SYMBOL32-NEXT: Section: .data
+SYMBOL32-NEXT: Type: 0x0
+SYMBOL32-NEXT: StorageClass: C_HIDEXT (0x6B)
+SYMBOL32-NEXT: NumberOfAuxEntries: 1
+SYMBOL32-NEXT: CSECT Auxiliary Entry {
+SYMBOL32-NEXT: Index: 41
+SYMBOL32-NEXT: SectionLen: 4
+SYMBOL32-NEXT: ParameterHashIndex: 0x0
+SYMBOL32-NEXT: TypeChkSectNum: 0x0
+SYMBOL32-NEXT: SymbolAlignmentLog2: 2
+SYMBOL32-NEXT: SymbolType: XTY_SD (0x1)
+SYMBOL32-NEXT: StorageMappingClass: XMC_TC (0x3)
+SYMBOL32-NEXT: StabInfoIndex: 0x0
+SYMBOL32-NEXT: StabSectNum: 0x0
+SYMBOL32-NEXT: }
+SYMBOL32-NEXT: }
+SYMBOL32-NEXT: Symbol {
+SYMBOL32-NEXT: Index: 42
+SYMBOL32-NEXT: Name: .fun
+SYMBOL32-NEXT: Value (RelocatableAddress): 0x0
+SYMBOL32-NEXT: Section: N_UNDEF
+SYMBOL32-NEXT: Type: 0x0
+SYMBOL32-NEXT: StorageClass: C_EXT (0x2)
+SYMBOL32-NEXT: NumberOfAuxEntries: 1
+SYMBOL32-NEXT: CSECT Auxiliary Entry {
+SYMBOL32-NEXT: Index: 43
+SYMBOL32-NEXT: SectionLen: 0
+SYMBOL32-NEXT: ParameterHashIndex: 0x0
+SYMBOL32-NEXT: TypeChkSectNum: 0x0
+SYMBOL32-NEXT: SymbolAlignmentLog2: 0
+SYMBOL32-NEXT: SymbolType: XTY_ER (0x0)
+SYMBOL32-NEXT: StorageMappingClass: XMC_PR (0x0)
+SYMBOL32-NEXT: StabInfoIndex: 0x0
+SYMBOL32-NEXT: StabSectNum: 0x0
+SYMBOL32-NEXT: }
+SYMBOL32-NEXT: }
+SYMBOL32-NEXT: ]
+
+# The object file used is generated by the following source file
+# and command on AIX:
+#
+# > cat test8.c
+#
+# extern int i;
+# extern int TestforXcoff;
+# extern int fun(int i);
+# static int static_i;
+# char* p="abcd";
+# int fun1(int j) {
+# static_i++;
+# j++;
+# j=j+*p;
+# return j;
+# }
+#
+# int main() {
+# i++;
+# fun(i);
+# return fun1(i);
+# }
+#
+# > xlc -c test8.c -o aix_xcoff_xlc_test8.o
diff --git a/llvm/test/tools/llvm-readobj/COFF/zero-string-table.test b/llvm/test/tools/llvm-readobj/COFF/zero-string-table.test
new file mode 100644
index 00000000000..03354c50ecf
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/zero-string-table.test
@@ -0,0 +1,8 @@
+Ensure that we can read COFF objects with a string table size of 0 (instead
+of 4) for empty string tables.
+
+RUN: llvm-readobj --symbols %p/Inputs/zero-string-table.obj.coff-i386 | FileCheck %s
+
+CHECK: Symbols [
+CHECK: Symbol {
+CHECK: Name: $R000000
OpenPOWER on IntegriCloud