[llvm] r241350 - [ELFYAML] Fix handling SHT_NOBITS sections by obj2yaml/yaml2obj tools

Rafael EspĂ­ndola rafael.espindola at gmail.com
Fri Jul 3 07:49:12 PDT 2015


This broke pretty much every lld elf test that uses yaml.

On 3 July 2015 at 10:07, Simon Atanasyan <simon at atanasyan.com> wrote:
> Author: atanasyan
> Date: Fri Jul  3 09:07:06 2015
> New Revision: 241350
>
> URL: http://llvm.org/viewvc/llvm-project?rev=241350&view=rev
> Log:
> [ELFYAML] Fix handling SHT_NOBITS sections by obj2yaml/yaml2obj tools
>
> SHT_NOBITS sections do not have content in an object file. Now yaml2obj
> tool does not accept `Content` field for such sections, and obj2yaml
> tool does not attempt to read the section content from a file.
>
> Modified:
>     llvm/trunk/include/llvm/Object/ELFYAML.h
>     llvm/trunk/lib/Object/ELFYAML.cpp
>     llvm/trunk/test/Object/obj2yaml.test
>     llvm/trunk/test/Object/yaml2obj-elf-rel-noref.yaml
>     llvm/trunk/tools/obj2yaml/elf2yaml.cpp
>     llvm/trunk/tools/yaml2obj/yaml2elf.cpp
>
> Modified: llvm/trunk/include/llvm/Object/ELFYAML.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/ELFYAML.h?rev=241350&r1=241349&r2=241350&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/Object/ELFYAML.h (original)
> +++ llvm/trunk/include/llvm/Object/ELFYAML.h Fri Jul  3 09:07:06 2015
> @@ -85,7 +85,13 @@ struct SectionOrType {
>  };
>
>  struct Section {
> -  enum class SectionKind { Group, RawContent, Relocation, MipsABIFlags };
> +  enum class SectionKind {
> +    Group,
> +    RawContent,
> +    Relocation,
> +    NoBits,
> +    MipsABIFlags
> +  };
>    SectionKind Kind;
>    StringRef Name;
>    ELF_SHT Type;
> @@ -106,6 +112,14 @@ struct RawContentSection : Section {
>    }
>  };
>
> +struct NoBitsSection : Section {
> +  llvm::yaml::Hex64 Size;
> +  NoBitsSection() : Section(SectionKind::NoBits) {}
> +  static bool classof(const Section *S) {
> +    return S->Kind == SectionKind::NoBits;
> +  }
> +};
> +
>  struct Group : Section {
>    // Members of a group contain a flag and a list of section indices
>    // that are part of the group.
>
> Modified: llvm/trunk/lib/Object/ELFYAML.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/ELFYAML.cpp?rev=241350&r1=241349&r2=241350&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Object/ELFYAML.cpp (original)
> +++ llvm/trunk/lib/Object/ELFYAML.cpp Fri Jul  3 09:07:06 2015
> @@ -627,6 +627,11 @@ static void sectionMapping(IO &IO, ELFYA
>    IO.mapOptional("Size", Section.Size, Hex64(Section.Content.binary_size()));
>  }
>
> +static void sectionMapping(IO &IO, ELFYAML::NoBitsSection &Section) {
> +  commonSectionMapping(IO, Section);
> +  IO.mapRequired("Size", Section.Size);
> +}
> +
>  static void sectionMapping(IO &IO, ELFYAML::RelocationSection &Section) {
>    commonSectionMapping(IO, Section);
>    IO.mapOptional("Relocations", Section.Relocations);
> @@ -682,6 +687,11 @@ void MappingTraits<std::unique_ptr<ELFYA
>        Section.reset(new ELFYAML::Group());
>      groupSectionMapping(IO, *cast<ELFYAML::Group>(Section.get()));
>      break;
> +  case ELF::SHT_NOBITS:
> +    if (!IO.outputting())
> +      Section.reset(new ELFYAML::NoBitsSection());
> +    sectionMapping(IO, *cast<ELFYAML::NoBitsSection>(Section.get()));
> +    break;
>    case ELF::SHT_MIPS_ABIFLAGS:
>      if (!IO.outputting())
>        Section.reset(new ELFYAML::MipsABIFlags());
>
> Modified: llvm/trunk/test/Object/obj2yaml.test
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/obj2yaml.test?rev=241350&r1=241349&r2=241350&view=diff
> ==============================================================================
> --- llvm/trunk/test/Object/obj2yaml.test (original)
> +++ llvm/trunk/test/Object/obj2yaml.test Fri Jul  3 09:07:06 2015
> @@ -234,7 +234,7 @@ ELF-MIPSEL-NEXT:   - Name:            .b
>  ELF-MIPSEL-NEXT:     Type:            SHT_NOBITS
>  ELF-MIPSEL-NEXT:     Flags:           [ SHF_WRITE, SHF_ALLOC ]
>  ELF-MIPSEL-NEXT:     AddressAlign:    0x0000000000000004
> -ELF-MIPSEL-NEXT:     Content:         48656C6C
> +ELF-MIPSEL-NEXT:     Size:            0x0000000000000004
>  ELF-MIPSEL-NEXT:   - Name:            .mdebug.abi32
>  ELF-MIPSEL-NEXT:     Type:            SHT_PROGBITS
>  ELF-MIPSEL-NEXT:     AddressAlign:    0x0000000000000001
> @@ -324,7 +324,7 @@ ELF-MIPS64EL-NEXT:   - Name:
>  ELF-MIPS64EL-NEXT:     Type:            SHT_NOBITS
>  ELF-MIPS64EL-NEXT:     Flags:           [ SHF_WRITE, SHF_ALLOC ]
>  ELF-MIPS64EL-NEXT:     AddressAlign:    0x0000000000000010
> -ELF-MIPS64EL-NEXT:     Content:         ''
> +ELF-MIPS64EL-NEXT:     Size:            0x0000000000000000
>  ELF-MIPS64EL-NEXT:   - Name:            .MIPS.options
>  ELF-MIPS64EL-NEXT:     Type:            SHT_MIPS_OPTIONS
>  ELF-MIPS64EL-NEXT:     Flags:           [ SHF_ALLOC ]
>
> Modified: llvm/trunk/test/Object/yaml2obj-elf-rel-noref.yaml
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/yaml2obj-elf-rel-noref.yaml?rev=241350&r1=241349&r2=241350&view=diff
> ==============================================================================
> --- llvm/trunk/test/Object/yaml2obj-elf-rel-noref.yaml (original)
> +++ llvm/trunk/test/Object/yaml2obj-elf-rel-noref.yaml Fri Jul  3 09:07:06 2015
> @@ -32,7 +32,7 @@ Sections:
>      Type:            SHT_NOBITS
>      Flags:           [ SHF_WRITE, SHF_ALLOC ]
>      AddressAlign:    0x0000000000000001
> -    Content:         ''
> +    Size:            0
>    - Name:            .ARM.attributes
>      Type:            SHT_ARM_ATTRIBUTES
>      AddressAlign:    0x0000000000000001
>
> Modified: llvm/trunk/tools/obj2yaml/elf2yaml.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/obj2yaml/elf2yaml.cpp?rev=241350&r1=241349&r2=241350&view=diff
> ==============================================================================
> --- llvm/trunk/tools/obj2yaml/elf2yaml.cpp (original)
> +++ llvm/trunk/tools/obj2yaml/elf2yaml.cpp Fri Jul  3 09:07:06 2015
> @@ -40,6 +40,7 @@ class ELFDumper {
>    ErrorOr<ELFYAML::RelocationSection *> dumpRelaSection(const Elf_Shdr *Shdr);
>    ErrorOr<ELFYAML::RawContentSection *>
>    dumpContentSection(const Elf_Shdr *Shdr);
> +  ErrorOr<ELFYAML::NoBitsSection *> dumpNoBitsSection(const Elf_Shdr *Shdr);
>    ErrorOr<ELFYAML::Group *> dumpGroup(const Elf_Shdr *Shdr);
>    ErrorOr<ELFYAML::MipsABIFlags *> dumpMipsABIFlags(const Elf_Shdr *Shdr);
>
> @@ -104,6 +105,13 @@ ErrorOr<ELFYAML::Object *> ELFDumper<ELF
>        Y->Sections.push_back(std::unique_ptr<ELFYAML::Section>(G.get()));
>        break;
>      }
> +    case ELF::SHT_NOBITS: {
> +      ErrorOr<ELFYAML::NoBitsSection *> S = dumpNoBitsSection(&Sec);
> +      if (std::error_code EC = S.getError())
> +        return EC;
> +      Y->Sections.push_back(std::unique_ptr<ELFYAML::Section>(S.get()));
> +      break;
> +    }
>      default: {
>        ErrorOr<ELFYAML::RawContentSection *> S = dumpContentSection(&Sec);
>        if (std::error_code EC = S.getError())
> @@ -303,6 +311,18 @@ ELFDumper<ELFT>::dumpContentSection(cons
>
>    return S.release();
>  }
> +
> +template <class ELFT>
> +ErrorOr<ELFYAML::NoBitsSection *>
> +ELFDumper<ELFT>::dumpNoBitsSection(const Elf_Shdr *Shdr) {
> +  auto S = make_unique<ELFYAML::NoBitsSection>();
> +
> +  if (std::error_code EC = dumpCommonSection(Shdr, *S))
> +    return EC;
> +  S->Size = Shdr->sh_size;
> +
> +  return S.release();
> +}
>
>  template <class ELFT>
>  ErrorOr<ELFYAML::Group *> ELFDumper<ELFT>::dumpGroup(const Elf_Shdr *Shdr) {
>
> Modified: llvm/trunk/tools/yaml2obj/yaml2elf.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/yaml2obj/yaml2elf.cpp?rev=241350&r1=241349&r2=241350&view=diff
> ==============================================================================
> --- llvm/trunk/tools/yaml2obj/yaml2elf.cpp (original)
> +++ llvm/trunk/tools/yaml2obj/yaml2elf.cpp Fri Jul  3 09:07:06 2015
> @@ -241,6 +241,8 @@ bool ELFState<ELFT>::initSectionHeaders(
>      } else if (auto S = dyn_cast<ELFYAML::MipsABIFlags>(Sec.get())) {
>        if (!writeSectionContent(SHeader, *S, CBA))
>          return false;
> +    } else if (isa<ELFYAML::NoBitsSection>(Sec.get())) {
> +      // SHT_NOBITS section does not have content so nothing to do here.
>      } else
>        llvm_unreachable("Unknown section type");
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits



More information about the llvm-commits mailing list