## 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=]] - Name: [[SYMNAME2=]] StringTable: ContentSize: [[CONTENTSIZE=]] Length: [[LENGTHVALUE=]] RawContent: [[RAWCONTENT=]] ## 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=]] - Name: [[SYMNAME2=]] - Name: [[SYMNAME3=]] StringTable: ContentSize: [[CONTENTSIZE=]] Length: [[LENGTHVALUE=]] RawContent: [[RAWCONTENT=]] 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: # 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: # 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