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

Simon Atanasyan simon at atanasyan.com
Fri Jul 3 07:50:45 PDT 2015


I'm working on fix for these tests.

On Fri, Jul 3, 2015 at 5:49 PM, Rafael EspĂ­ndola
<rafael.espindola at gmail.com> wrote:
> 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



-- 
Simon Atanasyan




More information about the llvm-commits mailing list