Recently, we have been looking at some optimizations targeting individual calls. In particular, we plan to extend the address mapping technique to map to individual callsites. For example, in this piece of code for a basic blocks: ``` <BB>: 1200: lea 0x1(%rcx), %rdx 1204: callq foo 1209: cmpq 0x10, %rdx 120d: ja L1 ``` We want to emit 0x9 as the call site offset for `callq foo` (the offset from the block entry to right after the call), so that we know if a sampled address is before the call or after. This PR implements the decode/encode/emit capability. The Codegen change will be implemented in a later PR.
199 lines
6.8 KiB
Plaintext
199 lines
6.8 KiB
Plaintext
## This test checks how we handle the --bb-addr-map option.
|
|
|
|
## Check 64-bit:
|
|
# RUN: yaml2obj --docnum=1 %s -DBITS=64 -DADDR=0x999999999 -o %t1.x64.o
|
|
# RUN: llvm-readobj %t1.x64.o --bb-addr-map 2>&1 | FileCheck %s -DADDR=0x999999999 -DFILE=%t1.x64.o --check-prefix=CHECK
|
|
# RUN: llvm-readelf %t1.x64.o --bb-addr-map | FileCheck %s --check-prefix=GNU
|
|
|
|
## Check 64-bit:
|
|
# RUN: yaml2obj --docnum=1 %s -DBITS=64 -DADDR=0x999999999 -o %t1.v1.x64.o
|
|
# RUN: llvm-readobj %t1.v1.x64.o --bb-addr-map 2>&1 | FileCheck %s -DADDR=0x999999999 -DFILE=%t1.v1.x64.o --check-prefix=CHECK
|
|
|
|
## Check 32-bit:
|
|
# RUN: yaml2obj --docnum=1 %s -DBITS=32 -o %t1.x32.o
|
|
# RUN: llvm-readobj %t1.x32.o --bb-addr-map 2>&1 | FileCheck -DADDR=0x11111 %s -DFILE=%t1.x32.o --check-prefix=CHECK
|
|
# RUN: llvm-readelf %t1.x32.o --bb-addr-map | FileCheck %s --check-prefix=GNU
|
|
|
|
## Check that a malformed section can be handled.
|
|
# RUN: yaml2obj --docnum=1 %s -DBITS=32 -DSIZE=7 -o %t2.o
|
|
# RUN: llvm-readobj %t2.o --bb-addr-map 2>&1 | FileCheck %s -DOFFSET=0x00000007 -DFILE=%t2.o --check-prefix=TRUNCATED
|
|
|
|
## Check that invalid metadata can be handled.
|
|
# RUN: yaml2obj --docnum=1 %s -DBITS=32 -DMETADATA=0xF000002 -o %t3.o
|
|
# RUN: llvm-readobj %t3.o --bb-addr-map 2>&1 | FileCheck %s -DFILE=%t3.o --check-prefix=INVALIDMD
|
|
|
|
# CHECK: BBAddrMap [
|
|
# CHECK-NEXT: Function {
|
|
# CHECK-NEXT: At: [[ADDR]]
|
|
# CHECK-NEXT: warning: '[[FILE]]': could not identify function symbol for address ([[ADDR]]) in SHT_LLVM_BB_ADDR_MAP section with index 3
|
|
# CHECK-NEXT: Name: <?>
|
|
# CHECK-NEXT: BB Ranges [
|
|
# CHECK-NEXT: {
|
|
# CHECK-NEXT: Base Address: [[ADDR]]
|
|
# CHECK-NEXT: BB Entries [
|
|
# CHECK-NEXT: {
|
|
# CHECK-NEXT: ID: 0
|
|
# CHECK-NEXT: Offset: 0x0
|
|
# CHECK-NEXT: Size: 0x1
|
|
# CHECK-NEXT: HasReturn: No
|
|
# CHECK-NEXT: HasTailCall: Yes
|
|
# CHECK-NEXT: IsEHPad: No
|
|
# CHECK-NEXT: CanFallThrough: No
|
|
# CHECK-NEXT: HasIndirectBranch: No
|
|
# CHECK-NEXT: }
|
|
# CHECK-NEXT: ]
|
|
# CHECK-NEXT: }
|
|
# CHECK-NEXT: {
|
|
# CHECK-NEXT: Base Address: 0x44444
|
|
# CHECK-NEXT: BB Entries [
|
|
# CHECK-NEXT: {
|
|
# CHECK-NEXT: ID: 2
|
|
# CHECK-NEXT: Offset: 0x3
|
|
# CHECK-NEXT: Callsite Offsets: [1, 3]
|
|
# CHECK-NEXT: Size: 0x7
|
|
# CHECK-NEXT: HasReturn: Yes
|
|
# CHECK-NEXT: HasTailCall: No
|
|
# CHECK-NEXT: IsEHPad: Yes
|
|
# CHECK-NEXT: CanFallThrough: No
|
|
# CHECK-NEXT: HasIndirectBranch: Yes
|
|
# CHECK-NEXT: }
|
|
# CHECK-NEXT: ]
|
|
# CHECK-NEXT: }
|
|
# CHECK-NEXT: ]
|
|
# CHECK-NEXT: }
|
|
# CHECK-NEXT: Function {
|
|
# CHECK-NEXT: At: 0x22222
|
|
# CHECK-NEXT: Name: foo
|
|
# CHECK-NEXT: BB Ranges [
|
|
# CHECK-NEXT: {
|
|
# CHECK-NEXT: Base Address: 0x22222
|
|
# CHECK-NEXT: BB Entries [
|
|
# CHECK-NEXT: {
|
|
# CHECK-NEXT: ID: 4
|
|
# CHECK-NEXT: Offset: 0x6
|
|
# CHECK-NEXT: Size: 0x7
|
|
# CHECK-NEXT: HasReturn: No
|
|
# CHECK-NEXT: HasTailCall: No
|
|
# CHECK-NEXT: IsEHPad: No
|
|
# CHECK-NEXT: CanFallThrough: Yes
|
|
# CHECK-NEXT: HasIndirectBranch: No
|
|
# CHECK-NEXT: }
|
|
# CHECK-NEXT: ]
|
|
# CHECK-NEXT: }
|
|
# CHECK-NEXT: ]
|
|
# CHECK-NEXT: }
|
|
# CHECK-NEXT: ]
|
|
|
|
# GNU: GNUStyle::printBBAddrMaps not implemented
|
|
|
|
# TRUNCATED: BBAddrMap [
|
|
# 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
|
|
# TRUNCATED-NEXT: ]
|
|
## Check that the other valid section is properly dumped.
|
|
# TRUNCATED-NEXT: BBAddrMap [
|
|
# TRUNCATED-NEXT: Function {
|
|
# TRUNCATED-NEXT: At: 0x33333
|
|
# TRUNCATED-NEXT: Name: bar
|
|
# TRUNCATED-NEXT: BB Ranges [
|
|
# TRUNCATED-NEXT: {
|
|
# TRUNCATED-NEXT: Base Address: 0x33333
|
|
# TRUNCATED-NEXT: BB Entries [
|
|
# TRUNCATED-NEXT: {
|
|
# TRUNCATED-NEXT: ID: 6
|
|
# TRUNCATED-NEXT: Offset: 0x9
|
|
# TRUNCATED-NEXT: Size: 0xA
|
|
# TRUNCATED-NEXT: HasReturn: Yes
|
|
# TRUNCATED-NEXT: HasTailCall: Yes
|
|
# TRUNCATED-NEXT: IsEHPad: No
|
|
# TRUNCATED-NEXT: CanFallThrough: Yes
|
|
# TRUNCATED-NEXT: HasIndirectBranch: Yes
|
|
# TRUNCATED-NEXT: }
|
|
# TRUNCATED-NEXT: {
|
|
# TRUNCATED-NEXT: ID: 7
|
|
# TRUNCATED-NEXT: Offset: 0x1F
|
|
# TRUNCATED-NEXT: Size: 0xD
|
|
# TRUNCATED-NEXT: HasReturn: No
|
|
# TRUNCATED-NEXT: HasTailCall: Yes
|
|
# TRUNCATED-NEXT: IsEHPad: Yes
|
|
# TRUNCATED-NEXT: CanFallThrough: Yes
|
|
# TRUNCATED-NEXT: HasIndirectBranch: No
|
|
# TRUNCATED-NEXT: }
|
|
# TRUNCATED-NEXT: ]
|
|
# TRUNCATED-NEXT: }
|
|
# TRUNCATED-NEXT: ]
|
|
# TRUNCATED-NEXT: }
|
|
# TRUNCATED-NEXT: ]
|
|
|
|
# INVALIDMD: BBAddrMap [
|
|
# INVALIDMD-NEXT: warning: '[[FILE]]': unable to dump SHT_LLVM_BB_ADDR_MAP section with index 3: invalid encoding for BBEntry::Metadata: 0xf000002
|
|
|
|
--- !ELF
|
|
FileHeader:
|
|
Class: ELFCLASS[[BITS]]
|
|
Data: ELFDATA2LSB
|
|
Type: ET_EXEC
|
|
Sections:
|
|
- Name: .text
|
|
Type: SHT_PROGBITS
|
|
Flags: [SHF_ALLOC]
|
|
- Name: .text.bar
|
|
Type: SHT_PROGBITS
|
|
Flags: [SHF_ALLOC]
|
|
- Name: .llvm_bb_addr_map
|
|
Type: SHT_LLVM_BB_ADDR_MAP
|
|
ShSize: [[SIZE=<none>]]
|
|
Link: .text
|
|
Entries:
|
|
- Version: 3
|
|
Feature: 0x28
|
|
BBRanges:
|
|
- BaseAddress: [[ADDR=0x11111]]
|
|
BBEntries:
|
|
- ID: 0
|
|
AddressOffset: 0x0
|
|
Size: 0x1
|
|
Metadata: [[METADATA=0x2]]
|
|
- BaseAddress: 0x44444
|
|
BBEntries:
|
|
- ID: 2
|
|
AddressOffset: 0x3
|
|
Size: 0x4
|
|
Metadata: 0x15
|
|
CallsiteOffsets: [ 0x1 , 0x2 ]
|
|
- Version: 2
|
|
BBRanges:
|
|
- BaseAddress: 0x22222
|
|
BBEntries:
|
|
- ID: 4
|
|
AddressOffset: 0x6
|
|
Size: 0x7
|
|
Metadata: 0x8
|
|
- Name: dummy_section
|
|
Type: SHT_PROGBITS
|
|
Size: 16
|
|
- Name: '.llvm_bb_addr_map (1)'
|
|
Type: SHT_LLVM_BB_ADDR_MAP
|
|
Link: .text.bar
|
|
Entries:
|
|
- Version: 2
|
|
BBRanges:
|
|
- BaseAddress: 0x33333
|
|
BBEntries:
|
|
- ID: 6
|
|
AddressOffset: 0x9
|
|
Size: 0xa
|
|
Metadata: 0x1b
|
|
- ID: 7
|
|
AddressOffset: 0xc
|
|
Size: 0xd
|
|
Metadata: 0xe
|
|
Symbols:
|
|
- Name: foo
|
|
Section: .text
|
|
Type: STT_FUNC
|
|
Value: 0x22222
|
|
- Name: bar
|
|
Section: .text.bar
|
|
Type: STT_FUNC
|
|
Value: 0x33333
|