## Check how yaml2obj produces .stack_sizes sections.
## Test the following cases when the .stack_sizes Content field is specified:
## 1) We can produce a .stack_sizes section from a description with
## a valid section content.
## 2) We can produce an incorrect .stack_sizes section from a description with
## a broken (truncated) section content.
## 3) We can produce an empty .stack_sizes section from a description with
## empty section content.
# RUN: yaml2obj --docnum=1 %s -o %t1
# RUN: llvm-readobj --sections --section-data %t1 | FileCheck %s
## Case 1: valid content.
# CHECK: Section {
# CHECK: Index: 1
# CHECK-NEXT: Name: .stack_sizes (1)
# CHECK-NEXT: Type: SHT_PROGBITS (0x1)
# CHECK-NEXT: Flags [ (0x0)
# CHECK-NEXT: ]
# CHECK-NEXT: Address: 0x0
# CHECK-NEXT: Offset: 0x40
# CHECK-NEXT: Size: 9
# CHECK-NEXT: Link: 0
# CHECK-NEXT: Info: 0
# CHECK-NEXT: AddressAlignment: 0
# CHECK-NEXT: EntrySize: 0
# CHECK-NEXT: SectionData (
# CHECK-NEXT: 0000: 10000000 00000000 20
# CHECK-NEXT: )
# CHECK-NEXT: }
## Case 2: truncated content.
# CHECK: Name: .stack_sizes
# CHECK: Size:
# CHECK-SAME: 8
# CHECK: SectionData (
# CHECK-NEXT: 0000: 10000000 00000000
## Case 3: empty content.
# CHECK: Name: .stack_sizes
# CHECK: Size:
# CHECK-SAME: 0
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_EXEC
Sections:
## Valid.
- Name: '.stack_sizes (1)'
Type: SHT_PROGBITS
Content: "100000000000000020"
## Truncated.
- Name: '.stack_sizes (2)'
Type: SHT_PROGBITS
Content: "1000000000000000"
## Empty.
- Name: '.stack_sizes (3)'
Type: SHT_PROGBITS
Content: ""
## Check we can describe .stack_sizes section using <address, size> pairs.
# RUN: yaml2obj --docnum=2 -D BITS=64 -D ENCODE=LSB %s -o %t2.le64
# RUN: llvm-readobj --sections --section-data %t2.le64 | FileCheck %s --check-prefix=ENTRIES-LE64-BOTH
# RUN: yaml2obj --docnum=2 -D BITS=64 -D ENCODE=MSB %s -o %t2.be64
# RUN: llvm-readobj --sections --section-data %t2.be64 | FileCheck %s --check-prefix=ENTRIES-BE64-BOTH
# RUN: yaml2obj --docnum=2 -D BITS=32 -D ENCODE=LSB %s -o %t2.le32
# RUN: llvm-readobj --sections --section-data %t2.le32 | FileCheck %s --check-prefix=ENTRIES-LE32-BOTH
# RUN: yaml2obj --docnum=2 -D BITS=32 -D ENCODE=MSB %s -o %t2.be32
# RUN: llvm-readobj --sections --section-data %t2.be32 | FileCheck %s --check-prefix=ENTRIES-BE32-BOTH
# ENTRIES-LE64-BOTH: Name: .stack_sizes
# ENTRIES-LE64-BOTH: SectionData (
# ENTRIES-LE64-BOTH-NEXT: 0000: 10000000 00000000 20300000 00000000 |
# ENTRIES-LE64-BOTH-NEXT: 0010: 0040 |
# ENTRIES-BE64-BOTH: Name: .stack_sizes
# ENTRIES-BE64-BOTH: SectionData (
# ENTRIES-BE64-BOTH-NEXT: 0000: 00000000 00000010 20000000 00000000 |
# ENTRIES-BE64-BOTH-NEXT: 0010: 3040
# ENTRIES-LE32-BOTH: Name: .stack_sizes
# ENTRIES-LE32-BOTH: SectionData (
# ENTRIES-LE32-BOTH-NEXT: 0000: 10000000 20300000 0040 |
# ENTRIES-BE32-BOTH: Name: .stack_sizes
# ENTRIES-BE32-BOTH: SectionData (
# ENTRIES-BE32-BOTH-NEXT: 0000: 00000010 20000000 3040 |
--- !ELF
FileHeader:
Class: ELFCLASS[[BITS]]
Data: ELFDATA2[[ENCODE]]
Type: ET_EXEC
Sections:
- Name: .stack_sizes
Type: SHT_PROGBITS
Entries:
- Address: 0x10
Size: 0x20
- Address: 0x30
Size: 0x40
## Check we can omit the "Address" tag. In this case the address will be zero.
# RUN: yaml2obj --docnum=3 %s -o %t3
# RUN: llvm-readobj --sections --section-data %t3 | FileCheck %s --check-prefix=ENTRIES-NOADDR
# ENTRIES-NOADDR: Name: .stack_sizes
# ENTRIES-NOADDR: SectionData (
# ENTRIES-NOADDR-NEXT: 0000: 00000000 00000000 10000000 00000000 |
# ENTRIES-NOADDR-NEXT: 0010: 0020 |
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_EXEC
Sections:
- Name: .stack_sizes
Type: SHT_PROGBITS
Entries:
- Size: 0x10
- Size: 0x20
## Check that "Size" tag is mandatory when we describe .stack_sizes using "Entries".
# RUN: not yaml2obj --docnum=4 %s 2>&1 | FileCheck %s --check-prefix=ENTRIES-NOSIZE
# ENTRIES-NOSIZE: error: missing required key 'Size'
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_EXEC
Sections:
- Name: .stack_sizes
Type: SHT_PROGBITS
Entries:
- Address: 0x10
## Check we can't use both "Content" and "Entries" tags at the same time.
# RUN: not yaml2obj --docnum=5 %s 2>&1 | FileCheck %s --check-prefix=ENTRIES-AND-CONTENT
# ENTRIES-AND-CONTENT: error: "Entries" cannot be used with "Content" or "Size"
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_EXEC
Sections:
- Name: .stack_sizes
Type: SHT_PROGBITS
Content: "00"
Entries:
- Address: 0x10
Size: 0x20
## Check we emit an empty section if neither "Content", "Size" nor "Entries" were set.
# RUN: yaml2obj --docnum=6 %s -o %t6
# RUN: llvm-readelf --sections %t6 | FileCheck %s --check-prefix=NO-TAGS
# NO-TAGS: [Nr] Name Type Address Off Size
# NO-TAGS: [ 1] .stack_sizes PROGBITS 0000000000000000 000040 000000
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_EXEC
Sections:
- Name: .stack_sizes
Type: SHT_PROGBITS
## Check we can't use both "Size" and "Entries" tags at the same time.
# RUN: not yaml2obj --docnum=7 %s 2>&1 | FileCheck %s --check-prefix=ENTRIES-AND-SIZE
# ENTRIES-AND-SIZE: error: "Entries" cannot be used with "Content" or "Size"
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_EXEC
Sections:
- Name: .stack_sizes
Type: SHT_PROGBITS
Size: 0x1
Entries:
- Address: 0x10
Size: 0x20
## Check we can use only "Size" to create .stack_sizes section.
# RUN: yaml2obj --docnum=8 %s -o %t8
# RUN: llvm-readobj --sections --section-data %t8 | FileCheck %s --check-prefix=SIZE
# SIZE: Name: .stack_sizes
# SIZE: Size:
# SIZE-SAME: 17
# SIZE: SectionData (
# SIZE-NEXT: 0000: 00000000 00000000 00000000 00000000 |
# SIZE-NEXT: 0010: 00 |
# SIZE-NEXT: )
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_EXEC
Sections:
- Name: .stack_sizes
Type: SHT_PROGBITS
Size: 0x11
## Check we can use "Size" and "Content" together to create .stack_sizes section.
# RUN: yaml2obj --docnum=9 %s -o %t9
# RUN: llvm-readobj --sections --section-data %t9 | FileCheck %s --check-prefix=SIZE-CONTENT
# SIZE-CONTENT: Name: .stack_sizes
# SIZE-CONTENT: Size:
# SIZE-CONTENT-SAME: 5
# SIZE-CONTENT: SectionData (
# SIZE-CONTENT-NEXT: 0000: 11223300 00 |
# SIZE-CONTENT-NEXT: )
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_EXEC
Sections:
- Name: .stack_sizes
Type: SHT_PROGBITS
Size: 0x5
Content: "112233"
# RUN: not yaml2obj --docnum=10 %s 2>&1 | FileCheck %s --check-prefix=SIZE-CONTENT-ERR
# SIZE-CONTENT-ERR: error: Section size must be greater than or equal to the content size
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_EXEC
Sections:
- Name: .stack_sizes
Type: SHT_PROGBITS
Size: 0x1
Content: "1122"
## Check we can describe multiple .stack_sizes sections using unique suffixes.
# RUN: yaml2obj --docnum=11 %s -o %t11
# RUN: llvm-readobj --sections --section-data %t11 | FileCheck %s --check-prefix=UNIQUE
# UNIQUE: Name: .stack_sizes
# UNIQUE: SectionData (
# UNIQUE-NEXT: 0000: 10000000 00000000 20 |
# UNIQUE: Name: .stack_sizes
# UNIQUE: SectionData (
# UNIQUE-NEXT: 0000: 30000000 00000000 40 |
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_EXEC
Sections:
- Name: '.stack_sizes (1)'
Type: SHT_PROGBITS
Entries:
- Address: 0x10
Size: 0x20
- Name: '.stack_sizes (2)'
Type: SHT_PROGBITS
Entries:
- Address: 0x30
Size: 0x40