[llvm] r366894 - [yaml2obj] - Allow custom fields for the SHT_UNDEF sections.

Azhar Mohammed via llvm-commits llvm-commits at lists.llvm.org
Wed Jul 24 09:45:56 PDT 2019


This test is failing on Darwin.

/Users/buildslave/jenkins/workspace/clang-stage1-RA/llvm-project/llvm/test/tools/yaml2obj/elf-custom-null-section.yaml:79:9: error: SIZE: expected string not found in input
# SIZE: Size: [[FILESIZE:.*]]
        ^
/Users/buildslave/jenkins/workspace/clang-stage1-RA/clang-build/test/tools/yaml2obj/Output/elf-custom-null-section.yaml.tmp.txt:1:1: note: scanning from here
16777220 5978701391 -rw-r--r-- 1 buildslave staff 0 377 "Jul 24 07:06:53 2019" "Jul 24 07:06:53 2019" "Jul 24 07:06:53 2019" "Jul 24 07:06:53 2019" 4096 8 0 /Users/buildslave/jenkins/workspace/clang-stage1-RA/clang-build/test/tools/yaml2obj/Output/elf-custom-null-section.yaml.tmp3
^
/Users/buildslave/jenkins/workspace/clang-stage1-RA/clang-build/test/tools/yaml2obj/Output/elf-custom-null-section.yaml.tmp.txt:1:4: note: possible intended match here
16777220 5978701391 -rw-r--r-- 1 buildslave staff 0 377 "Jul 24 07:06:53 2019" "Jul 24 07:06:53 2019" "Jul 24 07:06:53 2019" "Jul 24 07:06:53 2019" 4096 8 0 /Users/buildslave/jenkins/workspace/clang-stage1-RA/clang-build/test/tools/yaml2obj/Output/elf-custom-null-section.yaml.tmp3
   ^

> On Jul 24, 2019, at 5:16 AM, George Rimar via llvm-commits <llvm-commits at lists.llvm.org> wrote:
> 
> Author: grimar
> Date: Wed Jul 24 05:16:22 2019
> New Revision: 366894
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=366894&view=rev
> Log:
> [yaml2obj] - Allow custom fields for the SHT_UNDEF sections.
> 
> This is a follow-up refactoring patch for recently
> introduced functionality which which reduces the code duplication
> and also makes possible to redefine all possible fields of
> the first SHT_NULL section (previously it was only possible to set
> sh_link and sh_size).
> 
> Differential revision: https://reviews.llvm.org/D65140
> 
> Modified:
>    llvm/trunk/test/tools/yaml2obj/elf-custom-null-section.yaml
>    llvm/trunk/tools/yaml2obj/yaml2elf.cpp
> 
> Modified: llvm/trunk/test/tools/yaml2obj/elf-custom-null-section.yaml
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/yaml2obj/elf-custom-null-section.yaml?rev=366894&r1=366893&r2=366894&view=diff
> ==============================================================================
> --- llvm/trunk/test/tools/yaml2obj/elf-custom-null-section.yaml (original)
> +++ llvm/trunk/test/tools/yaml2obj/elf-custom-null-section.yaml Wed Jul 24 05:16:22 2019
> @@ -42,18 +42,14 @@ Sections:
>     Info:         0
>     Address:      0x0
> 
> -## Check we are still able to describe other sections too.
> +## 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=OTHER-SECTION
> +# RUN: llvm-readelf --sections %t3 | FileCheck %s --check-prefix=REDEFINE
> 
> -# 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 000180 000000 00 0   0  0
> -# OTHER-SECTION-NEXT:   [ 2] .symtab   SYMTAB   0000000000000000 000180 000018 18 3   1  8
> -# OTHER-SECTION-NEXT:   [ 3] .strtab   STRTAB   0000000000000000 000198 000001 00 0   0  1
> -# OTHER-SECTION-NEXT:   [ 4] .shstrtab STRTAB   0000000000000000 000199 00001f 00 0   0  1
> +# REDEFINE:      Section Headers:
> +# REDEFINE-NEXT:  [Nr] Name Type Address          Off    Size   ES Flg Lk Inf Al
> +# REDEFINE-NEXT:  [ 0] .foo NULL 0000000000000006 000000 000002 03   A 4   5  1
> 
> --- !ELF
> FileHeader:
> @@ -63,23 +59,25 @@ FileHeader:
>   Machine: EM_X86_64
> Sections:
>   - Type:         SHT_NULL
> -    Name:         ''
> -    Flags:        [ ]
> -    AddressAlign: 0x0
> -    Size:         0x0
> -    EntSize:      0x0
> -    Link:         0
> -  - Type: SHT_PROGBITS
> -    Name: 'foo'
> +    Name:         .foo
> +    Flags:        [ SHF_ALLOC ]
> +    AddressAlign: 0x1
> +    Size:         0x2
> +    EntSize:      0x3
> +    Link:         4
> +    Info:         5
> +    Address:      0x6
> 
> -## Check we can redefine sh_size and sh_link fields of the SHT_NULL section.
> +## 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: llvm-readelf --sections %t4 | FileCheck %s --check-prefix=REDEFINE
> +# RUN: stat %t3 > %t.txt
> +# RUN: stat %t4 >> %t.txt
> +# RUN: FileCheck %s --input-file=%t.txt --check-prefix=SIZE
> 
> -# REDEFINE:      Section Headers:
> -# REDEFINE-NEXT:  [Nr] Name Type Address          Off    Size   ES Flg Lk Inf Al
> -# REDEFINE-NEXT:  [ 0]      NULL 0000000000000000 000000 000123 00     1   0  0
> +# SIZE: Size: [[FILESIZE:.*]]
> +# SIZE: Size: [[FILESIZE]]
> 
> --- !ELF
> FileHeader:
> @@ -88,16 +86,28 @@ FileHeader:
>   Type:    ET_REL
>   Machine: EM_X86_64
> Sections:
> -  - Type: SHT_NULL
> -    Link: .foo
> -    Size: 0x123
> -  - Type: SHT_PROGBITS
> -    Name: .foo
> +  - Type:         SHT_NULL
> +    Name:         .foo
> +    Flags:        [ SHF_ALLOC ]
> +    AddressAlign: 0x1
> +    Size:         0xFFFF
> +    EntSize:      0x3
> +    Link:         4
> +    Info:         5
> +    Address:      0x6
> 
> -## The same as above, but using a number as a Link value.
> +## 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=REDEFINE
> +# 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 000180 000000 00 0   0  0
> +# OTHER-SECTION-NEXT:   [ 2] .symtab   SYMTAB   0000000000000000 000180 000018 18 3   1  8
> +# OTHER-SECTION-NEXT:   [ 3] .strtab   STRTAB   0000000000000000 000198 000001 00 0   0  1
> +# OTHER-SECTION-NEXT:   [ 4] .shstrtab STRTAB   0000000000000000 000199 00001f 00 0   0  1
> 
> --- !ELF
> FileHeader:
> @@ -106,11 +116,15 @@ FileHeader:
>   Type:    ET_REL
>   Machine: EM_X86_64
> Sections:
> -  - Type: SHT_NULL
> -    Link: 1
> -    Size: 0x123
> +  - Type:         SHT_NULL
> +    Name:         ''
> +    Flags:        [ ]
> +    AddressAlign: 0x0
> +    Size:         0x0
> +    EntSize:      0x0
> +    Link:         0
>   - Type: SHT_PROGBITS
> -    Name: .foo
> +    Name: 'foo'
> 
> ## Check we report an error if null section sh_link field refers to an unknown section.
> 
> @@ -150,7 +164,7 @@ Sections:
> # 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]      NULL 0000000000000123 000180 000020 10 A   1  2   0
> +# MULTIPLE-NEXT:  [ 1] .foo NULL 0000000000000123 000180 000020 10 A   1  2   0
> 
> --- !ELF
> FileHeader:
> @@ -161,9 +175,31 @@ FileHeader:
> 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
> +  Machine: EM_X86_64
> +Sections:
> +  - Type:     SHT_NULL
> +    Size:     0x2
> +    ShOffset: 0x7
> +    ShSize:   0x8
> 
> Modified: llvm/trunk/tools/yaml2obj/yaml2elf.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/yaml2obj/yaml2elf.cpp?rev=366894&r1=366893&r2=366894&view=diff
> ==============================================================================
> --- llvm/trunk/tools/yaml2obj/yaml2elf.cpp (original)
> +++ llvm/trunk/tools/yaml2obj/yaml2elf.cpp Wed Jul 24 05:16:22 2019
> @@ -247,7 +247,7 @@ void ELFState<ELFT>::initELFHeader(Elf_E
>           ? (typename ELFT::uint)(*Doc.Header.SHOffset)
>           : sizeof(Header) + sizeof(Elf_Phdr) * Doc.ProgramHeaders.size();
>   Header.e_shnum =
> -      Doc.Header.SHNum ? (uint16_t)*Doc.Header.SHNum : SN2I.size() + 1;
> +      Doc.Header.SHNum ? (uint16_t)*Doc.Header.SHNum : Doc.Sections.size();
>   Header.e_shstrndx = Doc.Header.SHStrNdx ? (uint16_t)*Doc.Header.SHStrNdx
>                                           : SN2I.get(".shstrtab");
> }
> @@ -327,30 +327,15 @@ bool ELFState<ELFT>::initSectionHeaders(
>   SHeaders.resize(Doc.Sections.size());
> 
>   for (size_t I = 0; I < Doc.Sections.size(); ++I) {
> -    Elf_Shdr &SHeader = SHeaders[I];
>     ELFYAML::Section *Sec = Doc.Sections[I].get();
> -
> -    if (I == 0) {
> -      if (Sec->IsImplicit)
> -        continue;
> -
> -      if (auto S = dyn_cast<ELFYAML::RawContentSection>(Sec))
> -        if (S->Size)
> -          SHeader.sh_size = *S->Size;
> -
> -      if (!Sec->Link.empty()) {
> -        unsigned Index;
> -        if (!convertSectionIndex(SN2I, Sec->Name, Sec->Link, Index))
> -          return false;
> -        SHeader.sh_link = Index;
> -      }
> +    if (I == 0 && Sec->IsImplicit)
>       continue;
> -    }
> 
>     // We have a few sections like string or symbol tables that are usually
>     // added implicitly to the end. However, if they are explicitly specified
>     // in the YAML, we need to write them here. This ensures the file offset
>     // remains correct.
> +    Elf_Shdr &SHeader = SHeaders[I];
>     if (initImplicitHeader(State, CBA, SHeader, Sec->Name,
>                            Sec->IsImplicit ? nullptr : Sec))
>       continue;
> @@ -372,7 +357,17 @@ bool ELFState<ELFT>::initSectionHeaders(
>       SHeader.sh_link = Index;
>     }
> 
> -    if (auto S = dyn_cast<ELFYAML::RawContentSection>(Sec)) {
> +    if (I == 0) {
> +      if (auto RawSec = dyn_cast<ELFYAML::RawContentSection>(Sec)) {
> +        // We do not write any content for special SHN_UNDEF section.
> +        if (RawSec->Size)
> +          SHeader.sh_size = *RawSec->Size;
> +        if (RawSec->Info)
> +          SHeader.sh_info = *RawSec->Info;
> +      }
> +      if (Sec->EntSize)
> +        SHeader.sh_entsize = *Sec->EntSize;
> +    } else if (auto S = dyn_cast<ELFYAML::RawContentSection>(Sec)) {
>       if (!writeSectionContent(SHeader, *S, CBA))
>         return false;
>     } else if (auto S = dyn_cast<ELFYAML::RelocationSection>(Sec)) {
> @@ -966,8 +961,11 @@ bool ELFState<ELFT>::writeSectionContent
> }
> 
> template <class ELFT> bool ELFState<ELFT>::buildSectionIndex() {
> -  for (unsigned I = 1, E = Doc.Sections.size(); I != E; ++I) {
> +  for (unsigned I = 0, E = Doc.Sections.size(); I != E; ++I) {
>     StringRef Name = Doc.Sections[I]->Name;
> +    if (Name.empty())
> +      continue;
> +
>     DotShStrtab.add(dropUniqueSuffix(Name));
>     if (!SN2I.addName(Name, I)) {
>       WithColor::error() << "Repeated section name: '" << Name
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190724/73ffbfcf/attachment.html>


More information about the llvm-commits mailing list