diff options
Diffstat (limited to 'test/tools/llvm-readobj')
47 files changed, 1102 insertions, 168 deletions
diff --git a/test/tools/llvm-readobj/ARM/attribute-0.s b/test/tools/llvm-readobj/ARM/attribute-0.s index b761dd8f251fd..bad23957b7906 100644 --- a/test/tools/llvm-readobj/ARM/attribute-0.s +++ b/test/tools/llvm-readobj/ARM/attribute-0.s @@ -225,6 +225,13 @@ @CHECK-OBJ-NEXT: TagName: DIV_use @CHECK-OBJ-NEXT: Description: If Available +.eabi_attribute Tag_DSP_extension, 0 +@CHECK: .eabi_attribute 46, 0 +@CHECK-OBJ: Tag: 46 +@CHECK-OBJ-NEXT: Value: 0 +@CHECK-OBJ-NEXT: TagName: DSP_extension +@CHECK-OBJ-NEXT: Description: Not Permitted + .eabi_attribute Tag_Virtualization_use, 0 @CHECK: .eabi_attribute 68, 0 @CHECK-OBJ: Tag: 68 diff --git a/test/tools/llvm-readobj/ARM/attribute-1.s b/test/tools/llvm-readobj/ARM/attribute-1.s index f433cbcc19b7e..c710bc873f183 100644 --- a/test/tools/llvm-readobj/ARM/attribute-1.s +++ b/test/tools/llvm-readobj/ARM/attribute-1.s @@ -211,6 +211,13 @@ @CHECK-OBJ-NEXT: TagName: DIV_use @CHECK-OBJ-NEXT: Description: Not Permitted +.eabi_attribute Tag_DSP_extension, 1 +@CHECK: .eabi_attribute 46, 1 +@CHECK-OBJ: Tag: 46 +@CHECK-OBJ-NEXT: Value: 1 +@CHECK-OBJ-NEXT: TagName: DSP_extension +@CHECK-OBJ-NEXT: Description: Permitted + .eabi_attribute Tag_Virtualization_use, 1 @CHECK: .eabi_attribute 68, 1 @CHECK-OBJ: Tag: 68 diff --git a/test/tools/llvm-readobj/Inputs/codeview-inlining.obj.coff b/test/tools/llvm-readobj/Inputs/codeview-inlining.obj.coff Binary files differnew file mode 100644 index 0000000000000..782e991c3bc70 --- /dev/null +++ b/test/tools/llvm-readobj/Inputs/codeview-inlining.obj.coff diff --git a/test/tools/llvm-readobj/Inputs/codeview-merging-1.obj b/test/tools/llvm-readobj/Inputs/codeview-merging-1.obj Binary files differnew file mode 100644 index 0000000000000..e51643a136dc1 --- /dev/null +++ b/test/tools/llvm-readobj/Inputs/codeview-merging-1.obj diff --git a/test/tools/llvm-readobj/Inputs/codeview-merging-2.obj b/test/tools/llvm-readobj/Inputs/codeview-merging-2.obj Binary files differnew file mode 100644 index 0000000000000..4cf24257deed1 --- /dev/null +++ b/test/tools/llvm-readobj/Inputs/codeview-merging-2.obj diff --git a/test/tools/llvm-readobj/Inputs/codeview-types.obj b/test/tools/llvm-readobj/Inputs/codeview-types.obj Binary files differnew file mode 100644 index 0000000000000..b00a7c6a3e10d --- /dev/null +++ b/test/tools/llvm-readobj/Inputs/codeview-types.obj diff --git a/test/tools/llvm-readobj/Inputs/codeview-vftable.obj.coff b/test/tools/llvm-readobj/Inputs/codeview-vftable.obj.coff Binary files differnew file mode 100644 index 0000000000000..388a7212eb259 --- /dev/null +++ b/test/tools/llvm-readobj/Inputs/codeview-vftable.obj.coff diff --git a/test/tools/llvm-readobj/Inputs/compression.zlib.style.elf-x86-64 b/test/tools/llvm-readobj/Inputs/compression.zlib.style.elf-x86-64 Binary files differnew file mode 100644 index 0000000000000..34cdb8a89edf4 --- /dev/null +++ b/test/tools/llvm-readobj/Inputs/compression.zlib.style.elf-x86-64 diff --git a/test/tools/llvm-readobj/Inputs/dynamic-table-so.aarch64 b/test/tools/llvm-readobj/Inputs/dynamic-table-so.aarch64 Binary files differnew file mode 100644 index 0000000000000..1e992294dc064 --- /dev/null +++ b/test/tools/llvm-readobj/Inputs/dynamic-table-so.aarch64 diff --git a/test/tools/llvm-readobj/Inputs/dynamic-table.c b/test/tools/llvm-readobj/Inputs/dynamic-table.c index 6b01ba5388be0..2804653794b01 100644 --- a/test/tools/llvm-readobj/Inputs/dynamic-table.c +++ b/test/tools/llvm-readobj/Inputs/dynamic-table.c @@ -2,8 +2,13 @@ // -o dynamic-table-so.mips // clang -target mipsel-linux-gnu -lc dynamic-table.c \ // -o dynamic-table-exe.mips +// clang -target aarch64-linux-gnu -fPIC -shared dynamic-table.c \ +// -o dynamic-table-so.aarch64 int puts(const char *); +__thread int foo; + int main(void) { puts("Hello, World"); + foo = 0; } diff --git a/test/tools/llvm-readobj/Inputs/elf-groups.x86_64 b/test/tools/llvm-readobj/Inputs/elf-groups.x86_64 Binary files differnew file mode 100644 index 0000000000000..29628ca09b023 --- /dev/null +++ b/test/tools/llvm-readobj/Inputs/elf-groups.x86_64 diff --git a/test/tools/llvm-readobj/Inputs/file-aux-record.yaml b/test/tools/llvm-readobj/Inputs/file-aux-record.yaml index 89d6761a26dbd..2f74a9a6ef4a1 100644 --- a/test/tools/llvm-readobj/Inputs/file-aux-record.yaml +++ b/test/tools/llvm-readobj/Inputs/file-aux-record.yaml @@ -1,3 +1,4 @@ +!COFF header: !Header Machine: IMAGE_FILE_MACHINE_I386 # (0x14c) Characteristics: [ IMAGE_FILE_DEBUG_STRIPPED ] diff --git a/test/tools/llvm-readobj/Inputs/file-multiple-aux-records.yaml b/test/tools/llvm-readobj/Inputs/file-multiple-aux-records.yaml index d5b1eec878b0b..42946b4fafb44 100644 --- a/test/tools/llvm-readobj/Inputs/file-multiple-aux-records.yaml +++ b/test/tools/llvm-readobj/Inputs/file-multiple-aux-records.yaml @@ -1,3 +1,4 @@ +!COFF header: !Header Machine: IMAGE_FILE_MACHINE_I386 # (0x14c) Characteristics: [ IMAGE_FILE_DEBUG_STRIPPED ] diff --git a/test/tools/llvm-readobj/Inputs/got-over.exe.elf-mips b/test/tools/llvm-readobj/Inputs/got-over.exe.elf-mips Binary files differnew file mode 100755 index 0000000000000..27644bff3302a --- /dev/null +++ b/test/tools/llvm-readobj/Inputs/got-over.exe.elf-mips diff --git a/test/tools/llvm-readobj/Inputs/has_pdb.exe b/test/tools/llvm-readobj/Inputs/has_pdb.exe Binary files differnew file mode 100644 index 0000000000000..60cc9f59fc164 --- /dev/null +++ b/test/tools/llvm-readobj/Inputs/has_pdb.exe diff --git a/test/tools/llvm-readobj/Inputs/options.obj.elf-mipsel b/test/tools/llvm-readobj/Inputs/options.obj.elf-mipsel Binary files differnew file mode 100644 index 0000000000000..6309d87c592bd --- /dev/null +++ b/test/tools/llvm-readobj/Inputs/options.obj.elf-mipsel diff --git a/test/tools/llvm-readobj/Inputs/phdrs-elf.exe-i386 b/test/tools/llvm-readobj/Inputs/phdrs-elf.exe-i386 Binary files differnew file mode 100755 index 0000000000000..a5a9541aec5fd --- /dev/null +++ b/test/tools/llvm-readobj/Inputs/phdrs-elf.exe-i386 diff --git a/test/tools/llvm-readobj/Inputs/phdrs-elf.exe-x86_64 b/test/tools/llvm-readobj/Inputs/phdrs-elf.exe-x86_64 Binary files differnew file mode 100755 index 0000000000000..6b6520809d719 --- /dev/null +++ b/test/tools/llvm-readobj/Inputs/phdrs-elf.exe-x86_64 diff --git a/test/tools/llvm-readobj/Inputs/relocs.obj.elf-lanai b/test/tools/llvm-readobj/Inputs/relocs.obj.elf-lanai Binary files differnew file mode 100644 index 0000000000000..70e25d1fca319 --- /dev/null +++ b/test/tools/llvm-readobj/Inputs/relocs.obj.elf-lanai diff --git a/test/tools/llvm-readobj/Inputs/relocs.py b/test/tools/llvm-readobj/Inputs/relocs.py index 62dbd627ca520..48a1ffb099483 100644 --- a/test/tools/llvm-readobj/Inputs/relocs.py +++ b/test/tools/llvm-readobj/Inputs/relocs.py @@ -991,6 +991,14 @@ class Relocs_Elf_Hexagon(Enum): R_HEX_TPREL_16_X = 84 R_HEX_TPREL_11_X = 85 +class Relocs_Elf_Lanai(Enum): + R_LANAI_NONE = 0 + R_LANAI_21 = 1 + R_LANAI_21_F = 2 + R_LANAI_25 = 3 + R_LANAI_32 = 4 + R_LANAI_HI16 = 5 + R_LANAI_LO16 = 6 class Relocs_Coff_i386(Enum): IMAGE_REL_I386_ABSOLUTE = 0x0000 @@ -1103,6 +1111,7 @@ craftElf("relocs.obj.elf-arm", "arm-unknown-unknown", Relocs_Elf_AR craftElf("relocs.obj.elf-mips", "mips-unknown-linux", Relocs_Elf_Mips.entries(), "lui $2, %hi(sym)") craftElf("relocs.obj.elf-mips64el", "mips64el-unknown-linux", Relocs_Elf_Mips.entries(), "lui $2, %hi(sym)") #craftElf("relocs.obj.elf-hexagon", "hexagon-unknown-unknown", Relocs_Elf_Hexagon.entries(), ...) +#craftElf("relocs.obj.elf-lanai", "lanai-unknown-unknown", Relocs_Elf_Lanai.entries(), "mov hi(x), %r4") craftCoff("relocs.obj.coff-i386", "i386-pc-win32", Relocs_Coff_i386.entries(), "mov foo@imgrel(%ebx, %ecx, 4), %eax") craftCoff("relocs.obj.coff-x86_64", "x86_64-pc-win32", Relocs_Coff_X86_64.entries(), "mov foo@imgrel(%ebx, %ecx, 4), %eax") diff --git a/test/tools/llvm-readobj/Inputs/st-other.obj.elf-mips b/test/tools/llvm-readobj/Inputs/st-other.obj.elf-mips Binary files differnew file mode 100644 index 0000000000000..80cefc192d4d4 --- /dev/null +++ b/test/tools/llvm-readobj/Inputs/st-other.obj.elf-mips diff --git a/test/tools/llvm-readobj/Inputs/st-other.obj.elf-mips16 b/test/tools/llvm-readobj/Inputs/st-other.obj.elf-mips16 Binary files differnew file mode 100644 index 0000000000000..5f0a0e3de8ea3 --- /dev/null +++ b/test/tools/llvm-readobj/Inputs/st-other.obj.elf-mips16 diff --git a/test/tools/llvm-readobj/Inputs/symbols-proc-specific.elf-hexagon b/test/tools/llvm-readobj/Inputs/symbols-proc-specific.elf-hexagon Binary files differnew file mode 100644 index 0000000000000..f6979086937a6 --- /dev/null +++ b/test/tools/llvm-readobj/Inputs/symbols-proc-specific.elf-hexagon diff --git a/test/tools/llvm-readobj/Inputs/trivial.obj.elf-lanai b/test/tools/llvm-readobj/Inputs/trivial.obj.elf-lanai Binary files differnew file mode 100644 index 0000000000000..fe05a31e358b5 --- /dev/null +++ b/test/tools/llvm-readobj/Inputs/trivial.obj.elf-lanai diff --git a/test/tools/llvm-readobj/Inputs/verneed.elf-x86-64 b/test/tools/llvm-readobj/Inputs/verneed.elf-x86-64 Binary files differnew file mode 100644 index 0000000000000..3a9c8d8df8da3 --- /dev/null +++ b/test/tools/llvm-readobj/Inputs/verneed.elf-x86-64 diff --git a/test/tools/llvm-readobj/codeview-inlining.test b/test/tools/llvm-readobj/codeview-inlining.test new file mode 100644 index 0000000000000..7856993530737 --- /dev/null +++ b/test/tools/llvm-readobj/codeview-inlining.test @@ -0,0 +1,65 @@ +; The following two object files were generated using the following command: +; $ cl /d2Zi+ /Zc:inline /O2 /Z7 /c t.cpp +; The contents of t.cpp follow: +; static void bar() { +; __asm nop +; } +; static void baz() { +; __asm nop +; } +; static __forceinline void foo() { +; __asm nop +; #include "a.h" +; #include "b.h" +; __asm nop +; goto forwards; +; +; backwards: +; __asm nop +; return; +; +; forwards: +; __asm rep nop +; goto backwards; +; } +; int main() { +; bar(); +; baz(); +; foo(); +; } +; +; Both a.h and b.h contain "__asm nop". + +RUN: llvm-readobj -s -codeview -section-symbols %p/Inputs/codeview-inlining.obj.coff | FileCheck %s + +; FIXME: If we were more clever, we could turn FileIDs into paths. + +; CHECK: SubSectionType: InlineeLines (0xF6) +; CHECK-NEXT: SubSectionSize: 0x3C +; CHECK-NEXT: InlineeSourceLine { +; CHECK-NEXT: Inlinee: bar (0x1002) +; CHECK-NEXT: FileID: d:\src\llvm\build\t.cpp (0x30) +; CHECK-NEXT: SourceLineNum: 2 +; CHECK-NEXT: ExtraFileCount: 0 +; CHECK-NEXT: ExtraFiles [ +; CHECK-NEXT: ] +; CHECK-NEXT: } +; CHECK-NEXT: InlineeSourceLine { +; CHECK-NEXT: Inlinee: baz (0x1003) +; CHECK-NEXT: FileID: d:\src\llvm\build\t.cpp (0x30) +; CHECK-NEXT: SourceLineNum: 5 +; CHECK-NEXT: ExtraFileCount: 0 +; CHECK-NEXT: ExtraFiles [ +; CHECK-NEXT: ] +; CHECK-NEXT: } +; The 'foo' inline site has extra files due to includes. +; CHECK-NEXT: InlineeSourceLine { +; CHECK-NEXT: Inlinee: foo (0x1004) +; CHECK-NEXT: FileID: d:\src\llvm\build\a.h (0x0) +; CHECK-NEXT: SourceLineNum: 1 +; CHECK-NEXT: ExtraFileCount: 2 +; CHECK-NEXT: ExtraFiles [ +; CHECK-NEXT: FileID: d:\src\llvm\build\b.h (0x18) +; CHECK-NEXT: FileID: d:\src\llvm\build\t.cpp (0x30) +; CHECK-NEXT: ] +; CHECK-NEXT: } diff --git a/test/tools/llvm-readobj/codeview-linetables.test b/test/tools/llvm-readobj/codeview-linetables.test index a1c6ab66b4cae..fe68e7efdb056 100644 --- a/test/tools/llvm-readobj/codeview-linetables.test +++ b/test/tools/llvm-readobj/codeview-linetables.test @@ -28,79 +28,80 @@ RUN: llvm-readobj -s -codeview -section-symbols %p/Inputs/multifunction-linetabl RUN: | FileCheck %s -check-prefix MFUN64 MFUN32: CodeViewDebugInfo [ +MFUN32-NEXT: Section: .debug$S (2) MFUN32-NEXT: Magic: 0x4 MFUN32-NEXT: Subsection [ -MFUN32-NEXT: Type: 0xF1 -MFUN32-NEXT: PayloadSize: 0x52 +MFUN32-NEXT: SubSectionType: Symbols (0xF1) +MFUN32-NEXT: SubSectionSize: 0x52 MFUN32: ] -MFUN32-NEXT: Subsection [ -MFUN32-NEXT: Type: 0xF5 -MFUN32-NEXT: PayloadSize: 0x24 +MFUN32: Subsection [ +MFUN32-NEXT: SubSectionType: FrameData (0xF5) +MFUN32-NEXT: SubSectionSize: 0x24 MFUN32: ] -MFUN32-NEXT: Subsection [ -MFUN32-NEXT: Type: 0xF1 -MFUN32-NEXT: PayloadSize: 0x4B +MFUN32: Subsection [ +MFUN32-NEXT: SubSectionType: Symbols (0xF1) +MFUN32-NEXT: SubSectionSize: 0x4B MFUN32: ProcStart { -MFUN32-NEXT: DisplayName: x -MFUN32-NEXT: Section: _x -MFUN32-NEXT: CodeSize: 0xA -MFUN32-NEXT: } -MFUN32-NEXT: ProcEnd +MFUN32: CodeSize: 0xA +MFUN32: DisplayName: x +MFUN32: LinkageName: _x +MFUN32: } +MFUN32: ProcEnd MFUN32: ] -MFUN32-NEXT: Subsection [ -MFUN32-NEXT: Type: 0xF2 -MFUN32-NEXT: PayloadSize: 0x30 +MFUN32: Subsection [ +MFUN32-NEXT: SubSectionType: Lines (0xF2) +MFUN32-NEXT: SubSectionSize: 0x30 MFUN32: LinkageName: _x MFUN32-NEXT: ] MFUN32-NEXT: Subsection [ -MFUN32-NEXT: Type: 0xF5 -MFUN32-NEXT: PayloadSize: 0x24 +MFUN32-NEXT: SubSectionType: FrameData (0xF5) +MFUN32-NEXT: SubSectionSize: 0x24 MFUN32: ] -MFUN32-NEXT: Subsection [ -MFUN32-NEXT: Type: 0xF1 -MFUN32-NEXT: PayloadSize: 0x4B +MFUN32: Subsection [ +MFUN32-NEXT: SubSectionType: Symbols (0xF1) +MFUN32-NEXT: SubSectionSize: 0x4B MFUN32: ProcStart { -MFUN32-NEXT: DisplayName: y -MFUN32-NEXT: Section: _y -MFUN32-NEXT: CodeSize: 0xA -MFUN32-NEXT: } -MFUN32-NEXT: ProcEnd +MFUN32: CodeSize: 0xA +MFUN32: DisplayName: y +MFUN32: LinkageName: _y +MFUN32: } +MFUN32: ProcEnd MFUN32: ] MFUN32-NEXT: Subsection [ -MFUN32-NEXT: Type: 0xF2 -MFUN32-NEXT: PayloadSize: 0x30 +MFUN32-NEXT: SubSectionType: Lines (0xF2) +MFUN32-NEXT: SubSectionSize: 0x30 MFUN32: LinkageName: _y MFUN32-NEXT: ] MFUN32-NEXT: Subsection [ -MFUN32-NEXT: Type: 0xF5 -MFUN32-NEXT: PayloadSize: 0x24 +MFUN32-NEXT: SubSectionType: FrameData (0xF5) +MFUN32-NEXT: SubSectionSize: 0x24 MFUN32: ] -MFUN32-NEXT: Subsection [ -MFUN32-NEXT: Type: 0xF1 -MFUN32-NEXT: PayloadSize: 0x4B +MFUN32: Subsection [ +MFUN32-NEXT: SubSectionType: Symbols (0xF1) +MFUN32-NEXT: SubSectionSize: 0x4B MFUN32: ProcStart { -MFUN32-NEXT: DisplayName: f -MFUN32-NEXT: Section: _f -MFUN32-NEXT: CodeSize: 0x14 -MFUN32-NEXT: } -MFUN32-NEXT: ProcEnd +MFUN32: CodeSize: 0x14 +MFUN32: DisplayName: f +MFUN32: LinkageName: _f +MFUN32: } +MFUN32: ProcEnd MFUN32: ] -MFUN32-NEXT: Subsection [ -MFUN32-NEXT: Type: 0xF2 -MFUN32-NEXT: PayloadSize: 0x40 +MFUN32: Subsection [ +MFUN32-NEXT: SubSectionType: Lines (0xF2) +MFUN32-NEXT: SubSectionSize: 0x40 MFUN32: LinkageName: _f MFUN32-NEXT: ] MFUN32-NEXT: Subsection [ -MFUN32-NEXT: Type: 0xF4 -MFUN32-NEXT: PayloadSize: 0x18 +MFUN32-NEXT: SubSectionType: FileChecksums (0xF4) +MFUN32-NEXT: SubSectionSize: 0x18 MFUN32: ] MFUN32-NEXT: Subsection [ -MFUN32-NEXT: Type: 0xF3 -MFUN32-NEXT: PayloadSize: 0x46 +MFUN32-NEXT: SubSectionType: StringTable (0xF3) +MFUN32-NEXT: SubSectionSize: 0x46 MFUN32: ] MFUN32-NEXT: Subsection [ -MFUN32-NEXT: Type: 0xF1 -MFUN32-NEXT: PayloadSize: 0x8 +MFUN32-NEXT: SubSectionType: Symbols (0xF1) +MFUN32-NEXT: SubSectionSize: 0x8 MFUN32: ] MFUN32-NEXT: FunctionLineTable [ MFUN32-NEXT LinkageName: _x @@ -181,70 +182,70 @@ MFUN32-NEXT IsStatement: Yes MFUN32-NEXT ] MFUN32-NEXT ] MFUN32-NEXT ] -MFUN32-NEXT ] +MFUN32: ] MFUN64: CodeViewDebugInfo [ -MFUN64-NEXT: Magic: 0x4 +MFUN64: Magic: 0x4 MFUN64-NEXT: Subsection [ -MFUN64-NEXT: Type: 0xF1 -MFUN64-NEXT: PayloadSize: 0x52 +MFUN64-NEXT: SubSectionType: Symbols (0xF1) +MFUN64-NEXT: SubSectionSize: 0x52 MFUN64: ] -MFUN64-NEXT: Subsection [ -MFUN64-NEXT: Type: 0xF1 -MFUN64-NEXT: PayloadSize: 0x4B +MFUN64: Subsection [ +MFUN64-NEXT: SubSectionType: Symbols (0xF1) +MFUN64-NEXT: SubSectionSize: 0x4B MFUN64: ProcStart { -MFUN64-NEXT: DisplayName: x -MFUN64-NEXT: Section: x -MFUN64-NEXT: CodeSize: 0xE -MFUN64-NEXT: } -MFUN64-NEXT: ProcEnd +MFUN64: CodeSize: 0xE +MFUN64: DisplayName: x +MFUN64: LinkageName: x +MFUN64: } +MFUN64: ProcEnd MFUN64: ] MFUN64-NEXT: Subsection [ -MFUN64-NEXT: Type: 0xF2 -MFUN64-NEXT: PayloadSize: 0x30 +MFUN64-NEXT: SubSectionType: Lines (0xF2) +MFUN64-NEXT: SubSectionSize: 0x30 MFUN64: LinkageName: x MFUN64-NEXT: ] MFUN64-NEXT: Subsection [ -MFUN64-NEXT: Type: 0xF1 -MFUN64-NEXT: PayloadSize: 0x4B +MFUN64-NEXT: SubSectionType: Symbols (0xF1) +MFUN64-NEXT: SubSectionSize: 0x4B MFUN64: ProcStart { -MFUN64-NEXT: DisplayName: y -MFUN64-NEXT: Section: y -MFUN64-NEXT: CodeSize: 0xE -MFUN64-NEXT: } -MFUN64-NEXT: ProcEnd +MFUN64: CodeSize: 0xE +MFUN64: DisplayName: y +MFUN64: LinkageName: y +MFUN64: } +MFUN64: ProcEnd MFUN64: ] MFUN64-NEXT: Subsection [ -MFUN64-NEXT: Type: 0xF2 -MFUN64-NEXT: PayloadSize: 0x30 +MFUN64-NEXT: SubSectionType: Lines (0xF2) +MFUN64-NEXT: SubSectionSize: 0x30 MFUN64: LinkageName: y MFUN64-NEXT: ] MFUN64-NEXT: Subsection [ -MFUN64-NEXT: Type: 0xF1 -MFUN64-NEXT: PayloadSize: 0x4B +MFUN64-NEXT: SubSectionType: Symbols (0xF1) +MFUN64-NEXT: SubSectionSize: 0x4B MFUN64: ProcStart { -MFUN64-NEXT: DisplayName: f -MFUN64-NEXT: Section: f -MFUN64-NEXT: CodeSize: 0x18 -MFUN64-NEXT: } -MFUN64-NEXT: ProcEnd +MFUN64: CodeSize: 0x18 +MFUN64: DisplayName: f +MFUN64: LinkageName: f +MFUN64: } +MFUN64: ProcEnd MFUN64: ] MFUN64-NEXT: Subsection [ -MFUN64-NEXT: Type: 0xF2 -MFUN64-NEXT: PayloadSize: 0x40 +MFUN64-NEXT: SubSectionType: Lines (0xF2) +MFUN64-NEXT: SubSectionSize: 0x40 MFUN64: LinkageName: f MFUN64-NEXT: ] MFUN64-NEXT: Subsection [ -MFUN64-NEXT: Type: 0xF4 -MFUN64-NEXT: PayloadSize: 0x18 +MFUN64-NEXT: SubSectionType: FileChecksums (0xF4) +MFUN64-NEXT: SubSectionSize: 0x18 MFUN64: ] MFUN64-NEXT: Subsection [ -MFUN64-NEXT: Type: 0xF3 -MFUN64-NEXT: PayloadSize: 0xD +MFUN64-NEXT: SubSectionType: StringTable (0xF3) +MFUN64-NEXT: SubSectionSize: 0xD MFUN64: ] MFUN64-NEXT: Subsection [ -MFUN64-NEXT: Type: 0xF1 -MFUN64-NEXT: PayloadSize: 0x8 +MFUN64-NEXT: SubSectionType: Symbols (0xF1) +MFUN64-NEXT: SubSectionSize: 0x8 MFUN64: ] MFUN64-NEXT: FunctionLineTable [ MFUN64-NEXT: LinkageName: x @@ -325,7 +326,7 @@ MFUN64-NEXT: IsStatement: Yes MFUN64-NEXT: ] MFUN64-NEXT: ] MFUN64-NEXT: ] -MFUN64-NEXT: ] +MFUN64: ] ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; The following two object files were generated using the following command: @@ -352,41 +353,41 @@ RUN: llvm-readobj -s -codeview -section-symbols %p/Inputs/multifile-linetables.o RUN: | FileCheck %s -check-prefix MFILE64 MFILE32: CodeViewDebugInfo [ -MFILE32-NEXT: Magic: 0x4 +MFILE32: Magic: 0x4 MFILE32-NEXT: Subsection [ -MFILE32-NEXT: Type: 0xF1 -MFILE32-NEXT: PayloadSize: 0x51 +MFILE32-NEXT: SubSectionType: Symbols (0xF1) +MFILE32-NEXT: SubSectionSize: 0x51 MFILE32: ] -MFILE32-NEXT: Subsection [ -MFILE32-NEXT: Type: 0xF5 -MFILE32-NEXT: PayloadSize: 0x24 +MFILE32: Subsection [ +MFILE32-NEXT: SubSectionType: FrameData (0xF5) +MFILE32-NEXT: SubSectionSize: 0x24 MFILE32: ] -MFILE32-NEXT: Subsection [ -MFILE32-NEXT: Type: 0xF1 -MFILE32-NEXT: PayloadSize: 0x4B +MFILE32: Subsection [ +MFILE32-NEXT: SubSectionType: Symbols (0xF1) +MFILE32-NEXT: SubSectionSize: 0x4B MFILE32: ProcStart { -MFILE32-NEXT: DisplayName: f -MFILE32-NEXT: Section: _f -MFILE32-NEXT: CodeSize: 0x14 -MFILE32-NEXT: } -MFILE32-NEXT: ProcEnd +MFILE32: CodeSize: 0x14 +MFILE32: DisplayName: f +MFILE32: LinkageName: _f +MFILE32: } +MFILE32: ProcEnd MFILE32: ] MFILE32-NEXT: Subsection [ -MFILE32-NEXT: Type: 0xF2 -MFILE32-NEXT: PayloadSize: 0x64 +MFILE32-NEXT: SubSectionType: Lines (0xF2) +MFILE32-NEXT: SubSectionSize: 0x64 MFILE32: LinkageName: _f MFILE32-NEXT: ] MFILE32-NEXT: Subsection [ -MFILE32-NEXT: Type: 0xF4 -MFILE32-NEXT: PayloadSize: 0x28 +MFILE32-NEXT: SubSectionType: FileChecksums (0xF4) +MFILE32-NEXT: SubSectionSize: 0x28 MFILE32: ] MFILE32-NEXT: Subsection [ -MFILE32-NEXT: Type: 0xF3 -MFILE32-NEXT: PayloadSize: 0x57 +MFILE32-NEXT: SubSectionType: StringTable (0xF3) +MFILE32-NEXT: SubSectionSize: 0x57 MFILE32: ] MFILE32-NEXT: Subsection [ -MFILE32-NEXT: Type: 0xF1 -MFILE32-NEXT: PayloadSize: 0x8 +MFILE32-NEXT: SubSectionType: Symbols (0xF1) +MFILE32-NEXT: SubSectionSize: 0x8 MFILE32: ] MFILE32-NEXT: FunctionLineTable [ MFILE32-NEXT: LinkageName: _f @@ -430,40 +431,40 @@ MFILE32-NEXT: IsStatement: Yes MFILE32-NEXT: ] MFILE32-NEXT: ] MFILE32-NEXT: ] -MFILE32-NEXT: ] +MFILE32: ] MFILE64: CodeViewDebugInfo [ -MFILE64-NEXT: Magic: 0x4 +MFILE64: Magic: 0x4 MFILE64-NEXT: Subsection [ -MFILE64-NEXT: Type: 0xF1 -MFILE64-NEXT: PayloadSize: 0x51 +MFILE64-NEXT: SubSectionType: Symbols (0xF1) +MFILE64-NEXT: SubSectionSize: 0x51 MFILE64: ] -MFILE64-NEXT: Subsection [ -MFILE64-NEXT: Type: 0xF1 -MFILE64-NEXT: PayloadSize: 0x4B +MFILE64: Subsection [ +MFILE64-NEXT: SubSectionType: Symbols (0xF1) +MFILE64-NEXT: SubSectionSize: 0x4B MFILE64: ProcStart { -MFILE64-NEXT: DisplayName: f -MFILE64-NEXT: Section: f -MFILE64-NEXT: CodeSize: 0x18 -MFILE64-NEXT: } -MFILE64-NEXT: ProcEnd +MFILE64: CodeSize: 0x18 +MFILE64: DisplayName: f +MFILE64: LinkageName: f +MFILE64: } +MFILE64: ProcEnd MFILE64: ] MFILE64-NEXT: Subsection [ -MFILE64-NEXT: Type: 0xF2 -MFILE64-NEXT: PayloadSize: 0x64 +MFILE64-NEXT: SubSectionType: Lines (0xF2) +MFILE64-NEXT: SubSectionSize: 0x64 MFILE64: LinkageName: f MFILE64-NEXT: ] MFILE64-NEXT: Subsection [ -MFILE64-NEXT: Type: 0xF4 -MFILE64-NEXT: PayloadSize: 0x28 +MFILE64-NEXT: SubSectionType: FileChecksums (0xF4) +MFILE64-NEXT: SubSectionSize: 0x28 MFILE64: ] MFILE64-NEXT: Subsection [ -MFILE64-NEXT: Type: 0xF3 -MFILE64-NEXT: PayloadSize: 0x1E +MFILE64-NEXT: SubSectionType: StringTable (0xF3) +MFILE64-NEXT: SubSectionSize: 0x1E MFILE64: ] MFILE64-NEXT: Subsection [ -MFILE64-NEXT: Type: 0xF1 -MFILE64-NEXT: PayloadSize: 0x8 +MFILE64-NEXT: SubSectionType: Symbols (0xF1) +MFILE64-NEXT: SubSectionSize: 0x8 MFILE64: ] MFILE64-NEXT: FunctionLineTable [ MFILE64-NEXT: LinkageName: f @@ -506,7 +507,7 @@ MFILE64-NEXT: LineNumberEndDelta: 0 MFILE64-NEXT: IsStatement: Yes MFILE64-NEXT: ] MFILE64-NEXT: ] -MFILE64-NEXT: ] +MFILE64: ] ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; The following object files were generated using the following command: @@ -528,10 +529,10 @@ RUN: llvm-readobj -s -codeview -section-symbols %p/Inputs/comdat-function-lineta RUN: | FileCheck %s -check-prefix MCOMDAT MCOMDAT: ProcStart { -MCOMDAT-NEXT: DisplayName: f -MCOMDAT-NEXT: Section: ?f@@YAHXZ -MCOMDAT-NEXT: CodeSize: 0x7 -MCOMDAT-NEXT: } +MCOMDAT: CodeSize: 0x7 +MCOMDAT: DisplayName: f +MCOMDAT: LinkageName: ?f@@YAHXZ +MCOMDAT: } MCOMDAT: FunctionLineTable [ MCOMDAT-NEXT: LinkageName: ?f@@YAHXZ MCOMDAT-NEXT: Flags: 0x0 @@ -556,10 +557,10 @@ MCOMDAT-NEXT: ] MCOMDAT-NEXT: ] MCOMDAT-NEXT: ] MCOMDAT: ProcStart { -MCOMDAT-NEXT: DisplayName: g -MCOMDAT-NEXT: Section: ?g@@YAHXZ -MCOMDAT-NEXT: CodeSize: 0x7 -MCOMDAT-NEXT: } +MCOMDAT: CodeSize: 0x7 +MCOMDAT: DisplayName: g +MCOMDAT: LinkageName: ?g@@YAHXZ +MCOMDAT: } MCOMDAT: FunctionLineTable [ MCOMDAT-NEXT: LinkageName: ?g@@YAHXZ MCOMDAT-NEXT: Flags: 0x0 diff --git a/test/tools/llvm-readobj/codeview-merging.test b/test/tools/llvm-readobj/codeview-merging.test new file mode 100644 index 0000000000000..60894eff33eb1 --- /dev/null +++ b/test/tools/llvm-readobj/codeview-merging.test @@ -0,0 +1,65 @@ +# To regenerate t1.obj and t2.obj, run the following: +# $ cat t.cpp +# #ifdef CONFIG1 +# struct A; +# struct B { +# A *a; +# }; +# int f(A *a); +# int g(B *b) { return f(b->a); } +# #else +# struct B; +# struct A { +# B *b; +# }; +# int g(B *b); +# int f(A *a) { return g(a->b); } +# #endif +# $ cl -c -DCONFIG1 -Z7 t.cpp -Fot1.obj && cl -c -Z7 t.cpp -Fot2.obj + +RUN: llvm-readobj -codeview %S/Inputs/codeview-merging-1.obj | FileCheck %s --check-prefix=OBJ1 +RUN: llvm-readobj -codeview %S/Inputs/codeview-merging-2.obj | FileCheck %s --check-prefix=OBJ2 +RUN: llvm-readobj -codeview-merged-types %S/Inputs/codeview-merging-1.obj %S/Inputs/codeview-merging-2.obj | FileCheck %s + +OBJ1: FuncId (0x100D) { +OBJ1-NEXT: TypeLeafKind: LF_FUNC_ID (0x1601) +OBJ1-NEXT: ParentScope: 0x0 +OBJ1-NEXT: FunctionType: int (B*) (0x100C) +OBJ1-NEXT: Name: g +OBJ1-NEXT: } +OBJ1-NEXT: FuncId (0x100E) { +OBJ1-NEXT: TypeLeafKind: LF_FUNC_ID (0x1601) +OBJ1-NEXT: ParentScope: 0x0 +OBJ1-NEXT: FunctionType: int (A*) (0x1003) +OBJ1-NEXT: Name: f +OBJ1-NEXT: } +OBJ1-NOT: FuncId + +OBJ2: FuncId (0x100D) { +OBJ2-NEXT: TypeLeafKind: LF_FUNC_ID (0x1601) +OBJ2-NEXT: ParentScope: 0x0 +OBJ2-NEXT: FunctionType: int (A*) (0x100C) +OBJ2-NEXT: Name: f +OBJ2-NEXT: } + +OBJ2: FuncId (0x1069) { +OBJ2-NEXT: TypeLeafKind: LF_FUNC_ID (0x1601) +OBJ2-NEXT: ParentScope: 0x0 +OBJ2-NEXT: FunctionType: int (B*) (0x1003) +OBJ2-NEXT: Name: g +OBJ2-NEXT: } +OBJ2-NOT: FuncId + +CHECK: FuncId (0x100D) { +CHECK-NEXT: TypeLeafKind: LF_FUNC_ID (0x1601) +CHECK-NEXT: ParentScope: 0x0 +CHECK-NEXT: FunctionType: int (B*) (0x100C) +CHECK-NEXT: Name: g +CHECK-NEXT: } +CHECK-NEXT: FuncId (0x100E) { +CHECK-NEXT: TypeLeafKind: LF_FUNC_ID (0x1601) +CHECK-NEXT: ParentScope: 0x0 +CHECK-NEXT: FunctionType: int (A*) (0x1003) +CHECK-NEXT: Name: f +CHECK-NEXT: } +CHECK-NOT: FuncId diff --git a/test/tools/llvm-readobj/codeview-types.test b/test/tools/llvm-readobj/codeview-types.test new file mode 100644 index 0000000000000..4545b8e01dd27 --- /dev/null +++ b/test/tools/llvm-readobj/codeview-types.test @@ -0,0 +1,95 @@ +// This tests that we can deserialize and reserialize every known type record. +// If you need to update the object file, enable the RUNX line below using MSVC +// from VS 2012. Newer versions of MSVC emit tons of internal types for +// attributes that pollute the test output. When Clang fully supports all these +// type records, we can regenerate the test using it instead. + +// RUNX: cl -GR- -Z7 -c -TP %s -Fo%S/Inputs/codeview-types.obj +// RUN: llvm-readobj -codeview %S/Inputs/codeview-types.obj | FileCheck %s +// RUN: llvm-readobj -codeview-merged-types %S/Inputs/codeview-types.obj | FileCheck %s + +// TYPE_RECORD +// CHECK-DAG: {{^ *Pointer (.*) {$}} +// CHECK-DAG: {{^ *Modifier (.*) {$}} +// CHECK-DAG: {{^ *Procedure (.*) {$}} +// CHECK-DAG: {{^ *MemberFunction (.*) {$}} +// CHECK-DAG: {{^ *ArgList (.*) {$}} +// CHECK-DAG: {{^ *Array (.*) {$}} +// CHECK-DAG: {{^ *Class (.*) {$}} +// CHECK-DAG: {{^ *Union (.*) {$}} +// CHECK-DAG: {{^ *Enum (.*) {$}} +// CHECK-DAG: {{^ *VFTable (.*) {$}} +// CHECK-DAG: {{^ *VFTableShape (.*) {$}} +// CHECK-DAG: {{^ *FuncId (.*) {$}} +// CHECK-DAG: {{^ *MemberFuncId (.*) {$}} +// CHECK-DAG: {{^ *BuildInfo (.*) {$}} +// CHECK-DAG: {{^ *StringId (.*) {$}} +// CHECK-DAG: {{^ *UdtSourceLine (.*) {$}} +// CHECK-DAG: {{^ *MethodOverloadList (.*) {$}} +// No TypeServer2, since that is used with /Zi + +// MEMBER_RECORD +// CHECK-DAG: {{^ *BaseClass {$}} +// CHECK-DAG: {{^ *VirtualBaseClass {$}} +// CHECK-DAG: {{^ *VFPtr {$}} +// CHECK-DAG: {{^ *StaticDataMember {$}} +// CHECK-DAG: {{^ *OverloadedMethod {$}} +// CHECK-DAG: {{^ *DataMember {$}} +// CHECK-DAG: {{^ *NestedType {$}} +// CHECK-DAG: {{^ *OneMethod {$}} +// CHECK-DAG: {{^ *Enumerator {$}} + +#if !defined(__clang__) && _MSC_VER >= 1800 +#error "use clang or MSVC 2012 to regenerate the test" +#endif + +struct VBaseA; +void FriendFunc(); + +class Class { +public: + const Class *DataMember; +private: + static int StaticDataMember; +protected: + virtual void MemberFunction(); +public: + struct Nested; + friend ::VBaseA; + friend void FriendFunc() { } + void OverloadedMethod(); + void OverloadedMethod(int); +}; + +enum Enum { + E1 = 0, + E2 = 1 +}; + +int array[4] = {1, 2, 3, 4}; + +struct Class::Nested {}; + +struct ClassWithBase : Class { + virtual void MemberFunction(); + virtual void NewVirtual(); +}; +struct VBaseA { int x; }; +struct VBaseB : virtual VBaseA { int x; }; +struct VBaseC : virtual VBaseA { int x; }; +struct VBaseD : VBaseB, VBaseC { int x; }; + +union Union { + float f; + int i; +}; + +void UseAllTypes() { + Class a; + Class::Nested b; + ClassWithBase c; + VBaseD d; + Union e; + Enum f; + FriendFunc(); +} diff --git a/test/tools/llvm-readobj/codeview-vftable.test b/test/tools/llvm-readobj/codeview-vftable.test new file mode 100644 index 0000000000000..772f0c764983a --- /dev/null +++ b/test/tools/llvm-readobj/codeview-vftable.test @@ -0,0 +1,48 @@ +; The following two object files were generated using the following command: +; $ cl /Z7 /c t.cpp +; The contents of t.cpp follow: +; struct A { +; virtual void f(); +; }; +; struct B { +; virtual void f(); +; virtual void g(); +; }; +; struct C { +; virtual void f(); +; virtual void g(); +; virtual void h(); +; }; +; A a; +; B b; +; C c; + +RUN: llvm-readobj -codeview %p/Inputs/codeview-vftable.obj.coff | FileCheck %s + +CHECK: VFTable (0x10F0) { +CHECK-NEXT: TypeLeafKind: LF_VFTABLE (0x151D) +CHECK-NEXT: CompleteClass: A +CHECK-NEXT: OverriddenVFTable: 0x0 +CHECK-NEXT: VFPtrOffset: 0x0 +CHECK-NEXT: VFTableName: ??_7A@@6B@ +CHECK-NEXT: MethodName: ?f@A@@UEAAXXZ +CHECK-NEXT: } +CHECK-NEXT: VFTable (0x10F1) { +CHECK-NEXT: TypeLeafKind: LF_VFTABLE (0x151D) +CHECK-NEXT: CompleteClass: B +CHECK-NEXT: OverriddenVFTable: ??_7A@@6B@ (0x10F0) +CHECK-NEXT: VFPtrOffset: 0x0 +CHECK-NEXT: VFTableName: ??_7B@@6B@ +CHECK-NEXT: MethodName: ?f@B@@UEAAXXZ +CHECK-NEXT: MethodName: ?g@B@@UEAAXXZ +CHECK-NEXT: } +CHECK-NEXT: VFTable (0x10F2) { +CHECK-NEXT: TypeLeafKind: LF_VFTABLE (0x151D) +CHECK-NEXT: CompleteClass: C +CHECK-NEXT: OverriddenVFTable: ??_7B@@6B@ (0x10F1) +CHECK-NEXT: VFPtrOffset: 0x0 +CHECK-NEXT: VFTableName: ??_7C@@6B@ +CHECK-NEXT: MethodName: ?f@C@@UEAAXXZ +CHECK-NEXT: MethodName: ?g@C@@UEAAXXZ +CHECK-NEXT: MethodName: ?h@C@@UEAAXXZ +CHECK-NEXT: } diff --git a/test/tools/llvm-readobj/coff-debug-directory.test b/test/tools/llvm-readobj/coff-debug-directory.test new file mode 100644 index 0000000000000..f5c31c77abfe7 --- /dev/null +++ b/test/tools/llvm-readobj/coff-debug-directory.test @@ -0,0 +1,34 @@ +RUN: llvm-readobj -coff-debug-directory %p/Inputs/has_pdb.exe | FileCheck %s + +CHECK: DebugDirectory [ +CHECK: DebugEntry { +CHECK: Characteristics: 0x0 +CHECK: TimeDateStamp: 2016-06-01 22:53:16 (0x574F675C) +CHECK: MajorVersion: 0x0 +CHECK: MinorVersion: 0x0 +CHECK: Type: CodeView (0x2) +CHECK: SizeOfData: 0x36 +CHECK: AddressOfRawData: 0x5B068 +CHECK: PointerToRawData: 0x5A268 +CHECK: PDBInfo { +CHECK: PDBSignature: 0x53445352 +CHECK: PDBGUID: (96 83 40 42 81 07 9D 40 90 1B 4A 3C 0D 4F 56 32) +CHECK: PDBAge: 3 +CHECK: PDBFileName: D:\src\llvm\build\has_pdb.pdb +CHECK: } +CHECK: } +CHECK: DebugEntry { +CHECK: Characteristics: 0x0 +CHECK: TimeDateStamp: 2016-06-01 22:53:16 (0x574F675C) +CHECK: MajorVersion: 0x0 +CHECK: MinorVersion: 0x0 +CHECK: Type: VCFeature (0xC) +CHECK: SizeOfData: 0x14 +CHECK: AddressOfRawData: 0x5B0A0 +CHECK: PointerToRawData: 0x5A2A0 +CHECK: RawData ( +CHECK: 0000: 00000000 C1000000 C1000000 00000000 |................| +CHECK: 0010: C0000000 |....| +CHECK: ) +CHECK: } +CHECK: ] diff --git a/test/tools/llvm-readobj/dynamic.test b/test/tools/llvm-readobj/dynamic.test index 08f29fcd40a91..b905742e35f51 100644 --- a/test/tools/llvm-readobj/dynamic.test +++ b/test/tools/llvm-readobj/dynamic.test @@ -111,3 +111,40 @@ ELF-X86-EXE: 0x6FFFFFF0 VERSYM 0x4C0 ELF-X86-EXE: 0x6FFFFFFA RELCOUNT 6 ELF-X86-EXE: 0x00000000 NULL 0x0 ELF-X86-EXE: ] + +RUN: llvm-readobj -dynamic-table %p/Inputs/dynamic-table-so.aarch64 \ +RUN: | FileCheck %s -check-prefix ELF-AARCH64-SO + +ELF-AARCH64-SO: Format: ELF64-aarch64-little +ELF-AARCH64-SO: Arch: aarch64 +ELF-AARCH64-SO: AddressSize: 64bit +ELF-AARCH64-SO: LoadName: +ELF-AARCH64-SO: DynamicSection [ (26 entries) +ELF-AARCH64-SO: Tag Type Name/Value +ELF-AARCH64-SO: 0x0000000000000001 NEEDED SharedLibrary (libc.so.6) +ELF-AARCH64-SO: 0x000000000000000C INIT 0x660 +ELF-AARCH64-SO: 0x000000000000000D FINI 0x83C +ELF-AARCH64-SO: 0x0000000000000019 INIT_ARRAY 0x10DB8 +ELF-AARCH64-SO: 0x000000000000001B INIT_ARRAYSZ 8 (bytes) +ELF-AARCH64-SO: 0x000000000000001A FINI_ARRAY 0x10DC0 +ELF-AARCH64-SO: 0x000000000000001C FINI_ARRAYSZ 8 (bytes) +ELF-AARCH64-SO: 0x000000006FFFFEF5 GNU_HASH 0x1F0 +ELF-AARCH64-SO: 0x0000000000000005 STRTAB 0x420 +ELF-AARCH64-SO: 0x0000000000000006 SYMTAB 0x240 +ELF-AARCH64-SO: 0x000000000000000A STRSZ 210 (bytes) +ELF-AARCH64-SO: 0x000000000000000B SYMENT 24 (bytes) +ELF-AARCH64-SO: 0x0000000000000003 PLTGOT 0x10FE8 +ELF-AARCH64-SO: 0x0000000000000002 PLTRELSZ 96 (bytes) +ELF-AARCH64-SO: 0x0000000000000014 PLTREL RELA +ELF-AARCH64-SO: 0x0000000000000017 JMPREL 0x600 +ELF-AARCH64-SO: 0x000000006FFFFEF6 TLSDESC_PLT 0x6D0 +ELF-AARCH64-SO: 0x000000006FFFFEF7 TLSDESC_GOT 0x10FE0 +ELF-AARCH64-SO: 0x0000000000000007 RELA 0x540 +ELF-AARCH64-SO: 0x0000000000000008 RELASZ 192 (bytes) +ELF-AARCH64-SO: 0x0000000000000009 RELAENT 24 (bytes) +ELF-AARCH64-SO: 0x000000006FFFFFFE VERNEED 0x520 +ELF-AARCH64-SO: 0x000000006FFFFFFF VERNEEDNUM 1 +ELF-AARCH64-SO: 0x000000006FFFFFF0 VERSYM 0x4F2 +ELF-AARCH64-SO: 0x000000006FFFFFF9 RELACOUNT 3 +ELF-AARCH64-SO: 0x0000000000000000 NULL 0x0 +ELF-AARCH64-SO: ] diff --git a/test/tools/llvm-readobj/elf-groups.test b/test/tools/llvm-readobj/elf-groups.test new file mode 100644 index 0000000000000..cf2779765b55c --- /dev/null +++ b/test/tools/llvm-readobj/elf-groups.test @@ -0,0 +1,52 @@ +# Source file compiled: +##include <iostream> +# #include <typeinfo> +#template <class A> +#void foo(A variable) { +# std::cout << "foo is " << typeid(A).name() << "\n"; +#} +#int main () { +# char x = 'x'; +# int y = 1; +# foo(x); +# foo(y); +# return 0; +#} + +RUN: llvm-readobj -g %p/Inputs/elf-groups.x86_64 \ +RUN: | FileCheck %s +RUN: llvm-readobj -g -elf-output-style=GNU %p/Inputs/elf-groups.x86_64 \ +RUN: | FileCheck --check-prefix="GNU" %s +CHECK: Groups { +CHECK-NEXT: Group { +CHECK-NEXT: Name: .group (92) +CHECK-NEXT: Index: 1 +CHECK-NEXT: Type: COMDAT (0x1) +CHECK-NEXT: Signature: _Z3fooIcEvT_ +CHECK-NEXT: Section(s) in group [ +CHECK-NEXT: .text._Z3fooIcEvT_ (10) +CHECK-NEXT: .rela.text._Z3fooIcEvT_ (11) +CHECK-NEXT: ] +CHECK-NEXT: } +CHECK-NEXT: Group { +CHECK-NEXT: Name: .group (92) +CHECK-NEXT: Index: 2 +CHECK-NEXT: Type: COMDAT (0x1) +CHECK-NEXT: Signature: _Z3fooIiEvT_ +CHECK-NEXT: Section(s) in group [ +CHECK-NEXT: .text._Z3fooIiEvT_ (12) +CHECK-NEXT: .rela.text._Z3fooIiEvT_ (13) +CHECK-NEXT: ] +CHECK-NEXT: } + +GNU:COMDAT group section [ 1] `.group' [_Z3fooIcEvT_] contains 2 sections: +GNU-NEXT: [Index] Name +GNU-NEXT: [ 10] .text._Z3fooIcEvT_ +GNU-NEXT: [ 11] .rela.text._Z3fooIcEvT_ +GNU:COMDAT group section [ 2] `.group' [_Z3fooIiEvT_] contains 2 sections: +GNU-NEXT: [Index] Name +GNU-NEXT: [ 12] .text._Z3fooIiEvT_ +GNU-NEXT: [ 13] .rela.text._Z3fooIiEvT_ +GNU:COMDAT group section [ 3] `.group' [_ZNKSt9type_info4nameEv] contains 1 sections: +GNU-NEXT: [Index] Name +GNU-NEXT: [ 14] .text._ZNKSt9type_info4nameEv diff --git a/test/tools/llvm-readobj/elf-hash-histogram.test b/test/tools/llvm-readobj/elf-hash-histogram.test new file mode 100644 index 0000000000000..b7ddfabacaadb --- /dev/null +++ b/test/tools/llvm-readobj/elf-hash-histogram.test @@ -0,0 +1,27 @@ +RUN: llvm-readobj -elf-hash-histogram %p/Inputs/gnuhash.so.elf-ppc64 \ +RUN: --elf-output-style=GNU | FileCheck %s -check-prefix PPC64GNU +RUN: llvm-readobj -elf-hash-histogram %p/Inputs/gnuhash.so.elf-x86_64 --elf-output-style=GNU \ +RUN: | FileCheck %s -check-prefix X86GNU +RUN: llvm-readobj -elf-hash-histogram %p/Inputs/got-plt.exe.elf-mipsel --elf-output-style=GNU \ +RUN: | FileCheck %s -check-prefix SYSV + +PPC64GNU: Histogram for `.gnu.hash' bucket list length (total of 3 buckets) +PPC64GNU-NEXT: Length Number % of total Coverage +PPC64GNU-NEXT: 0 1 ( 33.3%) 0.0% +PPC64GNU-NEXT: 1 1 ( 33.3%) 25.0% +PPC64GNU-NEXT: 2 0 ( 0.0%) 25.0% +PPC64GNU-NEXT: 3 1 ( 33.3%) 100.0% + +X86GNU: Histogram for `.gnu.hash' bucket list length (total of 3 buckets) +X86GNU-NEXT: Length Number % of total Coverage +X86GNU-NEXT: 0 1 ( 33.3%) 0.0% +X86GNU-NEXT: 1 1 ( 33.3%) 25.0% +X86GNU-NEXT: 2 0 ( 0.0%) 25.0% +X86GNU-NEXT: 3 1 ( 33.3%) 100.0% + +SYSV: Histogram for bucket list length (total of 3 buckets) +SYSV-NEXT: Length Number % of total Coverage +SYSV-NEXT: 0 0 ( 0.0%) 0.0% +SYSV-NEXT: 1 0 ( 0.0%) 0.0% +SYSV-NEXT: 2 2 ( 66.7%) 57.1% +SYSV-NEXT: 3 1 ( 33.3%) 100.0% diff --git a/test/tools/llvm-readobj/elf-sec-compressed.test b/test/tools/llvm-readobj/elf-sec-compressed.test new file mode 100644 index 0000000000000..baf0c687a9134 --- /dev/null +++ b/test/tools/llvm-readobj/elf-sec-compressed.test @@ -0,0 +1,9 @@ +RUN: llvm-readobj -sections \ +RUN: %p/Inputs/compression.zlib.style.elf-x86-64 | FileCheck %s + +CHECK: Section { +CHECK: Name: .debug_info +CHECK-NEXT: Type: SHT_PROGBITS +CHECK-NEXT: Flags [ +CHECK-NEXT: SHF_COMPRESSED (0x800) +CHECK-NEXT: ] diff --git a/test/tools/llvm-readobj/elf-sec-flags.test b/test/tools/llvm-readobj/elf-sec-flags.test new file mode 100644 index 0000000000000..842ded3e9e59e --- /dev/null +++ b/test/tools/llvm-readobj/elf-sec-flags.test @@ -0,0 +1,90 @@ +# Check that llvm-readobj shows arch specific ELF section flags. + +# RUN: yaml2obj -docnum 1 %s > %t-amdgpu.o +# RUN: llvm-readobj -s %t-amdgpu.o | FileCheck -check-prefix=AMD %s + +# AMD: Flags [ (0x300000) +# AMD-NEXT: SHF_AMDGPU_HSA_GLOBAL (0x100000) +# AMD-NEXT: SHF_AMDGPU_HSA_READONLY (0x200000) +# AMD-NEXT: ] + +# amdgpu.o +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_AMDGPU + Flags: [] +Sections: + - Name: .amdgpu + Type: SHT_PROGBITS + Flags: [SHF_AMDGPU_HSA_GLOBAL, SHF_AMDGPU_HSA_READONLY] + Size: 4 + +# RUN: yaml2obj -docnum 2 %s > %t-hex.o +# RUN: llvm-readobj -s %t-hex.o | FileCheck -check-prefix=HEX %s + +# HEX: Flags [ (0x10000000) +# HEX-NEXT: SHF_HEX_GPREL (0x10000000) +# HEX-NEXT: ] + +# hex.o +--- !ELF +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_HEXAGON + Flags: [] +Sections: + - Name: .hex + Type: SHT_PROGBITS + Flags: [SHF_HEX_GPREL] + Size: 4 + +# RUN: yaml2obj -docnum 3 %s > %t-mips.o +# RUN: llvm-readobj -s %t-mips.o | FileCheck -check-prefix=MIPS %s + +# MIPS: Flags [ (0x38000000) +# MIPS-NEXT: SHF_MIPS_GPREL (0x10000000) +# MIPS-NEXT: SHF_MIPS_MERGE (0x20000000) +# MIPS-NEXT: SHF_MIPS_NOSTRIP (0x8000000) +# MIPS-NEXT: ] + +# mips.o +--- !ELF +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [] +Sections: + - Name: .mips + Type: SHT_PROGBITS + Flags: [SHF_MIPS_GPREL, SHF_MIPS_MERGE, SHF_MIPS_NOSTRIP] + Size: 4 + +# RUN: yaml2obj -docnum 4 %s > %t-x86_64.o +# RUN: llvm-readobj -s %t-x86_64.o | FileCheck -check-prefix=X86_64 %s + +# X86_64: Flags [ (0x10000000) +# X86_64-NEXT: SHF_X86_64_LARGE (0x10000000) +# X86_64-NEXT: ] + +# x86_64.o +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 + Flags: [] +Sections: + - Name: .x86_64 + Type: SHT_PROGBITS + Flags: [SHF_X86_64_LARGE] + Size: 4 +... diff --git a/test/tools/llvm-readobj/elf-versioninfo.test b/test/tools/llvm-readobj/elf-versioninfo.test index e8113e4b2fed3..919120e2caa93 100644 --- a/test/tools/llvm-readobj/elf-versioninfo.test +++ b/test/tools/llvm-readobj/elf-versioninfo.test @@ -47,35 +47,60 @@ CHECK-NEXT: } CHECK-NEXT: ] CHECK-NEXT: } -CHECK: Version definition { -CHECK-NEXT: Section Name: .gnu.version_d (70) -CHECK-NEXT: Address: 0x25C -CHECK-NEXT: Offset: 0x25C -CHECK-NEXT: Link: 2 -CHECK-NEXT: Entries [ -CHECK-NEXT: Entry { -CHECK-NEXT: Offset: 0x0 -CHECK-NEXT: Rev: 1 -CHECK-NEXT: Flags: 1 -CHECK-NEXT: Index: 1 -CHECK-NEXT: Cnt: 1 -CHECK-NEXT: Name: blah -CHECK-NEXT: } -CHECK-NEXT: Entry { -CHECK-NEXT: Offset: 0x1C -CHECK-NEXT: Rev: 1 -CHECK-NEXT: Flags: 0 -CHECK-NEXT: Index: 2 -CHECK-NEXT: Cnt: 1 -CHECK-NEXT: Name: VERSION1 -CHECK-NEXT: } -CHECK-NEXT: Entry { -CHECK-NEXT: Offset: 0x38 -CHECK-NEXT: Rev: 1 -CHECK-NEXT: Flags: 0 -CHECK-NEXT: Index: 3 -CHECK-NEXT: Cnt: 2 -CHECK-NEXT: Name: VERSION2 -CHECK-NEXT: } -CHECK-NEXT: ] +CHECK: SHT_GNU_verdef { +CHECK-NEXT: Definition { +CHECK-NEXT: Version: 1 +CHECK-NEXT: Flags: Base (0x1) +CHECK-NEXT: Index: 1 +CHECK-NEXT: Hash: 430712 +CHECK-NEXT: Name: blah +CHECK-NEXT: } +CHECK-NEXT: Definition { +CHECK-NEXT: Version: 1 +CHECK-NEXT: Flags: 0x0 +CHECK-NEXT: Index: 2 +CHECK-NEXT: Hash: 175630257 +CHECK-NEXT: Name: VERSION1 +CHECK-NEXT: } +CHECK-NEXT: Definition { +CHECK-NEXT: Version: 1 +CHECK-NEXT: Flags: 0x0 +CHECK-NEXT: Index: 3 +CHECK-NEXT: Hash: 175630258 +CHECK-NEXT: Name: VERSION2 +CHECK-NEXT: Predecessor: VERSION1 +CHECK-NEXT: } CHECK-NEXT: } + +RUN: llvm-readobj -V %p/Inputs/verneed.elf-x86-64 | FileCheck %s --check-prefix=VERNEED + +VERNEED: SHT_GNU_verneed { +VERNEED-NEXT: Dependency { +VERNEED-NEXT: Version: 1 +VERNEED-NEXT: Count: 2 +VERNEED-NEXT: FileName: verneed1.so.0 +VERNEED-NEXT: Entry { +VERNEED-NEXT: Hash: 1938 +VERNEED-NEXT: Flags: 0x0 +VERNEED-NEXT: Index: 3 +VERNEED-NEXT: Name: v2 +VERNEED-NEXT: } +VERNEED-NEXT: Entry { +VERNEED-NEXT: Hash: 1939 +VERNEED-NEXT: Flags: 0x0 +VERNEED-NEXT: Index: 2 +VERNEED-NEXT: Name: v3 +VERNEED-NEXT: } +VERNEED-NEXT: } +VERNEED-NEXT: Dependency { +VERNEED-NEXT: Version: 1 +VERNEED-NEXT: Count: 1 +VERNEED-NEXT: FileName: verneed2.so.0 +VERNEED-NEXT: Entry { +VERNEED-NEXT: Hash: 1937 +VERNEED-NEXT: Flags: 0x0 +VERNEED-NEXT: Index: 4 +VERNEED-NEXT: Name: v1 +VERNEED-NEXT: } +VERNEED-NEXT: } +VERNEED-NEXT: } diff --git a/test/tools/llvm-readobj/file-headers.test b/test/tools/llvm-readobj/file-headers.test index 2d67089d6118d..662c9b6bd4d7b 100644 --- a/test/tools/llvm-readobj/file-headers.test +++ b/test/tools/llvm-readobj/file-headers.test @@ -24,6 +24,8 @@ RUN: llvm-readobj -h %p/Inputs/magic.coff-unknown \ RUN: | FileCheck %s -check-prefix COFF-UNKNOWN RUN: llvm-readobj -h %p/Inputs/magic.coff-importlib \ RUN: | FileCheck %s -check-prefix COFF-IMPORTLIB +RUN: llvm-readobj -h %p/Inputs/trivial.obj.elf-lanai \ +RUN: | FileCheck %s -check-prefix ELF-LANAI COFF-ARM: File: {{(.*[/\\])?}}trivial.obj.coff-arm COFF-ARM-NEXT: Format: COFF-ARM @@ -335,3 +337,33 @@ COFF-IMPORTLIB-NEXT: Type: code COFF-IMPORTLIB-NEXT: Name type: noprefix COFF-IMPORTLIB-NEXT: Symbol: __imp__func COFF-IMPORTLIB-NEXT: Symbol: _func + +ELF-LANAI: Format: ELF32-lanai +ELF-LANAI-NEXT: Arch: lanai +ELF-LANAI-NEXT: AddressSize: 32bit +ELF-LANAI-NEXT: LoadName: +ELF-LANAI-NEXT: ElfHeader { +ELF-LANAI-NEXT: Ident { +ELF-LANAI-NEXT: Magic: (7F 45 4C 46) +ELF-LANAI-NEXT: Class: 32-bit (0x1) +ELF-LANAI-NEXT: DataEncoding: BigEndian (0x2) +ELF-LANAI-NEXT: FileVersion: 1 +ELF-LANAI-NEXT: OS/ABI: SystemV (0x0) +ELF-LANAI-NEXT: ABIVersion: 0 +ELF-LANAI-NEXT: Unused: (00 00 00 00 00 00 00) +ELF-LANAI-NEXT: } +ELF-LANAI-NEXT: Type: Relocatable (0x1) +ELF-LANAI-NEXT: Machine: EM_LANAI (0xF4) +ELF-LANAI-NEXT: Version: 1 +ELF-LANAI-NEXT: Entry: 0x0 +ELF-LANAI-NEXT: ProgramHeaderOffset: 0x0 +ELF-LANAI-NEXT: SectionHeaderOffset: 0x1A0 +ELF-LANAI-NEXT: Flags [ (0x0) +ELF-LANAI-NEXT: ] +ELF-LANAI-NEXT: HeaderSize: 52 +ELF-LANAI-NEXT: ProgramHeaderEntrySize: 0 +ELF-LANAI-NEXT: ProgramHeaderCount: 0 +ELF-LANAI-NEXT: SectionHeaderEntrySize: 40 +ELF-LANAI-NEXT: SectionHeaderCount: 8 +ELF-LANAI-NEXT: StringTableSectionIndex: 1 +ELF-LANAI-NEXT: } diff --git a/test/tools/llvm-readobj/gnu-file-headers.test b/test/tools/llvm-readobj/gnu-file-headers.test new file mode 100644 index 0000000000000..4b74d0948a3e5 --- /dev/null +++ b/test/tools/llvm-readobj/gnu-file-headers.test @@ -0,0 +1,46 @@ +RUN: llvm-readobj -h %p/Inputs/trivial.obj.elf-i386 --elf-output-style=GNU \ +RUN: | FileCheck %s -check-prefix ELF32 +RUN: llvm-readobj -h %p/Inputs/trivial.obj.elf-x86-64 --elf-output-style=GNU \ +RUN: | FileCheck %s -check-prefix ELF64 + +ELF32: ELF Header: +ELF32-NEXT: Magic: 7f 45 4c 46 01 01 01 03 00 00 00 00 00 00 00 00 +ELF32-NEXT: Class: ELF32 +ELF32-NEXT: Data: 2's complement, little endian +ELF32-NEXT: Version: 1 (current) +ELF32-NEXT: OS/ABI: UNIX - GNU +ELF32-NEXT: ABI Version: 0 +ELF32-NEXT: Type: REL (Relocatable file) +ELF32-NEXT: Machine: Intel 80386 +ELF32-NEXT: Version: 0x1 +ELF32-NEXT: Entry point address: 0x0 +ELF32-NEXT: Start of program headers: 0 (bytes into file) +ELF32-NEXT: Start of section headers: 200 (bytes into file) +ELF32-NEXT: Flags: 0x0 +ELF32-NEXT: Size of this header: 52 (bytes) +ELF32-NEXT: Size of program headers: 0 (bytes) +ELF32-NEXT: Number of program headers: 0 +ELF32-NEXT: Size of section headers: 40 (bytes) +ELF32-NEXT: Number of section headers: 10 +ELF32-NEXT: Section header string table index: 7 + +ELF64: ELF Header: +ELF64-NEXT: Magic: 7f 45 4c 46 02 01 01 03 00 00 00 00 00 00 00 00 +ELF64-NEXT: Class: ELF64 +ELF64-NEXT: Data: 2's complement, little endian +ELF64-NEXT: Version: 1 (current) +ELF64-NEXT: OS/ABI: UNIX - GNU +ELF64-NEXT: ABI Version: 0 +ELF64-NEXT: Type: REL (Relocatable file) +ELF64-NEXT: Machine: Advanced Micro Devices X86-64 +ELF64-NEXT: Version: 0x1 +ELF64-NEXT: Entry point address: 0x0 +ELF64-NEXT: Start of program headers: 0 (bytes into file) +ELF64-NEXT: Start of section headers: 184 (bytes into file) +ELF64-NEXT: Flags: 0x0 +ELF64-NEXT: Size of this header: 64 (bytes) +ELF64-NEXT: Size of program headers: 0 (bytes) +ELF64-NEXT: Number of program headers: 0 +ELF64-NEXT: Size of section headers: 64 (bytes) +ELF64-NEXT: Number of section headers: 10 +ELF64-NEXT: Section header string table index: 7 diff --git a/test/tools/llvm-readobj/gnu-phdrs.test b/test/tools/llvm-readobj/gnu-phdrs.test new file mode 100644 index 0000000000000..3054a5a70a2aa --- /dev/null +++ b/test/tools/llvm-readobj/gnu-phdrs.test @@ -0,0 +1,78 @@ +#Source : +#__thread int a = 1; +#__thread int b; +# +#int main () { +# b = 2; +# throw (a + b) ; +# return 0; +#} +# compiled as clang++ source.cpp +# and clang++ -m32 source.cpp + +RUN: llvm-readobj -program-headers %p/Inputs/phdrs-elf.exe-i386 --elf-output-style=GNU \ +RUN: | FileCheck %s -check-prefix ELF32 +RUN: llvm-readobj -program-headers %p/Inputs/phdrs-elf.exe-x86_64 \ +RUN: --elf-output-style=GNU | FileCheck %s -check-prefix ELF64 + +ELF32: Elf file type is EXEC (Executable file) +ELF32-NEXT: Entry point 0x8048460 +ELF32-NEXT: There are 10 program headers, starting at offset 52 + +ELF32: Program Headers: +ELF32-NEXT: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align +ELF32-NEXT: PHDR 0x000034 0x08048034 0x08048034 0x00140 0x00140 R E 0x4 +ELF32-NEXT: INTERP 0x000174 0x08048174 0x08048174 0x00013 0x00013 R 0x1 +ELF32-NEXT: [Requesting program interpreter: /lib/ld-linux.so.2] +ELF32-NEXT: LOAD 0x000000 0x08048000 0x08048000 0x006d0 0x006d0 R E 0x1000 +ELF32-NEXT: LOAD 0x000ef0 0x08049ef0 0x08049ef0 0x00128 0x00140 RW 0x1000 +ELF32-NEXT: DYNAMIC 0x000f08 0x08049f08 0x08049f08 0x000e8 0x000e8 RW 0x4 +ELF32-NEXT: NOTE 0x000188 0x08048188 0x08048188 0x00044 0x00044 R 0x4 +ELF32-NEXT: TLS 0x000ef0 0x08049ef0 0x08049ef0 0x00004 0x00008 R 0x4 +ELF32-NEXT: GNU_EH_FRAME 0x000640 0x08048640 0x08048640 0x0001c 0x0001c R 0x4 +ELF32-NEXT: GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x4 +ELF32-NEXT: GNU_RELRO 0x000ef0 0x08049ef0 0x08049ef0 0x00110 0x00110 R 0x1 + +ELF32: Section to Segment mapping: +ELF32-NEXT: Segment Sections... +ELF32-NEXT: 00 +ELF32-NEXT: 01 .interp +ELF32-NEXT: 02 .interp .note.ABI-tag .note.gnu.build-id .hash .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rel.dyn .rel.plt .init .plt .text .fini .rodata .eh_frame_hdr .eh_frame +ELF32-NEXT: 03 .tdata .ctors .dtors .jcr .dynamic .got .got.plt .data .bss +ELF32-NEXT: 04 .dynamic +ELF32-NEXT: 05 .note.ABI-tag .note.gnu.build-id +ELF32-NEXT: 06 .tdata .tbss +ELF32-NEXT: 07 .eh_frame_hdr +ELF32-NEXT: 08 +ELF32-NEXT: 09 .tdata .ctors .dtors .jcr .dynamic .got + +ELF64: Elf file type is EXEC (Executable file) +ELF64-NEXT: Entry point 0x400610 +ELF64-NEXT: There are 10 program headers, starting at offset 64 + +ELF64: Program Headers: +ELF64-NEXT: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align +ELF64-NEXT: PHDR 0x000040 0x0000000000400040 0x0000000000400040 0x000230 0x000230 R E 0x8 +ELF64-NEXT: INTERP 0x000270 0x0000000000400270 0x0000000000400270 0x00001c 0x00001c R 0x1 +ELF64-NEXT: [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2] +ELF64-NEXT: LOAD 0x000000 0x0000000000400000 0x0000000000400000 0x000924 0x000924 R E 0x200000 +ELF64-NEXT: LOAD 0x000db4 0x0000000000600db4 0x0000000000600db4 0x000274 0x0002a4 RW 0x200000 +ELF64-NEXT: DYNAMIC 0x000dd0 0x0000000000600dd0 0x0000000000600dd0 0x000210 0x000210 RW 0x8 +ELF64-NEXT: NOTE 0x00028c 0x000000000040028c 0x000000000040028c 0x000044 0x000044 R 0x4 +ELF64-NEXT: TLS 0x000db4 0x0000000000600db4 0x0000000000600db4 0x000004 0x000008 R 0x4 +ELF64-NEXT: GNU_EH_FRAME 0x00083c 0x000000000040083c 0x000000000040083c 0x00002c 0x00002c R 0x4 +ELF64-NEXT: GNU_STACK 0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 RW 0x8 +ELF64-NEXT: GNU_RELRO 0x000db4 0x0000000000600db4 0x0000000000600db4 0x00024c 0x00024c R 0x1 + +ELF64: Section to Segment mapping: +ELF64-NEXT: Segment Sections... +ELF64-NEXT: 00 +ELF64-NEXT: 01 .interp +ELF64-NEXT: 02 .interp .note.ABI-tag .note.gnu.build-id .hash .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt .init .plt .text .fini .rodata .eh_frame_hdr .eh_frame +ELF64-NEXT: 03 .tdata .init_array .fini_array .jcr .dynamic .got .got.plt .data .bss +ELF64-NEXT: 04 .dynamic +ELF64-NEXT: 05 .note.ABI-tag .note.gnu.build-id +ELF64-NEXT: 06 .tdata .tbss +ELF64-NEXT: 07 .eh_frame_hdr +ELF64-NEXT: 08 +ELF64-NEXT: 09 .tdata .init_array .fini_array .jcr .dynamic .got diff --git a/test/tools/llvm-readobj/gnu-relocations.test b/test/tools/llvm-readobj/gnu-relocations.test new file mode 100644 index 0000000000000..5b269e06377f8 --- /dev/null +++ b/test/tools/llvm-readobj/gnu-relocations.test @@ -0,0 +1,28 @@ +RUN: llvm-readobj -r %p/Inputs/relocs.obj.elf-i386 --elf-output-style=GNU \ +RUN: | FileCheck %s -check-prefix ELF32 +RUN: llvm-readobj -r %p/Inputs/relocs.obj.elf-x86_64 --elf-output-style=GNU \ +RUN: | FileCheck %s -check-prefix ELF64 + +ELF32: Relocation section '.rel.text' at offset 0x318 contains 41 entries: +ELF32-NEXT: Offset Info Type Sym. Value Symbol's Name +ELF32-NEXT: 00000002 00000500 R_386_NONE 00000000 sym +ELF32-NEXT: 00000008 00000501 R_386_32 00000000 sym +ELF32-NEXT: 0000000e 00000502 R_386_PC32 00000000 sym +ELF32-NEXT: 00000014 00000503 R_386_GOT32 00000000 sym +ELF32-NEXT: 0000001a 00000504 R_386_PLT32 00000000 sym +ELF32-NEXT: 00000020 00000505 R_386_COPY 00000000 sym +ELF32-NEXT: 00000026 00000506 R_386_GLOB_DAT 00000000 sym +ELF32-NEXT: 0000002c 00000507 R_386_JUMP_SLOT 00000000 sym +ELF32-NEXT: 00000032 00000508 R_386_RELATIVE 00000000 sym +ELF32-NEXT: 00000038 00000509 R_386_GOTOFF 00000000 sym + +ELF64: Relocation section '.rela.text' at offset 0x430 contains 38 entries: +ELF64-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend +ELF64-NEXT: 0000000000000003 0000000500000000 R_X86_64_NONE 0000000000000000 sym - 4 +ELF64-NEXT: 000000000000000a 0000000500000001 R_X86_64_64 0000000000000000 sym - 4 +ELF64-NEXT: 0000000000000011 0000000500000002 R_X86_64_PC32 0000000000000000 sym - 4 +ELF64-NEXT: 0000000000000018 0000000500000003 R_X86_64_GOT32 0000000000000000 sym - 4 +ELF64-NEXT: 000000000000001f 0000000500000004 R_X86_64_PLT32 0000000000000000 sym - 4 +ELF64-NEXT: 0000000000000026 0000000500000005 R_X86_64_COPY 0000000000000000 sym - 4 +ELF64-NEXT: 000000000000002d 0000000500000006 R_X86_64_GLOB_DAT 0000000000000000 sym - 4 +ELF64-NEXT: 0000000000000034 0000000500000007 R_X86_64_JUMP_SLOT 0000000000000000 sym - 4 diff --git a/test/tools/llvm-readobj/gnu-sections.test b/test/tools/llvm-readobj/gnu-sections.test new file mode 100644 index 0000000000000..fb90ce44d10f9 --- /dev/null +++ b/test/tools/llvm-readobj/gnu-sections.test @@ -0,0 +1,35 @@ +RUN: llvm-readobj -s %p/Inputs/relocs.obj.elf-i386 --elf-output-style=GNU \ +RUN: | FileCheck %s -check-prefix ELF32 +RUN: llvm-readobj -s %p/Inputs/relocs.obj.elf-x86_64 --elf-output-style=GNU \ +RUN: | FileCheck %s -check-prefix ELF64 + +ELF32: Section Headers: +ELF32-NEXT: [Nr] Name Type Address Off Size ES Flg Lk Inf Al +ELF32-NEXT: [ 0] NULL 00000000 000000 000000 00 0 0 0 +ELF32-NEXT: [ 1] .text PROGBITS 00000000 000034 0000f6 00 AX 0 0 4 +ELF32-NEXT: [ 2] .rel.text REL 00000000 000318 000148 08 6 1 4 +ELF32-NEXT: [ 3] .data PROGBITS 00000000 00012c 000000 00 WA 0 0 4 +ELF32-NEXT: [ 4] .bss NOBITS 00000000 00012c 000000 00 WA 0 0 4 +ELF32-NEXT: [ 5] .shstrtab STRTAB 00000000 00012c 000030 00 0 0 1 +ELF32-NEXT: [ 6] .symtab SYMTAB 00000000 00029c 000060 10 7 4 4 +ELF32-NEXT: [ 7] .strtab STRTAB 00000000 0002fc 00001b 00 0 0 1 +ELF32-NEXT: Key to Flags: +ELF32-NEXT: W (write), A (alloc), X (execute), M (merge), S (strings), l (large) +ELF32-NEXT: I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown) +ELF32-NEXT: O (extra OS processing required) o (OS specific), p (processor specific) + +ELF64: There are 8 section headers, starting at offset 0x180: +ELF64: Section Headers: +ELF64-NEXT: [Nr] Name Type Address Off Size ES Flg Lk Inf Al +ELF64-NEXT: [ 0] NULL 0000000000000000 000000 000000 00 0 0 0 +ELF64-NEXT: [ 1] .text PROGBITS 0000000000000000 000040 00010a 00 AX 0 0 4 +ELF64-NEXT: [ 2] .rela.text RELA 0000000000000000 000430 000390 18 6 1 8 +ELF64-NEXT: [ 3] .data PROGBITS 0000000000000000 00014c 000000 00 WA 0 0 4 +ELF64-NEXT: [ 4] .bss NOBITS 0000000000000000 00014c 000000 00 WA 0 0 4 +ELF64-NEXT: [ 5] .shstrtab STRTAB 0000000000000000 00014c 000031 00 0 0 1 +ELF64-NEXT: [ 6] .symtab SYMTAB 0000000000000000 000380 000090 18 7 4 8 +ELF64-NEXT: [ 7] .strtab STRTAB 0000000000000000 000410 00001b 00 0 0 1 +ELF64-NEXT: Key to Flags: +ELF64-NEXT: W (write), A (alloc), X (execute), M (merge), S (strings), l (large) +ELF64-NEXT: I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown) +ELF64-NEXT: O (extra OS processing required) o (OS specific), p (processor specific) diff --git a/test/tools/llvm-readobj/gnu-symbols.test b/test/tools/llvm-readobj/gnu-symbols.test new file mode 100644 index 0000000000000..aed38ef680bed --- /dev/null +++ b/test/tools/llvm-readobj/gnu-symbols.test @@ -0,0 +1,46 @@ +RUN: llvm-readobj -symbols %p/Inputs/symbols-proc-specific.elf-hexagon \ +RUN: --elf-output-style=GNU | FileCheck %s -check-prefix ELF32 +RUN: llvm-readobj -symbols %p/Inputs/relocs.obj.elf-x86_64 --elf-output-style=GNU \ +RUN: | FileCheck %s -check-prefix ELF64 +RUN: llvm-readobj -symbols %p/Inputs/gnuhash.so.elf-x86_64 --elf-output-style=GNU \ +RUN: | FileCheck %s -check-prefix DYN + +ELF32: Symbol table '.symtab' contains 5 entries: +ELF32-NEXT: Num: Value Size Type Bind Vis Ndx Name +ELF32-NEXT: 0: 00000000 0 NOTYPE LOCAL DEFAULT UND +ELF32-NEXT: 1: 00000000 0 FILE LOCAL DEFAULT ABS a.c +ELF32-NEXT: 2: 00000000 20 FUNC GLOBAL DEFAULT 2 main +ELF32-NEXT: 3: 00000004 4 OBJECT GLOBAL DEFAULT PRC[0xff03] x +ELF32-NEXT: 4: 00000000 4 OBJECT GLOBAL DEFAULT 3 y + +ELF64: Symbol table '.symtab' contains 6 entries: +ELF64-NEXT: Num: Value Size Type Bind Vis Ndx Name +ELF64-NEXT: 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND +ELF64-NEXT: 1: 0000000000000000 0 SECTION LOCAL DEFAULT 1 +ELF64-NEXT: 2: 0000000000000000 0 SECTION LOCAL DEFAULT 3 +ELF64-NEXT: 3: 0000000000000000 0 SECTION LOCAL DEFAULT 4 +ELF64-NEXT: 4: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND _GLOBAL_OFFSET_TABLE_ +ELF64-NEXT: 5: 0000000000000000 0 TLS GLOBAL DEFAULT UND sym + +DYN:Symbol table '.dynsym' contains 5 entries: +DYN-NEXT: Num: Value Size Type Bind Vis Ndx Name +DYN-NEXT: 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND +DYN-NEXT: 1: 00000000000001b8 0 NOTYPE GLOBAL DEFAULT 4 foo +DYN-NEXT: 2: 0000000000200268 0 NOTYPE GLOBAL DEFAULT 5 _edata +DYN-NEXT: 3: 0000000000200268 0 NOTYPE GLOBAL DEFAULT 5 _end +DYN-NEXT: 4: 0000000000200268 0 NOTYPE GLOBAL DEFAULT 5 __bss_start + +DYN: Symbol table '.symtab' contains 12 entries: +DYN-NEXT: Num: Value Size Type Bind Vis Ndx Name +DYN-NEXT: 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND +DYN-NEXT: 1: 00000000000000e8 0 SECTION LOCAL DEFAULT 1 +DYN-NEXT: 2: 0000000000000120 0 SECTION LOCAL DEFAULT 2 +DYN-NEXT: 3: 0000000000000198 0 SECTION LOCAL DEFAULT 3 +DYN-NEXT: 4: 00000000000001b8 0 SECTION LOCAL DEFAULT 4 +DYN-NEXT: 5: 00000000002001b8 0 SECTION LOCAL DEFAULT 5 +DYN-NEXT: 6: 00000000002001b8 0 OBJECT LOCAL DEFAULT 5 _DYNAMIC +DYN-NEXT: 7: 0000000000200268 0 OBJECT LOCAL DEFAULT 5 _GLOBAL_OFFSET_TABLE_ +DYN-NEXT: 8: 0000000000200268 0 NOTYPE GLOBAL DEFAULT 5 __bss_start +DYN-NEXT: 9: 00000000000001b8 0 NOTYPE GLOBAL DEFAULT 4 foo +DYN-NEXT: 10: 0000000000200268 0 NOTYPE GLOBAL DEFAULT 5 _edata +DYN-NEXT: 11: 0000000000200268 0 NOTYPE GLOBAL DEFAULT 5 _end diff --git a/test/tools/llvm-readobj/mips-got-overlapped.test b/test/tools/llvm-readobj/mips-got-overlapped.test new file mode 100644 index 0000000000000..ae4ae9532950e --- /dev/null +++ b/test/tools/llvm-readobj/mips-got-overlapped.test @@ -0,0 +1,45 @@ +# Check that llvm-readobj -mips-plt-got correctly shows .got section +# content if there are some other zero-sized sections with the same +# address as the .got. got-over.exe.elf-mips has zero-sized .data +# section at the same offset .got section. + +RUN: llvm-readobj -mips-plt-got %p/Inputs/got-over.exe.elf-mips | FileCheck %s + +GOT-OBJ: Cannot find PLTGOT dynamic table tag. + +CHECK: Primary GOT { +CHECK-NEXT: Canonical gp value: 0x418270 +CHECK-NEXT: Reserved entries [ +CHECK-NEXT: Entry { +CHECK-NEXT: Address: 0x410280 +CHECK-NEXT: Access: -32752 +CHECK-NEXT: Initial: 0x0 +CHECK-NEXT: Purpose: Lazy resolver +CHECK-NEXT: } +CHECK-NEXT: Entry { +CHECK-NEXT: Address: 0x410284 +CHECK-NEXT: Access: -32748 +CHECK-NEXT: Initial: 0x80000000 +CHECK-NEXT: Purpose: Module pointer (GNU extension) +CHECK-NEXT: } +CHECK-NEXT: ] +CHECK-NEXT: Local entries [ +CHECK-NEXT: Entry { +CHECK-NEXT: Address: 0x410288 +CHECK-NEXT: Access: -32744 +CHECK-NEXT: Initial: 0x4001B8 +CHECK-NEXT: } +CHECK-NEXT: ] +CHECK-NEXT: Global entries [ +CHECK-NEXT: Entry { +CHECK-NEXT: Address: 0x41028C +CHECK-NEXT: Access: -32740 +CHECK-NEXT: Initial: 0x0 +CHECK-NEXT: Value: 0x0 +CHECK-NEXT: Type: None +CHECK-NEXT: Section: Undefined +CHECK-NEXT: Name: _foo +CHECK-NEXT: } +CHECK-NEXT: ] +CHECK-NEXT: Number of TLS and multi-GOT entries: 0 +CHECK-NEXT: } diff --git a/test/tools/llvm-readobj/mips-options-sec.test b/test/tools/llvm-readobj/mips-options-sec.test new file mode 100644 index 0000000000000..0fe8aad3dfa14 --- /dev/null +++ b/test/tools/llvm-readobj/mips-options-sec.test @@ -0,0 +1,12 @@ +RUN: llvm-readobj -mips-options %p/Inputs/options.obj.elf-mipsel | FileCheck %s + +CHECK: MIPS Options { +CHECK-NEXT: ODK_REGINFO { +CHECK-NEXT: GP: 0x0 +CHECK-NEXT: General Mask: 0xF2000017 +CHECK-NEXT: Co-Proc Mask0: 0x0 +CHECK-NEXT: Co-Proc Mask1: 0x0 +CHECK-NEXT: Co-Proc Mask2: 0x0 +CHECK-NEXT: Co-Proc Mask3: 0x0 +CHECK-NEXT: } +CHECK-NEXT: } diff --git a/test/tools/llvm-readobj/mips-st-other.test b/test/tools/llvm-readobj/mips-st-other.test new file mode 100644 index 0000000000000..1f9de58ca89c9 --- /dev/null +++ b/test/tools/llvm-readobj/mips-st-other.test @@ -0,0 +1,25 @@ +RUN: llvm-readobj -symbols %p/Inputs/st-other.obj.elf-mips \ +RUN: | FileCheck -check-prefix=MREG %s +RUN: llvm-readobj -symbols %p/Inputs/st-other.obj.elf-mips16 \ +RUN: | FileCheck -check-prefix=M16 %s + +MREG: Name: foo +MREG-NEXT: Value: 0x0 +MREG-NEXT: Size: 0 +MREG-NEXT: Binding: Global +MREG-NEXT: Type: None +MREG-NEXT: Other [ (0x29) +MREG-NEXT: STO_MIPS_PIC (0x20) +MREG-NEXT: STO_MIPS_PLT (0x8) +MREG-NEXT: STV_INTERNAL (0x1) +MREG-NEXT: ] + +M16: Name: foo +M16-NEXT: Value: 0x0 +M16-NEXT: Size: 0 +M16-NEXT: Binding: Global +M16-NEXT: Type: None +M16-NEXT: Other [ (0xF1) +M16-NEXT: STO_MIPS_MIPS16 (0xF0) +M16-NEXT: STV_INTERNAL (0x1) +M16-NEXT: ] diff --git a/test/tools/llvm-readobj/reloc-types.test b/test/tools/llvm-readobj/reloc-types.test index 36e2f7010bdff..74148c07015d0 100644 --- a/test/tools/llvm-readobj/reloc-types.test +++ b/test/tools/llvm-readobj/reloc-types.test @@ -7,6 +7,7 @@ RUN: llvm-readobj -r -expand-relocs %p/Inputs/relocs.obj.elf-i386 | FileChec RUN: llvm-readobj -r -expand-relocs %p/Inputs/relocs.obj.elf-x86_64 | FileCheck %s -check-prefix ELF-64 RUN: llvm-readobj -r -expand-relocs %p/Inputs/relocs.obj.elf-aarch64 | FileCheck %s -check-prefix ELF-AARCH64 RUN: llvm-readobj -r -expand-relocs %p/Inputs/relocs.obj.elf-arm | FileCheck %s -check-prefix ELF-ARM +RUN: llvm-readobj -r -expand-relocs %p/Inputs/relocs.obj.elf-lanai | FileCheck %s -check-prefix ELF-LANAI RUN: llvm-readobj -r -expand-relocs %p/Inputs/relocs.obj.elf-mips | FileCheck %s -check-prefix ELF-MIPS RUN: llvm-readobj -r -expand-relocs %p/Inputs/relocs.obj.elf-mips64el | FileCheck %s -check-prefix ELF-MIPS64EL RUN: llvm-readobj -r -expand-relocs %p/Inputs/relocs.obj.elf-ppc64 | FileCheck %s -check-prefix ELF-PPC64 @@ -405,6 +406,14 @@ ELF-ARM: Type: R_ARM_THM_TLS_DESCSEQ16 (129) ELF-ARM: Type: R_ARM_THM_TLS_DESCSEQ32 (130) ELF-ARM: Type: R_ARM_IRELATIVE (160) +ELF-LANAI: Type: R_LANAI_NONE (0) +ELF-LANAI: Type: R_LANAI_21 (1) +ELF-LANAI: Type: R_LANAI_21_F (2) +ELF-LANAI: Type: R_LANAI_25 (3) +ELF-LANAI: Type: R_LANAI_32 (4) +ELF-LANAI: Type: R_LANAI_HI16 (5) +ELF-LANAI: Type: R_LANAI_LO16 (6) + ELF-MIPS: Type: R_MIPS_NONE (0) ELF-MIPS: Type: R_MIPS_16 (1) ELF-MIPS: Type: R_MIPS_32 (2) |