292 lines
11 KiB
YAML
292 lines
11 KiB
YAML
## Check that yaml2obj is able to customize the string table.
|
|
## `ContentSize`, `Length`, `Strings` and/or `RawContent` can be specified in
|
|
## YAML. Here we test the behaviour in various cases.
|
|
|
|
## Case 1: yaml2obj writes the default content (i.e. long symbol names in
|
|
## XCOFF32 or any symbol names in XCOFF64) when no StringTable field
|
|
## is specified.
|
|
# RUN: yaml2obj --docnum=1 %s -DSYMNAME='nameInStrTbl' -o %t1
|
|
# RUN: llvm-readobj %t1 --string-table | FileCheck %s --check-prefix=CASE1
|
|
|
|
# CASE1: StringTable {
|
|
# CASE1-NEXT: Length: 17
|
|
# CASE1-NEXT: [ 4] nameInStrTbl
|
|
# CASE1-NEXT: }
|
|
|
|
--- !XCOFF
|
|
FileHeader:
|
|
MagicNumber: 0x1DF
|
|
Symbols:
|
|
- Name: [[SYMNAME=<none>]]
|
|
- Name: [[SYMNAME2=<none>]]
|
|
StringTable:
|
|
ContentSize: [[CONTENTSIZE=<none>]]
|
|
Length: [[LENGTHVALUE=<none>]]
|
|
RawContent: [[RAWCONTENT=<none>]]
|
|
|
|
## We can specify `ContentSize` only when the value is equal to or greater
|
|
## than the content size. For greater cases, zeros are added as padding.
|
|
## Cases 2-6 are trying to check this.
|
|
|
|
## Case 2: produce a string table with a specified `ContentSize`. In this case,
|
|
## there is no default content and the content is filled with zeroes.
|
|
# RUN: yaml2obj --docnum=1 %s -DCONTENTSIZE=20 -o %t2
|
|
# RUN: llvm-readobj %t2 -s --string-table | FileCheck %s --check-prefix=CASE2
|
|
|
|
# CASE2: StringTable {
|
|
# CASE2-NEXT: Length: 20
|
|
# CASE2-NEXT: }
|
|
|
|
## Case 3: if the value of `ContentSize` is greater than the content size,
|
|
## yaml2obj adds zeros as padding after the default content.
|
|
# RUN: yaml2obj --docnum=1 %s -DSYMNAME='nameInStrTbl' -DCONTENTSIZE=20 -o %t3
|
|
# RUN: llvm-readobj %t3 --string-table | FileCheck %s --check-prefix=CASE3
|
|
|
|
# CASE3: StringTable {
|
|
# CASE3-NEXT: Length: 20
|
|
# CASE3-NEXT: [ 4] nameInStrTbl
|
|
# CASE3-NEXT: }
|
|
|
|
## Case 4: the value of `ContentSize` matches the actual content size.
|
|
# RUN: yaml2obj --docnum=1 %s -DSYMNAME='nameInStrTbl' -DCONTENTSIZE=17 -o %t4
|
|
# RUN: llvm-readobj %t4 --string-table | FileCheck %s --check-prefix=CASE4
|
|
|
|
# CASE4: StringTable {
|
|
# CASE4-NEXT: Length: 17
|
|
# CASE4-NEXT: [ 4] nameInStrTbl
|
|
# CASE4-NEXT: }
|
|
|
|
## Case 5: an error is reported when the value of "ContentSize" is less than
|
|
## the content size.
|
|
# RUN: not yaml2obj --docnum=1 %s -DSYMNAME='nameInStrTbl' -DCONTENTSIZE=16 \
|
|
# RUN: -o %t5 2>&1 | FileCheck %s --check-prefix=CASE5
|
|
|
|
# CASE5: error: specified ContentSize (16) is less than the size of the data that would otherwise be written (17)
|
|
|
|
## Case 6: an error is reported when `ContentSize` is less than 4 without
|
|
## `RawContent`.
|
|
# RUN: not yaml2obj --docnum=1 %s -DCONTENTSIZE=3 -o %t6 2>&1 \
|
|
# RUN: | FileCheck %s --check-prefix=CASE6
|
|
|
|
# CASE6: error: ContentSize shouldn't be less than 4 without RawContent
|
|
|
|
## We can specify `Strings` for a string table. Default contents (ie. symbol
|
|
## names in string table) will be overwritten by specified values. Cases 7-9
|
|
## are trying to check this function.
|
|
|
|
## Case 7: produce a string table with specified `Strings` directly. In this
|
|
## case, there is no default content.
|
|
# RUN: yaml2obj --docnum=2 %s -o %t7
|
|
# RUN: llvm-readobj %t7 --string-table | FileCheck %s --check-prefix=CASE7
|
|
|
|
# CASE7: StringTable {
|
|
# CASE7-NEXT: Length: 8
|
|
# CASE7-NEXT: [ 4] b
|
|
# CASE7-NEXT: [ 6] a
|
|
# CASE7-NEXT: }
|
|
|
|
--- !XCOFF
|
|
FileHeader:
|
|
MagicNumber: 0x1DF
|
|
Symbols:
|
|
- Name: [[SYMNAME=<none>]]
|
|
- Name: [[SYMNAME2=<none>]]
|
|
- Name: [[SYMNAME3=<none>]]
|
|
StringTable:
|
|
ContentSize: [[CONTENTSIZE=<none>]]
|
|
Length: [[LENGTHVALUE=<none>]]
|
|
RawContent: [[RAWCONTENT=<none>]]
|
|
Strings:
|
|
- a
|
|
- b
|
|
|
|
## Case 8: if the number of `Strings` is greater than or equal to the number
|
|
## of default strings, all default strings will be overwritten by
|
|
## specified ones.
|
|
# RUN: yaml2obj --docnum=2 %s -DSYMNAME='nameInStrTbl' -o %t8
|
|
# RUN: llvm-readobj %t8 -s --string-table | FileCheck %s --check-prefix=CASE8
|
|
|
|
# CASE8: Symbols [
|
|
# CASE8-NEXT: Symbol {
|
|
# CASE8-NEXT: Index: 0
|
|
# CASE8-NEXT: Name: a
|
|
# CASE8-NEXT: Value: 0x0
|
|
# CASE8-NEXT: Section: N_UNDEF
|
|
# CASE8-NEXT: Type: 0x0
|
|
# CASE8-NEXT: StorageClass: C_NULL (0x0)
|
|
# CASE8-NEXT: NumberOfAuxEntries: 0
|
|
# CASE8-NEXT: }
|
|
# CASE8-NEXT: Symbol {
|
|
# CASE8-NEXT: Index: 1
|
|
# CASE8-NEXT: Name: <none>
|
|
# CASE8-NEXT: Value: 0x0
|
|
# CASE8-NEXT: Section: N_UNDEF
|
|
# CASE8-NEXT: Type: 0x0
|
|
# CASE8-NEXT: StorageClass: C_NULL (0x0)
|
|
# CASE8-NEXT: NumberOfAuxEntries: 0
|
|
# CASE8-NEXT: }
|
|
# CASE8-NEXT: Symbol {
|
|
# CASE8-NEXT: Index: 2
|
|
# CASE8-NEXT: Name: <none>
|
|
# CASE8-NEXT: Value: 0x0
|
|
# CASE8-NEXT: Section: N_UNDEF
|
|
# CASE8-NEXT: Type: 0x0
|
|
# CASE8-NEXT: StorageClass: C_NULL (0x0)
|
|
# CASE8-NEXT: NumberOfAuxEntries: 0
|
|
# CASE8-NEXT: }
|
|
# CASE8-NEXT: ]
|
|
# CASE8-NEXT: StringTable {
|
|
# CASE8-NEXT: Length: 8
|
|
# CASE8-NEXT: [ 4] b
|
|
# CASE8-NEXT: [ 6] a
|
|
# CASE8-NEXT: }
|
|
|
|
## Case 9: if the number of `Strings` is less than the number of default
|
|
## strings, default strings will be partially overwritten. The
|
|
## remaining strings will still be stored after the specified strings
|
|
## in the string table.
|
|
# RUN: yaml2obj --docnum=2 %s -DSYMNAME='nameInStrTbl' \
|
|
# RUN: -DSYMNAME2='name2InStrTbl' -DSYMNAME3='name3InStrTbl' -o %t9
|
|
# RUN: llvm-readobj %t9 -s --string-table | FileCheck %s --check-prefix=CASE9
|
|
|
|
# CASE9: Symbols [
|
|
# CASE9-NEXT: Symbol {
|
|
# CASE9-NEXT: Index: 0
|
|
# CASE9-NEXT: Name: a
|
|
# CASE9-NEXT: Value: 0x0
|
|
# CASE9-NEXT: Section: N_UNDEF
|
|
# CASE9-NEXT: Type: 0x0
|
|
# CASE9-NEXT: StorageClass: C_NULL (0x0)
|
|
# CASE9-NEXT: NumberOfAuxEntries: 0
|
|
# CASE9-NEXT: }
|
|
# CASE9-NEXT: Symbol {
|
|
# CASE9-NEXT: Index: 1
|
|
# CASE9-NEXT: Name: b
|
|
# CASE9-NEXT: Value: 0x0
|
|
# CASE9-NEXT: Section: N_UNDEF
|
|
# CASE9-NEXT: Type: 0x0
|
|
# CASE9-NEXT: StorageClass: C_NULL (0x0)
|
|
# CASE9-NEXT: NumberOfAuxEntries: 0
|
|
# CASE9-NEXT: }
|
|
# CASE9-NEXT: Symbol {
|
|
# CASE9-NEXT: Index: 2
|
|
# CASE9-NEXT: Name: name3InStrTbl
|
|
# CASE9-NEXT: Value: 0x0
|
|
# CASE9-NEXT: Section: N_UNDEF
|
|
# CASE9-NEXT: Type: 0x0
|
|
# CASE9-NEXT: StorageClass: C_NULL (0x0)
|
|
# CASE9-NEXT: NumberOfAuxEntries: 0
|
|
# CASE9-NEXT: }
|
|
# CASE9-NEXT: ]
|
|
# CASE9-NEXT: StringTable {
|
|
# CASE9-NEXT: Length: 22
|
|
# CASE9-NEXT: [ 4] name3InStrTbl
|
|
# CASE9-NEXT: [ 12] b
|
|
# CASE9-NEXT: [ 14] a
|
|
# CASE9-NEXT: }
|
|
|
|
## We can specify both `ContentSize` and `Strings` when `ContentSize` is equal
|
|
## to or greater than the content size. Cases 10-12 are trying to check this.
|
|
|
|
## Case 10: produce a string table with specified `ContentSize` and `Strings`
|
|
## when the value is greater than the size of specified strings.
|
|
## In this case, there is no default content.
|
|
# RUN: yaml2obj --docnum=2 %s -DCONTENTSIZE=20 -o %t10
|
|
# RUN: llvm-readobj %t10 --string-table | FileCheck %s --check-prefix=CASE10
|
|
|
|
# CASE10: StringTable {
|
|
# CASE10-NEXT: Length: 20
|
|
# CASE10-NEXT: [ 4] b
|
|
# CASE10-NEXT: [ 6] a
|
|
# CASE10-NEXT: }
|
|
|
|
## Case 11: for a string table with default contents, we can specify
|
|
## `ContentSize` and `Strings` when the `ContentSize` is greater
|
|
## than the data that would otherwise be written.
|
|
# RUN: yaml2obj --docnum=2 %s -DCONTENTSIZE=30 -DSYMNAME='nameInStrTbl' \
|
|
# RUN: -DSYMNAME2='name2InStrTbl' -DSYMNAME3='name3InStrTbl' -o %t11
|
|
# RUN: llvm-readobj %t11 --string-table | FileCheck %s --check-prefix=CASE11
|
|
|
|
# CASE11: StringTable {
|
|
# CASE11-NEXT: Length: 30
|
|
# CASE11-NEXT: [ 4] name3InStrTbl
|
|
# CASE11-NEXT: [ 12] b
|
|
# CASE11-NEXT: [ 14] a
|
|
# CASE11-NEXT: }
|
|
|
|
## Case 12: an error is reported when the value of `ContentSize` is less
|
|
## than the final content size. None of `ContentSize`, `Strings` or
|
|
## default contents is empty in this case.
|
|
# RUN: not yaml2obj --docnum=2 %s -DCONTENTSIZE=10 -DSYMNAME='nameInStrTbl' \
|
|
# RUN: -DSYMNAME2='name2InStrTbl' -DSYMNAME3='name3InStrTbl' -o %t12 2>&1 \
|
|
# RUN: | FileCheck %s --check-prefix=CASE12
|
|
|
|
# CASE12: error: specified ContentSize (10) is less than the size of the data that would otherwise be written (22)
|
|
|
|
## We can use `RawContent` to generate a string table. Cases 13-16 are trying to
|
|
## check the `RawContent`.
|
|
|
|
## Case 13: if `RawContent` is specified and no `ContentSize` is specified.
|
|
## Write the `RawContent` data.
|
|
# RUN: yaml2obj --docnum=1 %s -DRAWCONTENT="000000090062006300" -o %t13
|
|
# RUN: llvm-readobj %t13 --string-table | FileCheck %s --check-prefix=CASE13
|
|
|
|
# CASE13: StringTable {
|
|
# CASE13-NEXT: Length: 9
|
|
# CASE13-NEXT: [ 5] b
|
|
# CASE13-NEXT: [ 7] c
|
|
# CASE13-NEXT: }
|
|
|
|
## Case 14: if `RawContent` is specified and `ContentSize` matches the size
|
|
## of the `RawContent` data. Write the `RawContent` data.
|
|
# RUN: yaml2obj --docnum=1 %s -DRAWCONTENT="000000090062006300" -DCONTENTSIZE=9 -o %t14
|
|
# RUN: llvm-readobj %t14 --string-table | FileCheck %s --check-prefix=CASE14
|
|
|
|
# CASE14: StringTable {
|
|
# CASE14-NEXT: Length: 9
|
|
# CASE14-NEXT: [ 5] b
|
|
# CASE14-NEXT: [ 7] c
|
|
# CASE14-NEXT: }
|
|
|
|
## Case 15: an error is reported when `ContentSize` is less than the `RawContent`
|
|
## data size.
|
|
# RUN: not yaml2obj --docnum=1 %s -DRAWCONTENT="000000090062006300" -DCONTENTSIZE=6 \
|
|
# RUN: -o %t15 2>&1 | FileCheck %s --check-prefix=CASE15
|
|
|
|
# CASE15: error: specified ContentSize (6) is less than the RawContent data size (9)
|
|
|
|
## Case 16: if `RawContent` is specified and `ContentSize` is greater than the
|
|
## `RawContent` data size, pad the RawContent with trailing zeroes.
|
|
# RUN: yaml2obj --docnum=1 %s -DRAWCONTENT="000000090062006300" -DCONTENTSIZE=11 -o %t16
|
|
# RUN: llvm-readobj %t16 --string-table | FileCheck %s --check-prefix=CASE16
|
|
|
|
# CASE16: StringTable {
|
|
# CASE16-NEXT: Length: 9
|
|
# CASE16-NEXT: [ 5] b
|
|
# CASE16-NEXT: [ 7] c
|
|
# CASE16-NEXT: }
|
|
|
|
## We can specify `Length`. Use the value of the `Length` field for the first
|
|
## 4 bytes of the table. The value may not make sense for the data that is
|
|
## being written. Cases 17-20 are trying to check this.
|
|
|
|
## Case 17: report an error if the `Length` is specified as well as `RawContent`.
|
|
# RUN: not yaml2obj --docnum=1 %s -DRAWCONTENT="0062006300" -DLENGTHVALUE=9 \
|
|
# RUN: -o %t17 2>&1 | FileCheck %s --check-prefix=CASE17
|
|
|
|
# CASE17: error: can't specify Strings or Length when RawContent is specified
|
|
|
|
## Case 18: report an error if both `RawContent` and `Strings` are specified.
|
|
# RUN: not yaml2obj --docnum=2 %s -DRAWCONTENT="0062006300" -o %t18 2>&1 \
|
|
# RUN: | FileCheck %s --check-prefix=CASE18
|
|
|
|
# CASE18: error: can't specify Strings or Length when RawContent is specified
|
|
|
|
## Case 19: use the value of the `Length` field for the first 4 bytes of the
|
|
## table. We dump the string table from the offset of 0x38.
|
|
# RUN: yaml2obj --docnum=1 %s -DSYMNAME='nameInStrTbl' -DLENGTHVALUE=20 -o %t19
|
|
# RUN: od -A n -t x1 -v -j 0x38 %t19 \
|
|
# RUN: | FileCheck %s --ignore-case --check-prefix=CASE19
|
|
|
|
# CASE19: 00 00 00 14 6e 61 6d 65 49 6e 53 74 72 54 62 6c
|
|
# CASE19-NEXT: 00
|