1## Here we test how the --stackmap option can be used to dump .llvm_stackmaps sections.
2
3## Check we are able to dump an empty .llvm_stackmaps section. Document that
4## we are only trying to dump the first stack map section and ignore others if any.
5
6# RUN: yaml2obj %s -o %t
7# RUN: llvm-readobj %t --stackmap 2>&1 | \
8# RUN:   FileCheck %s --check-prefix=EMPTY --implicit-check-not=warning:
9# RUN: llvm-readelf %t --stackmap 2>&1 | \
10# RUN:   FileCheck %s --check-prefix=EMPTY --implicit-check-not=warning:
11
12# EMPTY:      LLVM StackMap Version: 3
13# EMPTY-NEXT: Num Functions: 0
14# EMPTY-NEXT: Num Constants: 0
15# EMPTY-NEXT: Num Records: 0
16# EMPTY-NOT:  {{.}}
17
18--- !ELF
19FileHeader:
20  Class:   ELFCLASS64
21  Data:    ELFDATA2LSB
22  Type:    ET_REL
23  Machine: EM_X86_64
24Sections:
25  - Name:         [[NAME=.llvm_stackmaps]]
26    Type:         SHT_PROGBITS
27    ContentArray: [ [[VERSION=0x3]] ]
28    Size:         [[SIZE=16]]
29    ShSize:       [[SHSIZE=<none>]]
30    ShOffset:     [[SHOFFSET=<none>]]
31## An arbitrary second broken .llvm_stackmaps section.
32  - Name:         .llvm_stackmaps (1)
33    Type:         SHT_PROGBITS
34    ContentArray: [ 0xFF ]
35    Size:         0x1
36
37## Hide the first stack map section to allow dumpers to locate and validate the second one, which is broken.
38## Check we are able to find it and report a warning properly.
39
40# RUN: yaml2obj %s -DNAME=.foo -o %t.second
41# RUN: llvm-readobj %t.second --stackmap 2>&1 | \
42# RUN:   FileCheck %s --check-prefix=SECOND -DFILE=%t.second --implicit-check-not=warning:
43# RUN: llvm-readelf %t.second --stackmap 2>&1 | \
44# RUN:   FileCheck %s --check-prefix=SECOND -DFILE=%t.second --implicit-check-not=warning:
45
46# SECOND: warning: '[[FILE]]': unable to read the stack map from SHT_PROGBITS section with index 2: the stack map section size (1) is less than the minimum possible size of its header (16)
47
48## Check we report a warning when the size of the .llvm_stackmaps section is less
49## than the minimum possible size of its header.
50
51# RUN: yaml2obj %s -DSHSIZE=0 -o %t.trunc0
52# RUN: llvm-readobj %t.trunc0 --stackmap 2>&1 | FileCheck %s -DFILE=%t.trunc0 --check-prefix=TRUNC -DVAL=0
53# RUN: llvm-readelf %t.trunc0 --stackmap 2>&1 | FileCheck %s -DFILE=%t.trunc0 --check-prefix=TRUNC -DVAL=0
54
55# RUN: yaml2obj %s -DSIZE=1 -o %t.trunc1
56# RUN: llvm-readobj %t.trunc1 --stackmap 2>&1 | FileCheck %s -DFILE=%t.trunc1 --check-prefix=TRUNC -DVAL=1
57# RUN: llvm-readelf %t.trunc1 --stackmap 2>&1 | FileCheck %s -DFILE=%t.trunc1 --check-prefix=TRUNC -DVAL=1
58
59# RUN: yaml2obj %s -DSIZE=15 -o %t.trunc15
60# RUN: llvm-readobj %t.trunc15 --stackmap 2>&1 | FileCheck %s -DFILE=%t.trunc15 --check-prefix=TRUNC -DVAL=15
61# RUN: llvm-readelf %t.trunc15 --stackmap 2>&1 | FileCheck %s -DFILE=%t.trunc15 --check-prefix=TRUNC -DVAL=15
62
63# TRUNC: warning: '[[FILE]]': unable to read the stack map from SHT_PROGBITS section with index 1: the stack map section size ([[VAL]]) is less than the minimum possible size of its header (16)
64
65## Check that we report a warning when the version of the stack map section is not supported.
66
67# RUN: yaml2obj %s -DVERSION=2 -o %t.ver2
68# RUN: llvm-readobj %t.ver2 --stackmap 2>&1 | \
69# RUN:   FileCheck %s --check-prefix=VERSION -DFILE=%t.ver2 --implicit-check-not=warning: -DVERSION=2
70# RUN: llvm-readelf %t.ver2 --stackmap 2>&1 | \
71# RUN:   FileCheck %s --check-prefix=VERSION -DFILE=%t.ver2 --implicit-check-not=warning: -DVERSION=2
72
73# RUN: yaml2obj %s -DVERSION=4 -o %t.ver4
74# RUN: llvm-readobj %t.ver4 --stackmap 2>&1 | \
75# RUN:   FileCheck %s --check-prefix=VERSION -DFILE=%t.ver4 --implicit-check-not=warning: -DVERSION=4
76# RUN: llvm-readelf %t.ver4 --stackmap 2>&1 | \
77# RUN:   FileCheck %s --check-prefix=VERSION -DFILE=%t.ver4 --implicit-check-not=warning: -DVERSION=4
78
79# VERSION: warning: '[[FILE]]': unable to read the stack map from SHT_PROGBITS section with index 1: the version ([[VERSION]]) of the stack map section is unsupported, the supported version is 3
80
81## Check that we report a warning when we are unable to read the content of the stack map section.
82# RUN: yaml2obj %s -DSHOFFSET=0xffff -o %t.offset
83# RUN: llvm-readobj %t.offset --stackmap 2>&1 | FileCheck %s -DFILE=%t.offset --check-prefix=OFFSET
84# RUN: llvm-readelf %t.offset --stackmap 2>&1 | FileCheck %s -DFILE=%t.offset --check-prefix=OFFSET
85
86# OFFSET: warning: '[[FILE]]': unable to read the stack map from SHT_PROGBITS section with index 1: section [index 1] has a sh_offset (0xffff) + sh_size (0x10) that is greater than the file size (0x1b8)
87