summaryrefslogtreecommitdiffstats
path: root/llvm/test/tools/llvm-readobj
diff options
context:
space:
mode:
authorWolfgang Pieb <Wolfgang.Pieb@sony.com>2019-08-05 22:47:07 +0000
committerWolfgang Pieb <Wolfgang.Pieb@sony.com>2019-08-05 22:47:07 +0000
commitc71c6299265678f9495966efd859770660ed7b50 (patch)
tree46188b65acf4959ec85d83031362b65d314b7549 /llvm/test/tools/llvm-readobj
parente39e79358fcdd5d8ad809defaa821f0bbfa809a5 (diff)
downloadbcm5719-llvm-c71c6299265678f9495966efd859770660ed7b50.tar.gz
bcm5719-llvm-c71c6299265678f9495966efd859770660ed7b50.zip
[llvm-readelf] Support dumping of stack sizes sections with readelf --stack-sizes
Reviewers: jhenderson, grimar, rupprecht Differential Revision: https://reviews.llvm.org/D65313 llvm-svn: 367942
Diffstat (limited to 'llvm/test/tools/llvm-readobj')
-rw-r--r--llvm/test/tools/llvm-readobj/stack-sizes.test473
1 files changed, 473 insertions, 0 deletions
diff --git a/llvm/test/tools/llvm-readobj/stack-sizes.test b/llvm/test/tools/llvm-readobj/stack-sizes.test
new file mode 100644
index 00000000000..ecfba00dd71
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/stack-sizes.test
@@ -0,0 +1,473 @@
+## Check that we correctly display the contents of the .stack_sizes section
+## in a relocatable object file.
+
+# RUN: yaml2obj --docnum=1 %s > %t01
+# RUN: llvm-readelf --stack-sizes %t01 \
+# RUN: | FileCheck %s --check-prefix=RELOC --strict-whitespace --match-full-lines
+
+# RELOC: Size Function
+# RELOC-NEXT: 16 referenced_by_symbol_foo
+# RELOC-NEXT: 32 referenced_via_section_bar
+# RELOC-NEXT: 8 separate_text_section_baz
+# RELOC-NOT:{{.}}
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [SHF_ALLOC]
+ Size: 16
+ - Name: .text.baz
+ Type: SHT_PROGBITS
+ Flags: [SHF_ALLOC]
+ Size: 16
+ - Name: .stack_sizes
+ Type: SHT_PROGBITS
+## 2 stack size entries. Each consists of an address (subject to relocation)
+## followed by a ULEB for the size.
+ Content: "000000000000000010000000000000000020"
+ Link: .text
+ - Name: .stack_sizes.baz
+ Type: SHT_PROGBITS
+## One stack size entry.
+ Content: "200000000000000008"
+ Link: .text.baz
+ - Name: .rela.stack_sizes
+ Type: SHT_RELA
+ Info: .stack_sizes
+ Relocations:
+## A symbol relative reference.
+ - Offset: 0
+ Symbol: referenced_by_symbol_foo
+ Type: R_X86_64_64
+## A section relative reference.
+ - Offset: 9
+ Addend: 16
+ Symbol: .text
+ Type: R_X86_64_64
+ - Name: .rela.stack_sizes.baz
+ Type: SHT_RELA
+ Info: .stack_sizes.baz
+ Relocations:
+ - Offset: 0
+ Symbol: separate_text_section_baz
+ Type: R_X86_64_64
+Symbols:
+ - Name: separate_text_section_baz
+ Section: .text.baz
+ Type: STT_FUNC
+ - Name: .text
+ Section: .text
+ Type: STT_SECTION
+ - Name: referenced_by_symbol_foo
+ Section: .text
+ Type: STT_FUNC
+ Binding: STB_GLOBAL
+ - Name: referenced_via_section_bar
+ Section: .text
+ Value: 0x10
+ Type: STT_FUNC
+ Binding: STB_GLOBAL
+
+## Check that we correctly report the stack sizes in an executable (non-relocatable)
+## object file.
+
+# RUN: yaml2obj --docnum=2 %s > %t02
+# RUN: llvm-readelf --stack-sizes %t02 \
+# RUN: | FileCheck %s --check-prefix=EXEC --strict-whitespace --match-full-lines
+
+# EXEC: Size Function
+# EXEC-NEXT: 16 foo
+# EXEC-NEXT: 32 bar
+# EXEC-NOT:{{.}}
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [SHF_ALLOC]
+ Size: 16
+ - Name: .stack_sizes
+ Type: SHT_PROGBITS
+ Content: "100000000000000010200000000000000020"
+ Link: .text
+Symbols:
+ - Name: foo
+ Section: .text
+ Value: 0x10
+ Type: STT_FUNC
+ Binding: STB_GLOBAL
+ - Name: bar
+ Section: .text
+ Value: 0x20
+ Type: STT_FUNC
+ Binding: STB_GLOBAL
+
+## Check that we report an error when we find relocations whose offsets point outside
+## of the .stack_sizes section.
+
+# RUN: yaml2obj --docnum=3 %s > %t03
+# RUN: not llvm-readelf --stack-sizes %t03 2>&1 | FileCheck %s --check-prefix=SHORT -DFILE=%t03
+
+# SHORT: error: '[[FILE]]': found invalid relocation offset into section .stack_sizes while trying to extract a stack size entry
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [SHF_ALLOC]
+ Size: 16
+ - Name: .stack_sizes
+ Type: SHT_PROGBITS
+ Size: 1
+ Link: .text
+ - Name: .rela.stack_sizes
+ Type: SHT_RELA
+ Info: .stack_sizes
+ Relocations:
+ - Offset: 1
+ Symbol: foo
+ Type: R_X86_64_64
+Symbols:
+ - Name: foo
+ Section: .text
+ Type: STT_FUNC
+ Binding: STB_GLOBAL
+
+## Check that we warn about a function symbol that is not in the section
+## that is referenced by the stack sizes section's sh_link.
+
+# RUN: yaml2obj --docnum=4 %s > %t04
+# RUN: llvm-readelf --stack-sizes %t04 2> %t04.err | FileCheck %s --check-prefix=WRONGSECTION
+# RUN: FileCheck %s < %t04.err --check-prefix=WRONGSECTION-ERR -DFILE=%t04
+
+# WRONGSECTION: Size Function
+# WRONGSECTION-NEXT: 8 foo
+# WRONGSECTION-ERR: warning: '[[FILE]]': relocation symbol foo is not in the expected section
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Size: 8
+ - Name: .text2
+ Type: SHT_PROGBITS
+ Size: 8
+ Flags: [SHF_ALLOC]
+ - Name: .stack_sizes
+ Type: SHT_PROGBITS
+ Content: "000000000000000008"
+ Link: .text2
+ - Name: .rela.stack_sizes
+ Type: SHT_RELA
+ Info: .stack_sizes
+ Relocations:
+ - Offset: 0
+ Symbol: foo
+ Type: R_X86_64_64
+Symbols:
+ - Name: foo
+ Section: .text
+ Type: STT_FUNC
+ Binding: STB_GLOBAL
+
+## Check that we report an error when a stack sizes section ends with an incomplete stack size entry.
+
+# RUN: yaml2obj --docnum=5 %s > %t05
+# RUN: not llvm-readelf --stack-sizes %t05 2>&1 %t05.err | \
+# RUN: FileCheck %s --check-prefix=SUDDENEND -DFILE=%t05
+
+# SUDDENEND: error: '[[FILE]]': section .stack_sizes ended while trying to extract a stack size entry
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [SHF_ALLOC]
+ Size: 16
+ - Name: .stack_sizes
+ Type: SHT_PROGBITS
+ Content: "10000000"
+ Link: .text
+Symbols:
+ - Name: foo
+ Section: .text
+ Value: 0x10
+ Type: STT_FUNC
+ Binding: STB_GLOBAL
+
+## Check that we report an invalid stack size, which is represented by a ULEB that
+## ends in a byte with the high bit set.
+
+# RUN: yaml2obj --docnum=6 %s > %t06
+# RUN: not llvm-readelf --stack-sizes %t06 2>&1 | FileCheck %s --check-prefix=BADSIZE -DFILE=%t06
+
+# BADSIZE: error: '[[FILE]]': could not extract a valid stack size in section .stack_sizes
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [SHF_ALLOC]
+ Size: 16
+ - Name: .stack_sizes
+ Type: SHT_PROGBITS
+ Content: "100000000000000080"
+ Link: .text
+Symbols:
+ - Name: foo
+ Section: .text
+ Value: 0x10
+ Type: STT_FUNC
+ Binding: STB_GLOBAL
+
+## Check that we report a warning when a relocation symbol does not belong to a
+## valid section. We expect a stack size entry with an unknown symbol in the
+## output.
+
+# RUN: yaml2obj --docnum=7 %s > %t07
+# RUN: llvm-readelf --stack-sizes %t07 2> %t07.err | FileCheck %s --check-prefix=BADSECTION-OUT
+# RUN: FileCheck %s < %t07.err --check-prefix=BADSECTION-ERR -DFILE=%t07
+
+# BADSECTION-OUT: Size Function
+# BADSECTION-OUT: 8 ?
+# BADSECTION-ERR: warning: '[[FILE]]': cannot identify the section for relocation symbol foo
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Size: 8
+ - Name: .stack_sizes
+ Type: SHT_PROGBITS
+ Link: .text
+ Content: "000000000000000008"
+ - Name: .rela.stack_sizes
+ Type: SHT_RELA
+ Info: .stack_sizes
+ Relocations:
+ - Offset: 0
+ Symbol: foo
+ Type: R_X86_64_64
+Symbols:
+ - Name: foo
+## An invalid section index.
+ Index: 10
+ Type: STT_FUNC
+ Binding: STB_GLOBAL
+
+## Check that we report a warning when a stack sizes section does not come with
+## a corresponding relocation section.
+
+# RUN: yaml2obj --docnum=8 %s > %t08
+# RUN: llvm-readelf --stack-sizes %t08 2> %t08.err | FileCheck %s --check-prefix=NORELOCSECTION-OUT
+# RUN: FileCheck %s < %t08.err --check-prefix=NORELOCSECTION-ERR -DFILE=%t08
+
+# NORELOCSECTION-OUT: Size Function
+# NORELOCSECTION-OUT-NOT: {{.}}
+# NORELOCSECTION-ERR: warning: '[[FILE]]': section .stack_sizes does not have a corresponding relocation section
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Size: 8
+ - Name: .stack_sizes
+ Type: SHT_PROGBITS
+ Link: .text
+ Content: "000000000000000008"
+
+## Check that we handle multiple object files, separately and when they
+## are in an archive. This also checks whether we have blank lines between the
+## tables.
+
+# RUN: llvm-ar rc %t1.a %t01 %t02
+# RUN: llvm-readelf --stack-sizes %t01 %t02 | FileCheck %s --check-prefix=MULTIPLE
+# RUN: llvm-readelf --stack-sizes %t1.a \
+# RUN: | FileCheck %s --check-prefix=MULTIPLE --check-prefix=ARCHIVE --strict-whitespace\
+# RUN: --match-full-lines -DFILE=%t1.a
+
+# ARCHIVE:File: [[FILE]]({{.*01}})
+# MULTIPLE:Stack Sizes:
+# MULTIPLE-NEXT: Size Function
+# MULTIPLE-NEXT: 16 referenced_by_symbol_foo
+# MULTIPLE-NEXT: 32 referenced_via_section_bar
+# MULTIPLE-NEXT: 8 separate_text_section_baz
+# MULTIPLE-EMPTY:
+# ARCHIVE:File: [[FILE]]({{.*02}})
+# MULTIPLE-EMPTY:
+# MULTIPLE-NEXT:Stack Sizes:
+# MULTIPLE-NEXT: Size Function
+# MULTIPLE-NEXT: 16 foo
+# MULTIPLE-NEXT: 32 bar
+
+## Check that we do not consider symbols that are not function symbols, even though
+## a relocation references them.
+
+# RUN: yaml2obj --docnum=9 %s > %t14
+# RUN: llvm-readelf --stack-sizes %t14 2> %t14.err | FileCheck %s --check-prefix=NONFUNCTIONSYM
+# RUN: FileCheck %s < %t14.err --check-prefix=NONFUNCTIONSYM-ERR -DFILE=%t14
+
+# NONFUNCTIONSYM: Stack Sizes:
+# NONFUNCTIONSYM: 0 ?
+# NONFUNCTIONSYM-ERR: warning: '[[FILE]]': could not identify function symbol for stack size entry
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Size: 16
+ - Name: .stack_sizes
+ Type: SHT_PROGBITS
+ Size: 9
+ Link: .text
+ - Name: .rela.stack_sizes
+ Type: SHT_RELA
+ Info: .stack_sizes
+ Relocations:
+ - Offset: 0
+ Symbol: foo
+ Type: R_X86_64_64
+Symbols:
+ - Name: foo
+ Section: .text
+ Type: STT_OBJECT
+ Binding: STB_GLOBAL
+
+## Check that we report an error when we find an unsupported relocation
+## in the section that contains the stack size entries' relocations.
+
+# RUN: yaml2obj --docnum=10 %s > %t15
+# RUN: not llvm-readelf --stack-sizes %t15 2>&1 | FileCheck %s --check-prefix=UNSUPPRELOC -DFILE=%t15
+
+# UNSUPPRELOC: error: '[[FILE]]': unsupported relocation type in section .rela.stack_sizes: R_X86_64_RELATIVE
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Size: 8
+ - Name: .stack_sizes
+ Type: SHT_PROGBITS
+ Size: 16
+ Link: .text
+ - Name: .rela.stack_sizes
+ Type: SHT_RELA
+ Info: .stack_sizes
+ Relocations:
+ - Offset: 0
+ Symbol: foo
+ Type: R_X86_64_RELATIVE
+Symbols:
+ - Name: foo
+ Section: .text
+ Type: STT_FUNC
+ Binding: STB_GLOBAL
+
+## Check that warning messages in archives do not impact other members. In the following
+## test, the first archive member generates a warning and we make sure all the information
+## is still dumped.
+
+# RUN: llvm-ar rc %t2.a %t04 %t01
+# RUN: llvm-readelf --stack-sizes %t2.a 2>&1 | FileCheck %s --check-prefix=ARCHIVEWARN \
+# RUN: -DFILE=%t2.a --strict-whitespace --match-full-lines
+
+# ARCHIVEWARN:File: [[FILE]]({{.*04}})
+# ARCHIVEWARN:Stack Sizes:
+# ARCHIVEWARN-NEXT: Size Function
+# ARCHIVEWARN: 8 foo
+# ARCHIVEWARN:File: [[FILE]]({{.*01}})
+# ARCHIVEWARN:Stack Sizes:
+# ARCHIVEWARN-NEXT: Size Function
+# ARCHIVEWARN-NEXT: 16 referenced_by_symbol_foo
+# ARCHIVEWARN-NEXT: 32 referenced_via_section_bar
+# ARCHIVEWARN-NEXT: 8 separate_text_section_baz
+# ARCHIVEWARN-NOT:{{.}}
+# ARCHIVEWARN-ERR:warning: '[[FILE]]': relocation symbol foo is not in the expected section
+
+## Check that we demangle function names when requested.
+
+# RUN: yaml2obj --docnum=11 %s > %t16
+# RUN: llvm-readelf --stack-sizes --demangle %t16 | FileCheck %s --check-prefix=DEMANGLE
+
+# DEMANGLE: 16 foo(float)
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [SHF_ALLOC]
+ Size: 16
+ - Name: .stack_sizes
+ Type: SHT_PROGBITS
+ Content: "100000000000000010"
+ Link: .text
+Symbols:
+ - Name: _Z3foof
+ Section: .text
+ Value: 0x10
+ Type: STT_FUNC
+ Binding: STB_GLOBAL
+
+## Check that we emit a 'not implemented' message for an attempt to dump stack-sizes
+## sections LLVM-style, i.e. when invoking llvm-readobj.
+## FIXME: Replace this test with something functional when the feature is implemented.
+
+# RUN: llvm-readobj --stack-sizes %t01 | FileCheck %s --check-prefix=NOTIMPLEMENTED
+
+# NOTIMPLEMENTED: Dumping of stack sizes in LLVM style is not implemented yet
OpenPOWER on IntegriCloud