1## This test checks how we handle the --bb-addr-map option.
2
3## Check 64-bit:
4# RUN: yaml2obj --docnum=1 %s -DBITS=64 -DADDR=0x999999999 -o %t1.x64.o
5# RUN: llvm-readobj %t1.x64.o --bb-addr-map 2>&1 | FileCheck %s -DADDR=0x999999999 -DFILE=%t1.x64.o --check-prefix=CHECK
6# RUN: llvm-readelf %t1.x64.o --bb-addr-map | FileCheck %s --check-prefix=GNU
7
8## Check 64-bit:
9# RUN: yaml2obj --docnum=1 %s -DBITS=64 -DADDR=0x999999999 -o %t1.v1.x64.o
10# RUN: llvm-readobj %t1.v1.x64.o --bb-addr-map 2>&1 | FileCheck %s -DADDR=0x999999999 -DFILE=%t1.v1.x64.o --check-prefix=CHECK
11
12## Check 32-bit:
13# RUN: yaml2obj --docnum=1 %s -DBITS=32 -o %t1.x32.o
14# RUN: llvm-readobj %t1.x32.o --bb-addr-map 2>&1 | FileCheck -DADDR=0x11111 %s -DFILE=%t1.x32.o --check-prefix=CHECK
15# RUN: llvm-readelf %t1.x32.o --bb-addr-map | FileCheck %s --check-prefix=GNU
16
17## Check that a malformed section can be handled.
18# RUN: yaml2obj --docnum=1 %s -DBITS=32 -DSIZE=6 -o %t2.o
19# RUN: llvm-readobj %t2.o --bb-addr-map 2>&1 | FileCheck %s -DOFFSET=0x00000006 -DFILE=%t2.o --check-prefix=TRUNCATED
20
21# CHECK:      BBAddrMap [
22# CHECK-NEXT:   Function {
23# CHECK-NEXT:     At: [[ADDR]]
24# CHECK-NEXT: warning: '[[FILE]]': could not identify function symbol for address ([[ADDR]]) in SHT_LLVM_BB_ADDR_MAP section with index 3
25# CHECK-NEXT:     Name: <?>
26# CHECK-NEXT:     BB entries [
27# CHECK-NEXT:       {
28# CHECK-NEXT:         Offset: 0x0
29# CHECK-NEXT:         Size: 0x1
30# CHECK-NEXT:         HasReturn: No
31# CHECK-NEXT:         HasTailCall: Yes
32# CHECK-NEXT:         IsEHPad: No
33# CHECK-NEXT:         CanFallThrough: No
34# CHECK-NEXT:       }
35# CHECK-NEXT:       {
36# CHECK-NEXT:         Offset: 0x4
37# CHECK-NEXT:         Size: 0x4
38# CHECK-NEXT:         HasReturn: Yes
39# CHECK-NEXT:         HasTailCall: No
40# CHECK-NEXT:         IsEHPad: Yes
41# CHECK-NEXT:         CanFallThrough: No
42# CHECK-NEXT:       }
43# CHECK-NEXT:     ]
44# CHECK-NEXT:   }
45# CHECK-NEXT:   Function {
46# CHECK-NEXT:     At: 0x22222
47# CHECK-NEXT:     Name: foo
48# CHECK-NEXT:     BB entries [
49# CHECK-NEXT:       {
50# CHECK-NEXT:         Offset: 0x6
51# CHECK-NEXT:         Size: 0x7
52# CHECK-NEXT:         HasReturn: No
53# CHECK-NEXT:         HasTailCall: No
54# CHECK-NEXT:         IsEHPad: No
55# CHECK-NEXT:         CanFallThrough: Yes
56# CHECK-NEXT:       }
57# CHECK-NEXT:     ]
58# CHECK-NEXT:   }
59# CHECK-NEXT: ]
60
61# GNU: GNUStyle::printBBAddrMaps not implemented
62
63# TRUNCATED:      BBAddrMap [
64# TRUNCATED-NEXT:   warning: '[[FILE]]': unable to dump SHT_LLVM_BB_ADDR_MAP section with index 3: unable to decode LEB128 at offset [[OFFSET]]: malformed uleb128, extends past end
65# TRUNCATED-NEXT: ]
66## Check that the other valid section is properly dumped.
67# TRUNCATED-NEXT: BBAddrMap [
68# TRUNCATED-NEXT:   Function {
69# TRUNCATED-NEXT:     At: 0x33333
70# TRUNCATED-NEXT:     Name: bar
71# TRUNCATED-NEXT:     BB entries [
72# TRUNCATED-NEXT:       {
73# TRUNCATED-NEXT:         Offset: 0x9
74# TRUNCATED-NEXT:         Size: 0xA
75# TRUNCATED-NEXT:         HasReturn: Yes
76# TRUNCATED-NEXT:         HasTailCall: Yes
77# TRUNCATED-NEXT:         IsEHPad: No
78# TRUNCATED-NEXT:         CanFallThrough: Yes
79# TRUNCATED-NEXT:       }
80# TRUNCATED-NEXT:       {
81# TRUNCATED-NEXT:         Offset: 0x1F
82# TRUNCATED-NEXT:         Size: 0xD
83# TRUNCATED-NEXT:         HasReturn: No
84# TRUNCATED-NEXT:         HasTailCall: Yes
85# TRUNCATED-NEXT:         IsEHPad: Yes
86# TRUNCATED-NEXT:         CanFallThrough: Yes
87# TRUNCATED-NEXT:       }
88# TRUNCATED-NEXT:     ]
89# TRUNCATED-NEXT:   }
90# TRUNCATED-NEXT: ]
91
92--- !ELF
93FileHeader:
94  Class: ELFCLASS[[BITS]]
95  Data:  ELFDATA2LSB
96  Type:  ET_EXEC
97Sections:
98  - Name:   .text
99    Type:   SHT_PROGBITS
100    Flags:  [SHF_ALLOC]
101  - Name:   .text.bar
102    Type:   SHT_PROGBITS
103    Flags:  [SHF_ALLOC]
104  - Name:   .llvm_bb_addr_map
105    Type:   SHT_LLVM_BB_ADDR_MAP
106    ShSize: [[SIZE=<none>]]
107    Link:   .text
108    Entries:
109      - Version: 1
110        Address: [[ADDR=0x11111]]
111        BBEntries:
112          - AddressOffset: 0x0
113            Size:          0x1
114            Metadata:      0xF0000002
115          - AddressOffset: 0x3
116            Size:          0x4
117            Metadata:      0x5
118      - Version: 1
119        Address: 0x22222
120        BBEntries:
121          - AddressOffset: 0x6
122            Size:          0x7
123            Metadata:      0x8
124  - Name: dummy_section
125    Type: SHT_PROGBITS
126    Size: 16
127  - Name: '.llvm_bb_addr_map (1)'
128    Type: SHT_LLVM_BB_ADDR_MAP
129    Link: .text.bar
130    Entries:
131      - Version: 1
132        Address: 0x33333
133        BBEntries:
134          - AddressOffset: 0x9
135            Size:          0xa
136            Metadata:      0xb
137          - AddressOffset: 0xc
138            Size:          0xd
139            Metadata:      0xe
140Symbols:
141  - Name:    foo
142    Section: .text
143    Type:    STT_FUNC
144    Value:   0x22222
145  - Name:    bar
146    Section: .text.bar
147    Type:    STT_FUNC
148    Value:   0x33333
149
150## Check that using the SHT_LLVM_BB_ADDR_MAP_V0 section type generates the same
151## result as using the SHT_LLVM_BB_ADDR_MAP section type with Version=0.
152## The Version field is required even for SHT_LLVM_BB_ADDR_MAP_V0 but it
153## should not impact the result. This unideal behavior will be gone once
154## SHT_LLVM_BB_ADDR_MAP_V0 is deprecated.
155
156# RUN: yaml2obj --docnum=2 %s -DVERSION=255 -DSECTION_TYPE=SHT_LLVM_BB_ADDR_MAP_V0 -o %t2.type0
157# RUN: llvm-readobj %t2.type0 --bb-addr-map 2>&1 | FileCheck %s --check-prefix=V0
158
159# RUN: yaml2obj --docnum=2 %s -DVERSION=0 -DSECTION_TYPE=SHT_LLVM_BB_ADDR_MAP -o %t2.version0
160# RUN: llvm-readobj %t2.version0 --bb-addr-map 2>&1 | FileCheck %s --check-prefix=V0
161
162# V0:      BBAddrMap [
163# V0-NEXT:   Function {
164# V0-NEXT:     At:   0x11111
165# V0-NEXT:     Name: foo
166# V0-NEXT:     BB entries [
167# V0-NEXT:       {
168# V0-NEXT:         Offset: 0x1
169# V0-NEXT:         Size: 0x2
170# V0-NEXT:         HasReturn:
171# V0-NEXT:         HasTailCall:
172# V0-NEXT:         IsEHPad:
173# V0-NEXT:         CanFallThrough:
174# V0-NEXT:       }
175# V0-NEXT:       {
176# V0-NEXT:         Offset: 0x4
177# V0-NEXT:         Size: 0x5
178# V0-NEXT:         HasReturn:
179# V0-NEXT:         HasTailCall:
180# V0-NEXT:         IsEHPad:
181# V0-NEXT:         CanFallThrough:
182# V0-NEXT:       }
183# V0-NEXT:     ]
184# V0-NEXT:   }
185
186--- !ELF
187FileHeader:
188  Class: ELFCLASS64
189  Data:  ELFDATA2LSB
190  Type:  ET_EXEC
191Sections:
192  - Name:  .text.foo
193    Type:  SHT_PROGBITS
194    Flags: [SHF_ALLOC]
195  - Name:  .llvm_bb_addr_map
196    Type:  [[SECTION_TYPE]]
197    Link:  .text.foo
198    Entries:
199      - Version: [[VERSION]]
200        Address: 0x11111
201        BBEntries:
202          - AddressOffset: 0x1
203            Size:          0x2
204            Metadata:      0x3
205          - AddressOffset: 0x4
206            Size:          0x5
207            Metadata:      0x6
208Symbols:
209  - Name:    foo
210    Section: .text.foo
211    Type:    STT_FUNC
212    Value:   0x11111
213