## Test that in the presence of SHT_LLVM_BB_ADDR_MAP sections,
## --symbolize-operands can display <BB*> labels.

## Executable object file with separate SHT_LLVM_BB_ADDR_MAP sections for multiple text sections.
## RUN: yaml2obj --docnum=1 %s -o %t1
## RUN: llvm-objdump %t1 -d --symbolize-operands -M intel --no-show-raw-insn --no-leading-addr | \
## RUN:   FileCheck %s --match-full-lines --check-prefixes=INTEL
## RUN: llvm-objdump %t1 -d --symbolize-operands -M att --no-show-raw-insn --no-leading-addr | \
## RUN:   FileCheck %s --match-full-lines --check-prefixes=ATT

## Executable object file with a single SHT_LLVM_BB_ADDR_MAP for multiple text sections.
# RUN: yaml2obj --docnum=2 %s -o %t2
# RUN: llvm-objdump %t2 -d --symbolize-operands -M intel --no-show-raw-insn --no-leading-addr | \
# RUN:   FileCheck %s --match-full-lines --check-prefixes=INTEL
# RUN: llvm-objdump %t2 -d --symbolize-operands -M att --no-show-raw-insn --no-leading-addr | \
# RUN:   FileCheck %s --match-full-lines --check-prefixes=ATT

## Expect to find the branch and basic block labels and global variable name.
# ATT:      <foo>:
# ATT-NEXT: <BB3>:
# ATT-NEXT:   pushq %rax
# ATT-NEXT: <BB1>:
# ATT-NEXT:   cmpl  , %eax <symbol>
# ATT-NEXT:   nop
# ATT-NEXT: <BB2>:
# ATT-NEXT:   jge    <BB5>
# ATT-NEXT:   jmp    <BB1>
# ATT-NEXT: <BB4>:
# ATT-NEXT:   jge   <foo.cold>
# ATT-NEXT: <BB5>:
# ATT-NEXT:   retq
# ATT:      <bar>:
# ATT-NEXT: <BB0>:
# ATT-NEXT:   pushq  %rax
# ATT-NEXT:   movl   %edx, %eax
# ATT-NEXT:   je     <BB2>
# ATT-NEXT: <BB1>:
# ATT-NEXT:   xorl   %esi, %esi
# ATT-NEXT: <BB2>:
# ATT-NEXT:   callq  <bar>
# ATT-NEXT:   retq
# ATT:      <foo.cold>:
# ATT-NEXT: <BB6>:
# ATT-NEXT:   retq

# INTEL:      <foo>:
# INTEL-NEXT: <BB3>:
# INTEL-NEXT:   push rax
# INTEL-NEXT: <BB1>:
# INTEL-NEXT:   cmp  eax, dword ptr <symbol>
# INTEL-NEXT:   nop
# INTEL-NEXT: <BB2>:
# INTEL-NEXT:   jge   <BB5>
# INTEL-NEXT:   jmp   <BB1>
# INTEL-NEXT: <BB4>:
# INTEL-NEXT:   jge   <foo.cold>
# INTEL-NEXT: <BB5>:
# INTEL-NEXT:   ret
# INTEL:      <bar>:
# INTEL-NEXT: <BB0>:
# INTEL-NEXT:   push  rax
# INTEL-NEXT:   mov   eax, edx
# INTEL-NEXT:   je    <BB2>
# INTEL-NEXT: <BB1>:
# INTEL-NEXT:   xor   esi, esi
# INTEL-NEXT: <BB2>:
# INTEL-NEXT:   call  <bar>
# INTEL-NEXT:   ret
# INTEL:      <foo.cold>:
# INTEL-NEXT: <BB6>:
# INTEL-NEXT:   ret

## This object file contains a separate text section and SHT_LLVM_BB_ADDR_MAP
## section for each of the two functions foo and bar.
## This is used to test --symbolize-operands on reloctable and non-relocotable
## object files.
--- !ELF
FileHeader:
  Class:   ELFCLASS64
  Data:    ELFDATA2LSB
  Type:    ET_EXEC
  Machine: EM_X86_64
Sections:
  - Name:    .text.foo
    Type:    SHT_PROGBITS
    Address: 0x4000
    Flags:   [SHF_ALLOC, SHF_EXECINSTR]
    Content: '503b0505300000907d08ebf50f8dee1f0000c3'
  - Name:    .text.bar
    Type:    SHT_PROGBITS
    Address: 0x5000
    Flags:   [SHF_ALLOC, SHF_EXECINSTR]
    Content: '5089d0740231f6e8f4ffffffc3'
  - Name:    .text.split
    Type:    SHT_PROGBITS
    Address: 0x6000
    Flags:   [SHF_ALLOC, SHF_EXECINSTR]
    Content: 'c3'
  - Name:    .data
    Type:    SHT_PROGBITS
    Flags:   [SHF_ALLOC, SHF_WRITE]
    Address: 0x7000
  - Name:   .llvm_bb_addr_map.foo
    Type:   SHT_LLVM_BB_ADDR_MAP
    Link:   .text.foo
    Entries:
      - Version: 2
        Feature: 0x8
        BBRanges:
          - BaseAddress: 0x4000
            BBEntries:
             - ID:            3
               AddressOffset: 0x0
               Size:          0x1
               Metadata:      0x1
             - ID:            1
               AddressOffset: 0x0
               Size:          0x6
               Metadata:      0x0
             - ID:            2
               AddressOffset: 0x1
               Size:          0x4
               Metadata:      0x0
             - ID:            4
               AddressOffset: 0x0
               Size:          0x6
               Metadata:      0x1
             - ID:            5
               AddressOffset: 0x0
               Size:          0x1
               Metadata:      0x2
          - BaseAddress: 0x6000
            BBEntries:
             - ID:            6
               AddressOffset: 0x0
               Size:          0x1
               Metadata:      0x2
  - Name:   .llvm_bb_addr_map.bar
    Type:   SHT_LLVM_BB_ADDR_MAP
    Link:   .text.bar
    Entries:
      - Version: 1
        BBRanges:
         - BaseAddress: 0x5000
           BBEntries:
            - AddressOffset: 0x0
              Size:          0x1
              Metadata:      0x1
            - AddressOffset: 0x4
              Size:          0x2
              Metadata:      0x0
            - AddressOffset: 0x0
              Size:          0x6
              Metadata:      0x0

Symbols:
  - Name:    foo
    Section: .text.foo
    Value:   0x4000
  - Name:    foo.cold
    Section: .text.split
    Value:   0x6000
  - Name:    bar
    Section: .text.bar
    Value:   0x5000
  - Name:    symbol
    Section: .data
    Value:   0x700c

## This object file contains a single SHT_LLVM_BB_ADDR_MAP for two text
## sections .text.foo and .text.bar.
--- !ELF
FileHeader:
  Class:   ELFCLASS64
  Data:    ELFDATA2LSB
  Type:    ET_EXEC
  Machine: EM_X86_64
Sections:
  - Name:    .text.foo
    Type:    SHT_PROGBITS
    Address: 0x4000
    Flags:   [SHF_ALLOC, SHF_EXECINSTR]
    Content: '503b0505300000907d08ebf50f8dee1f0000c3'
  - Name:    .text.bar
    Type:    SHT_PROGBITS
    Address: 0x5000
    Flags:   [SHF_ALLOC, SHF_EXECINSTR]
    Content: '5089d0740231f6e8f4ffffffc3'
  - Name:    .text.split
    Type:    SHT_PROGBITS
    Address: 0x6000
    Flags:   [SHF_ALLOC, SHF_EXECINSTR]
    Content: 'c3'
  - Name:    .data
    Type:    SHT_PROGBITS
    Flags:   [SHF_ALLOC, SHF_WRITE]
    Address: 0x7000
  - Name:   .llvm_bb_addr_map.foo
    Type:   SHT_LLVM_BB_ADDR_MAP
    Link:   .text.foo
    Entries:
      - Version: 2
        Feature: 0x8
        BBRanges:
          - BaseAddress: 0x4000
            BBEntries:
             - ID:            3
               AddressOffset: 0x0
               Size:          0x1
               Metadata:      0x1
             - ID:            1
               AddressOffset: 0x0
               Size:          0x6
               Metadata:      0x0
             - ID:            2
               AddressOffset: 0x1
               Size:          0x4
               Metadata:      0x0
             - ID:            4
               AddressOffset: 0x0
               Size:          0x6
               Metadata:      0x1
             - ID:            5
               AddressOffset: 0x0
               Size:          0x1
               Metadata:      0x2
          - BaseAddress: 0x6000
            BBEntries:
             - ID:            6
               AddressOffset: 0x0
               Size:          0x1
               Metadata:      0x2
      - Version: 1
        BBRanges:
         - BaseAddress: 0x5000
           BBEntries:
            - AddressOffset: 0x0
              Size:          0x1
              Metadata:      0x1
            - AddressOffset: 0x4
              Size:          0x2
              Metadata:      0x0
            - AddressOffset: 0x0
              Size:          0x6
              Metadata:      0x0

Symbols:
  - Name:    foo
    Section: .text.foo
    Value:   0x4000
  - Name:    foo.cold
    Section: .text.split
    Value:   0x6000
  - Name:    bar
    Section: .text.bar
    Value:   0x5000
  - Name:    symbol
    Section: .data
    Value:   0x700c
