Compiler projects using llvm
## Check how obj2yaml dumps the SHT_ARM_EXIDX section.

## For a valid section, obj2yaml emits the "Entries" key.
## This checks that we respect data endianness and recognize the
## EXIDX_CANTUNWIND (0x1) special value properly.

# RUN: yaml2obj --docnum=1 -DENCODE=LSB %s -o %t.le.so
# RUN: obj2yaml %t.le.so | FileCheck %s --check-prefix=LE
# RUN: yaml2obj --docnum=1 -DENCODE=MSB %s -o %t.be.so
# RUN: obj2yaml %t.be.so | FileCheck %s --check-prefix=BE

# LE:      - Name: .ARM.exidx
# LE-NEXT:   Type: SHT_ARM_EXIDX
# LE-NEXT:   Entries:
# LE-NEXT:     - Offset: 0xDDCCBBAA
# LE-NEXT:       Value:  0x1000000
# LE-NEXT:     - Offset: 0x9988FFEE
# LE-NEXT:       Value:  EXIDX_CANTUNWIND
# LE-NEXT: ...

# BE:      - Name: .ARM.exidx
# BE-NEXT:   Type: SHT_ARM_EXIDX
# BE-NEXT:   Entries:
# BE-NEXT:     - Offset: 0xAABBCCDD
# BE-NEXT:       Value:  EXIDX_CANTUNWIND
# BE-NEXT:     - Offset: 0xEEFF8899
# BE-NEXT:       Value:  0x1000000
# BE-NEXT: ...

--- !ELF
FileHeader:
  Class:   ELFCLASS64
  Data:    ELFDATA2[[ENCODE=LSB]]
  Type:    ET_DYN
  Machine: EM_ARM
Sections:
  - Name:    .ARM.exidx
    Type:    SHT_ARM_EXIDX
## 4 words: <arbitrary>, EXIDX_CANTUNWIND in big-endian,
##          <arbitrary> and EXIDX_CANTUNWIND in little-endian.
    Content: "AABBCCDD00000001EEFF889901000000"
    Size:    [[SIZE=<none>]]

## Check that we dump the content of a truncated SHT_ARM_EXIDX section
## using the "Content" key.
# RUN: yaml2obj --docnum=1 -DSIZE=17 %s -o %t.invalid-size.so
# RUN: obj2yaml %t.invalid-size.so | FileCheck %s --check-prefix=INVALID-SIZE

# INVALID-SIZE:      - Name:    .ARM.exidx
# INVALID-SIZE-NEXT:   Type:    SHT_ARM_EXIDX
# INVALID-SIZE-NEXT:   Content: AABBCCDD00000001EEFF88990100000000
# INVALID-SIZE-NEXT: ...

## Check how we dump an empty SHT_ARM_EXIDX section.
# RUN: yaml2obj --docnum=2 %s -o %t.empty.so
# RUN: obj2yaml %t.empty.so | FileCheck %s --check-prefix=EMPTY

# EMPTY:      - Name: .ARM.exidx
# EMPTY-NEXT:     Type:    SHT_ARM_EXIDX
# EMPTY-NEXT:     Entries: []
# EMPTY-NEXT: ...

--- !ELF
FileHeader:
  Class:   ELFCLASS64
  Data:    ELFDATA2LSB
  Type:    ET_DYN
  Machine: EM_ARM
Sections:
  - Name: .ARM.exidx
    Type: SHT_ARM_EXIDX

## Check how we dump the SHT_ARM_EXIDX (0x70000001) section when
## the machine type is not EM_ARM. It is dumped as a regular
## section of an unknown type.

# RUN: yaml2obj --docnum=3 %s -o %t.not-arm.so
# RUN: obj2yaml %t.not-arm.so | FileCheck %s --check-prefix=NOT-ARM

# RUN: yaml2obj --docnum=3 -DMACHINE=EM_ARM %s -o %t.arm.so
# RUN: obj2yaml %t.arm.so | FileCheck %s --check-prefix=ARM

# NOT-ARM:      Sections:
# NOT-ARM-NEXT:   - Name:    .ARM.exidx
# NOT-ARM-NEXT:     Type:    0x70000001
# NOT-ARM-NEXT:     Content: AABBCCDD11223344
# NOT-ARM-NEXT: ...

# ARM:      - Name: .ARM.exidx
# ARM-NEXT:   Type: SHT_ARM_EXIDX
# ARM-NEXT:   Entries:
# ARM-NEXT:     - Offset: 0xDDCCBBAA
# ARM-NEXT:       Value:  0x44332211
# ARM-NEXT: ...

--- !ELF
FileHeader:
  Class:   ELFCLASS64
  Data:    ELFDATA2LSB
  Type:    ET_DYN
  Machine: [[MACHINE=<none>]]
Sections:
  - Name:    .ARM.exidx
    Type:    SHT_PROGBITS
    ShType:  0x70000001 ## SHT_ARM_EXIDX
## An arbitrary valid content.
    Content: "AABBCCDD11223344"