## Check how yaml2obj produces .llvm_bb_addr_map sections.

# RUN: yaml2obj --docnum=1 %s -o %t1
# RUN: llvm-readobj --sections --section-data %t1 | FileCheck %s

## Case 1: Specify content.
# CHECK:      Section {
# CHECK:        Index: 1
# CHECK-NEXT:   Name: .llvm_bb_addr_map (1)
# CHECK-NEXT:   Type: SHT_LLVM_BB_ADDR_MAP (0x6FFF4C0A)
# CHECK-NEXT:   Flags [ (0x0)
# CHECK-NEXT:   ]
# CHECK-NEXT:   Address: 0x0
# CHECK-NEXT:   Offset: 0x40
# CHECK-NEXT:   Size: 13
# CHECK-NEXT:   Link: 0
# CHECK-NEXT:   Info: 0
# CHECK-NEXT:   AddressAlignment: 0
# CHECK-NEXT:   EntrySize: 0
# CHECK-NEXT:   SectionData (
# CHECK-NEXT:     0000: 00000000 00000000 01010203 04
# CHECK-NEXT:   )
# CHECK-NEXT: }

## Case 2: Empty.
# CHECK:        Name: .llvm_bb_addr_map (1)
# CHECK:        Size:
# CHECK-SAME:   {{^ 0$}}

## Case 3: Specify Size only.
# CHECK:        Name: .llvm_bb_addr_map (1)
# CHECK:        SectionData (
# CHECK-NEXT:     0000: 00000000 00000000
# CHECK-NEXT:   )

# Case 4: Specify Entries.
# CHECK:        Name: .llvm_bb_addr_map (1)
# CHECK:        SectionData (
# CHECK-NEXT:     0000: 02002000 00000000 0000010B 010203
# CHECK-NEXT:   )

# Case 5: Specify Entries and omit the Address field.
# CHECK:        Name: .llvm_bb_addr_map (1)
# CHECK:        Address:
# CHECK-SAME:   {{^ 0x0$}}
# CHECK:        SectionData (
# CHECK-NEXT:     0000: 02000000 00000000 0000010C 010203
# CHECK-NEXT:   )

# Case 6: Override the NumBlocks field.
# CHECK:        Name: .llvm_bb_addr_map (1)
# CHECK:        SectionData (
# CHECK-NEXT:     0000: 02002000 00000000 0000020D 010203
# CHECK-NEXT:   )

# Case 7: Specify empty BBRanges.
# CHECK:        Name: .llvm_bb_addr_map (1)
# CHECK:        SectionData (
# CHECK-NEXT:     0000: 020000
# CHECK-NEXT:   )

# Case 8: Specify empty BBRanges with multi-bb-range.
# CHECK:        Name: .llvm_bb_addr_map (1)
# CHECK:        SectionData (
# CHECK-NEXT:     0000: 020800
# CHECK-NEXT:   )




--- !ELF
FileHeader:
  Class: ELFCLASS64
  Data:  ELFDATA2LSB
  Type:  ET_EXEC
Sections:

## Test the following cases:

## 1) We can produce an .llvm_bb_addr_map section from a description with section
##    content.
##  Specify Content.
  - Name:    '.llvm_bb_addr_map (1)'
    Type:    SHT_LLVM_BB_ADDR_MAP
    Content: "00000000000000000101020304"

## 2) We can produce an empty .llvm_bb_addr_map section from a description
##    with empty section content.
  - Name: '.llvm_bb_addr_map (2)'
    Type: SHT_LLVM_BB_ADDR_MAP

## 3) We can produce a zero .llvm_bb_addr_map section of a specific size when
##    we specify the size only.
  - Name: '.llvm_bb_addr_map (3)'
    Type: SHT_LLVM_BB_ADDR_MAP
    Size: 8

## 4) We can produce an .llvm_bb_addr_map section from a description with
##    Entries.
  - Name: '.llvm_bb_addr_map (4)'
    Type: SHT_LLVM_BB_ADDR_MAP
    Entries:
      - Version: 2
        BBRanges:
          - BaseAddress: 0x0000000000000020
            BBEntries:
              - ID:            11
                AddressOffset: 0x00000001
                Size:          0x00000002
                Metadata:      0x00000003

## 5) When specifying the description with Entries, the 'Address' field will be
##    zero when omitted.
  - Name: '.llvm_bb_addr_map (5)'
    Type: SHT_LLVM_BB_ADDR_MAP
    Entries:
      - Version: 2
        BBRanges:
          - BBEntries:
            - ID:            12
              AddressOffset: 0x00000001
              Size:          0x00000002
              Metadata:      0x00000003

## 6) We can override the NumBlocks field with a value different from the
##    actual number of BB Entries.
  - Name: '.llvm_bb_addr_map (6)'
    Type: SHT_LLVM_BB_ADDR_MAP
    Entries:
      - Version:   2
        BBRanges:
          - BaseAddress:   0x0000000000000020
            NumBlocks: 2
            BBEntries:
             - ID:            13
               AddressOffset: 0x00000001
               Size:          0x00000002
               Metadata:      0x00000003

## 7) We can produce a SHT_LLVM_BB_ADDR_MAP section from a description
##    with one entry with empty BBRanges.
  - Name: '.llvm_bb_addr_map (7)'
    Type: SHT_LLVM_BB_ADDR_MAP
    Entries:
      - Version: 2
        BBRanges: []

## 8) We can produce a SHT_LLVM_BB_ADDR_MAP section from a multi-bb-range
##    description with one entry with empty BBRanges.
  - Name: '.llvm_bb_addr_map (8)'
    Type: SHT_LLVM_BB_ADDR_MAP
    Entries:
      - Version: 2
        Feature: 0x8
        BBRanges: []

## Check we can't use Entries at the same time as either Content or Size.
# RUN: not yaml2obj --docnum=2 -DCONTENT="00" %s 2>&1 | FileCheck %s --check-prefix=INVALID
# RUN: not yaml2obj --docnum=2 -DSIZE="0" %s 2>&1 | FileCheck %s --check-prefix=INVALID

# INVALID: error: "Entries" cannot be used with "Content" or "Size"

--- !ELF
FileHeader:
  Class: ELFCLASS64
  Data:  ELFDATA2LSB
  Type:  ET_EXEC
Sections:
##  Specify Content and Size
  - Name:    '.llvm_bb_addr_map'
    Type:    SHT_LLVM_BB_ADDR_MAP
    Entries: []
    Content: [[CONTENT=<none>]]
    Size:    [[SIZE=<none>]]

## Check that yaml2obj generates a warning when we use unsupported versions.
# RUN: yaml2obj --docnum=3  %s 2>&1 | FileCheck %s --check-prefix=INVALID-VERSION
# INVALID-VERSION: warning: unsupported SHT_LLVM_BB_ADDR_MAP version: 3; encoding using the most recent version

--- !ELF
FileHeader:
  Class: ELFCLASS64
  Data:  ELFDATA2LSB
  Type:  ET_EXEC
Sections:
  - Name: '.llvm_bb_addr_map'
    Type: SHT_LLVM_BB_ADDR_MAP
    Entries:
##  Specify unsupported version
      - Version: 3
