These directives define per-test lit substitutions. The concept was discussed at <https://discourse.llvm.org/t/iterating-lit-run-lines/62596/10>. For example, the following directives can be inserted into a test file to define `%{cflags}` and `%{fcflags}` substitutions with empty initial values, which serve as the parameters of another newly defined `%{check}` substitution: ``` // DEFINE: %{cflags} = // DEFINE: %{fcflags} = // DEFINE: %{check} = %clang_cc1 %{cflags} -emit-llvm -o - %s | \ // DEFINE: FileCheck %{fcflags} %s ``` The following directives then redefine the parameters before each use of `%{check}`: ``` // REDEFINE: %{cflags} = -foo // REDEFINE: %{fcflags} = -check-prefix=FOO // RUN: %{check} // REDEFINE: %{cflags} = -bar // REDEFINE: %{fcflags} = -check-prefix=BAR // RUN: %{check} ``` Of course, `%{check}` would typically be more elaborate, increasing the benefit of the reuse. One issue is that the strings `DEFINE:` and `REDEFINE:` already appear in 5 tests. This patch adjusts those tests not to use those strings. Our prediction is that, in the vast majority of cases, if a test author mistakenly uses one of those strings for another purpose, the text appearing after the string will not happen to have the syntax required for these directives. Thus, the test author will discover the mistake immediately when lit reports the syntax error. This patch also expands the documentation on existing lit substitution behavior. Reviewed By: jhenderson, MaskRay, awarzynski Differential Revision: https://reviews.llvm.org/D132513
222 lines
6.3 KiB
YAML
222 lines
6.3 KiB
YAML
## In this test we check that can redefine the null section in the YAML.
|
|
|
|
## Test the default output first.
|
|
|
|
# RUN: yaml2obj --docnum=1 %s -o %t1
|
|
# RUN: llvm-readelf --sections %t1 | FileCheck %s --check-prefix=DEFAULT
|
|
|
|
# DEFAULT: Section Headers:
|
|
# DEFAULT-NEXT: [Nr] Name Type Address Off Size ES Flg Lk Inf Al
|
|
# DEFAULT-NEXT: [ 0] NULL 0000000000000000 000000 000000 00 0 0 0
|
|
# DEFAULT-NEXT: [ 1] .strtab STRTAB 0000000000000000 000040 000001 00 0 0 1
|
|
# DEFAULT-NEXT: [ 2] .shstrtab STRTAB 0000000000000000 000041 000013 00 0 0 1
|
|
|
|
--- !ELF
|
|
FileHeader:
|
|
Class: ELFCLASS64
|
|
Data: ELFDATA2LSB
|
|
Type: ET_REL
|
|
|
|
## Now define a SHT_NULL section with fields all zeroed.
|
|
## In this case it is equal to the section created by default.
|
|
|
|
# RUN: yaml2obj --docnum=2 %s -o %t2
|
|
# RUN: llvm-readelf --sections %t2 | FileCheck %s --check-prefix=DEFAULT
|
|
|
|
--- !ELF
|
|
FileHeader:
|
|
Class: ELFCLASS64
|
|
Data: ELFDATA2LSB
|
|
Type: ET_REL
|
|
Sections:
|
|
- Type: SHT_NULL
|
|
Name: ''
|
|
Flags: [ ]
|
|
AddressAlign: 0x0
|
|
Size: 0x0
|
|
EntSize: 0x0
|
|
Link: 0
|
|
Info: 0
|
|
Address: 0x0
|
|
|
|
## Check we can redefine fields of the first SHT_NULL section.
|
|
|
|
# RUN: yaml2obj --docnum=3 %s -o %t3
|
|
# RUN: llvm-readelf --sections %t3 | FileCheck %s --check-prefix=REDEF
|
|
|
|
# REDEF: Section Headers:
|
|
# REDEF-NEXT: [Nr] Name Type Address Off Size ES Flg Lk Inf Al
|
|
# REDEF-NEXT: [ 0] .foo NULL 0000000000000006 000000 000002 03 A 4 5 1
|
|
|
|
--- !ELF
|
|
FileHeader:
|
|
Class: ELFCLASS64
|
|
Data: ELFDATA2LSB
|
|
Type: ET_REL
|
|
Sections:
|
|
- Type: SHT_NULL
|
|
Name: .foo
|
|
Flags: [ SHF_ALLOC ]
|
|
AddressAlign: 0x1
|
|
Size: 0x2
|
|
EntSize: 0x3
|
|
Link: 4
|
|
Info: 5
|
|
Address: 0x6
|
|
|
|
## Check that file size does not change if we redefine the Size
|
|
## of the first SHT_NULL section.
|
|
|
|
# RUN: yaml2obj --docnum=4 %s -o %t4
|
|
# RUN: wc -c < %t3 > %t.txt
|
|
# RUN: wc -c < %t4 >> %t.txt
|
|
# RUN: FileCheck %s --input-file=%t.txt --check-prefix=SIZE
|
|
|
|
# SIZE: [[FILESIZE:.*]]
|
|
# SIZE: [[FILESIZE]]
|
|
|
|
--- !ELF
|
|
FileHeader:
|
|
Class: ELFCLASS64
|
|
Data: ELFDATA2LSB
|
|
Type: ET_REL
|
|
Sections:
|
|
- Type: SHT_NULL
|
|
Name: .foo
|
|
Flags: [ SHF_ALLOC ]
|
|
AddressAlign: 0x1
|
|
Size: 0xFFFF
|
|
EntSize: 0x3
|
|
Link: 4
|
|
Info: 5
|
|
Address: 0x6
|
|
|
|
## Check we are still able to describe other sections too.
|
|
|
|
# RUN: yaml2obj --docnum=5 %s -o %t5
|
|
# RUN: llvm-readelf --sections %t5 | FileCheck %s --check-prefix=OTHER-SECTION
|
|
|
|
# OTHER-SECTION: Section Headers:
|
|
# OTHER-SECTION-NEXT: [Nr] Name Type Address Off Size ES Flg Lk Inf Al
|
|
# OTHER-SECTION-NEXT: [ 0] NULL 0000000000000000 000000 000000 00 0 0 0
|
|
# OTHER-SECTION-NEXT: [ 1] foo PROGBITS 0000000000000000 000040 000000 00 0 0 0
|
|
# OTHER-SECTION-NEXT: [ 2] .strtab STRTAB 0000000000000000 000040 000001 00 0 0 1
|
|
# OTHER-SECTION-NEXT: [ 3] .shstrtab STRTAB 0000000000000000 000041 000017 00 0 0 1
|
|
|
|
--- !ELF
|
|
FileHeader:
|
|
Class: ELFCLASS64
|
|
Data: ELFDATA2LSB
|
|
Type: ET_REL
|
|
Sections:
|
|
- Type: SHT_NULL
|
|
Name: ''
|
|
Flags: [ ]
|
|
AddressAlign: 0x0
|
|
Size: 0x0
|
|
EntSize: 0x0
|
|
Link: 0
|
|
- Type: SHT_PROGBITS
|
|
Name: 'foo'
|
|
|
|
## Check we report an error if null section sh_link field refers to an unknown section.
|
|
|
|
# RUN: not yaml2obj --docnum=6 %s -o %t6 2>&1 | FileCheck %s --check-prefix=CASE4
|
|
|
|
# CASE4: error: unknown section referenced: '.foo' by YAML section '(index 0)'
|
|
# CASE4-NEXT: error: unknown section referenced: '.bar' by YAML section '(index 1)'
|
|
|
|
--- !ELF
|
|
FileHeader:
|
|
Class: ELFCLASS64
|
|
Data: ELFDATA2LSB
|
|
Type: ET_REL
|
|
Sections:
|
|
- Type: SHT_NULL
|
|
Link: .foo
|
|
- Type: SHT_NULL
|
|
Link: .bar
|
|
|
|
## Check that null section fields are set to zero, if they are unspecified.
|
|
|
|
# RUN: yaml2obj --docnum=7 %s -o %t7
|
|
# RUN: llvm-readelf --sections %t7 | FileCheck %s --check-prefix=DEFAULT
|
|
|
|
--- !ELF
|
|
FileHeader:
|
|
Class: ELFCLASS64
|
|
Data: ELFDATA2LSB
|
|
Type: ET_REL
|
|
Sections:
|
|
- Type: SHT_NULL
|
|
|
|
## Check we do not crash if we have more than one SHT_NULL section.
|
|
|
|
# RUN: yaml2obj --docnum=8 %s -o %t8
|
|
# RUN: llvm-readelf --sections %t8 | FileCheck %s --check-prefix=MULTIPLE
|
|
|
|
# MULTIPLE: Section Headers:
|
|
# MULTIPLE-NEXT: [Nr] Name Type Address Off Size ES Flg Lk Inf Al
|
|
# MULTIPLE-NEXT: [ 0] NULL 0000000000000000 000000 000000 00 0 0 0
|
|
# MULTIPLE-NEXT: [ 1] .foo NULL 0000000000000123 000040 000020 10 A 1 2 0
|
|
|
|
--- !ELF
|
|
FileHeader:
|
|
Class: ELFCLASS64
|
|
Data: ELFDATA2LSB
|
|
Type: ET_REL
|
|
Sections:
|
|
- Type: SHT_NULL
|
|
- Type: SHT_NULL
|
|
Name: .foo
|
|
Flags: [ SHF_ALLOC ]
|
|
Size: 0x20
|
|
EntSize: 0x10
|
|
Link: 1
|
|
Info: 2
|
|
Address: 0x123
|
|
|
|
## Check we can override the sh_offset/sh_size fields of the first SHT_NULL section if requested.
|
|
|
|
# RUN: yaml2obj --docnum=9 %s -o %t9
|
|
# RUN: llvm-readelf --sections %t9 | FileCheck %s --check-prefix=OVERRIDE
|
|
|
|
# OVERRIDE: Section Headers:
|
|
# OVERRIDE-NEXT: [Nr] Name Type Address Off Size ES Flg Lk Inf Al
|
|
# OVERRIDE-NEXT: [ 0] NULL 0000000000000000 000007 000008 00 0 0 0
|
|
|
|
--- !ELF
|
|
FileHeader:
|
|
Class: ELFCLASS64
|
|
Data: ELFDATA2LSB
|
|
Type: ET_REL
|
|
Sections:
|
|
- Type: SHT_NULL
|
|
Size: 0x2
|
|
ShOffset: 0x7
|
|
ShSize: 0x8
|
|
|
|
## Check that we can set an offset for the SHT_NULL section explicitly using the "Offset" key.
|
|
## Check it affects the section header table offset.
|
|
# RUN: yaml2obj --docnum=10 %s -DOFFSET=0x100 -o %t10
|
|
# RUN: llvm-readelf --headers --sections %t10 | FileCheck %s --check-prefix=EXPLICIT-OFFSET-A
|
|
# RUN: yaml2obj --docnum=10 %s -DOFFSET=0x200 -o %t11
|
|
# RUN: llvm-readelf --headers --sections %t11 | FileCheck %s --check-prefix=EXPLICIT-OFFSET-B
|
|
|
|
# EXPLICIT-OFFSET-A: Start of section headers: 280 (bytes into file)
|
|
# EXPLICIT-OFFSET-A: [Nr] Name Type Address Off
|
|
# EXPLICIT-OFFSET-A-NEXT: [ 0] NULL 0000000000000000 000100
|
|
|
|
# EXPLICIT-OFFSET-B: Start of section headers: 536 (bytes into file)
|
|
# EXPLICIT-OFFSET-B: [Nr] Name Type Address Off
|
|
# EXPLICIT-OFFSET-B-NEXT: [ 0] NULL 0000000000000000 000200
|
|
|
|
--- !ELF
|
|
FileHeader:
|
|
Class: ELFCLASS64
|
|
Data: ELFDATA2LSB
|
|
Type: ET_REL
|
|
Sections:
|
|
- Type: SHT_NULL
|
|
Offset: [[OFFSET]]
|