From 97ff5985b54d9237d29365a63700496a6ef14948 Mon Sep 17 00:00:00 2001 From: George Rimar Date: Tue, 12 Feb 2019 09:08:59 +0000 Subject: [PATCH] [yaml2obj/obj2yaml] - Move `Info` field out from `Section` class. ELFYAML.h contains a `Section` class which is a base for a few other sections classes that are used for mapping different section types. `Section` has a `StringRef Info` field used for storing sh_info. At the same time, sh_info has very different meanings for sections and cannot be processed in a similar way generally, for example ELFDumper does not handle it in `dumpCommonSection` but do that in `dumpGroup` and `dumpCommonRelocationSection` respectively. At this moment, we have and handle it as a string, because that was possible for the current use case. But also it can simply be a number: For SHT_GNU_verdef is "The number of version definitions within the section." The patch moves `Info` field out to be able to have it as a number. With that change, each class will be able to decide what type and purpose of the sh_info field it wants to use. I also had to edit 2 test cases. This is because patch fixes a bug. Previously we accepted yaml files with Info fields for all sections (for example, for SHT_DYNSYM too). But we do not handle it and the resulting objects had zero sh_info fields set for such sections. Now it is accepted only for sections that supports it. Differential revision: https://reviews.llvm.org/D58054 llvm-svn: 353810 --- include/llvm/ObjectYAML/ELFYAML.h | 3 ++- lib/ObjectYAML/ELFYAML.cpp | 9 +++++---- test/tools/llvm-readobj/demangle.test | 1 - test/tools/llvm-readobj/gnu-hash-symbols.test | 1 - tools/obj2yaml/elf2yaml.cpp | 4 ++-- tools/yaml2obj/yaml2elf.cpp | 7 ++++--- 6 files changed, 13 insertions(+), 12 deletions(-) diff --git a/include/llvm/ObjectYAML/ELFYAML.h b/include/llvm/ObjectYAML/ELFYAML.h index 5eff7fc651e..e194e59a485 100644 --- a/include/llvm/ObjectYAML/ELFYAML.h +++ b/include/llvm/ObjectYAML/ELFYAML.h @@ -129,7 +129,6 @@ struct Section { ELF_SHF Flags; llvm::yaml::Hex64 Address; StringRef Link; - StringRef Info; llvm::yaml::Hex64 AddressAlign; Optional EntSize; @@ -172,6 +171,7 @@ struct Group : Section { // Members of a group contain a flag and a list of section indices // that are part of the group. std::vector Members; + StringRef Signature; /* Info */ Group() : Section(SectionKind::Group) {} @@ -189,6 +189,7 @@ struct Relocation { struct RelocationSection : Section { std::vector Relocations; + StringRef RelocatableSec; /* Info */ RelocationSection() : Section(SectionKind::Relocation) {} diff --git a/lib/ObjectYAML/ELFYAML.cpp b/lib/ObjectYAML/ELFYAML.cpp index 339f080337a..cec56771e1d 100644 --- a/lib/ObjectYAML/ELFYAML.cpp +++ b/lib/ObjectYAML/ELFYAML.cpp @@ -854,7 +854,6 @@ static void commonSectionMapping(IO &IO, ELFYAML::Section &Section) { IO.mapOptional("Link", Section.Link, StringRef()); IO.mapOptional("AddressAlign", Section.AddressAlign, Hex64(0)); IO.mapOptional("EntSize", Section.EntSize); - IO.mapOptional("Info", Section.Info, StringRef()); } static void sectionMapping(IO &IO, ELFYAML::DynamicSection &Section) { @@ -875,12 +874,14 @@ static void sectionMapping(IO &IO, ELFYAML::NoBitsSection &Section) { static void sectionMapping(IO &IO, ELFYAML::RelocationSection &Section) { commonSectionMapping(IO, Section); + IO.mapOptional("Info", Section.RelocatableSec, StringRef()); IO.mapOptional("Relocations", Section.Relocations); } -static void groupSectionMapping(IO &IO, ELFYAML::Group &group) { - commonSectionMapping(IO, group); - IO.mapRequired("Members", group.Members); +static void groupSectionMapping(IO &IO, ELFYAML::Group &Group) { + commonSectionMapping(IO, Group); + IO.mapOptional("Info", Group.Signature, StringRef()); + IO.mapRequired("Members", Group.Members); } void MappingTraits::mapping( diff --git a/test/tools/llvm-readobj/demangle.test b/test/tools/llvm-readobj/demangle.test index edac38e18f2..809a7243edf 100644 --- a/test/tools/llvm-readobj/demangle.test +++ b/test/tools/llvm-readobj/demangle.test @@ -133,7 +133,6 @@ Sections: Type: SHT_DYNSYM Flags: [ SHF_ALLOC ] Link: .dynstr - Info: 1 Address: 0x100 AddressAlign: 0x100 EntSize: 0x18 diff --git a/test/tools/llvm-readobj/gnu-hash-symbols.test b/test/tools/llvm-readobj/gnu-hash-symbols.test index 79e58a91619..8babac599c3 100644 --- a/test/tools/llvm-readobj/gnu-hash-symbols.test +++ b/test/tools/llvm-readobj/gnu-hash-symbols.test @@ -63,7 +63,6 @@ Sections: Type: SHT_DYNSYM Flags: [ SHF_ALLOC ] Link: .dynstr - Info: 1 Address: 0x100 AddressAlign: 0x100 EntSize: 0x18 diff --git a/tools/obj2yaml/elf2yaml.cpp b/tools/obj2yaml/elf2yaml.cpp index a089890e9a3..a3fe811b9d5 100644 --- a/tools/obj2yaml/elf2yaml.cpp +++ b/tools/obj2yaml/elf2yaml.cpp @@ -354,7 +354,7 @@ ELFDumper::dumpCommonRelocationSection(const Elf_Shdr *Shdr, auto NameOrErr = getUniquedSectionName(*InfoSection); if (!NameOrErr) return errorToErrorCode(NameOrErr.takeError()); - S.Info = NameOrErr.get(); + S.RelocatableSec = NameOrErr.get(); return obj2yaml_error::success; } @@ -468,7 +468,7 @@ ErrorOr ELFDumper::dumpGroup(const Elf_Shdr *Shdr) { Expected symbolName = getSymbolName(symbol, StrTab, Symtab); if (!symbolName) return errorToErrorCode(symbolName.takeError()); - S->Info = *symbolName; + S->Signature = *symbolName; const Elf_Word *groupMembers = reinterpret_cast(sectionContents->data()); const long count = (Shdr->sh_size) / sizeof(Elf_Word); diff --git a/tools/yaml2obj/yaml2elf.cpp b/tools/yaml2obj/yaml2elf.cpp index c904523f4c9..5198a751cfb 100644 --- a/tools/yaml2obj/yaml2elf.cpp +++ b/tools/yaml2obj/yaml2elf.cpp @@ -270,15 +270,16 @@ bool ELFState::initSectionHeaders(std::vector &SHeaders, SHeader.sh_link = getDotSymTabSecNo(); unsigned Index; - if (!convertSectionIndex(SN2I, S->Name, S->Info, Index)) + if (!convertSectionIndex(SN2I, S->Name, S->RelocatableSec, Index)) return false; SHeader.sh_info = Index; if (!writeSectionContent(SHeader, *S, CBA)) return false; } else if (auto S = dyn_cast(Sec.get())) { unsigned SymIdx; - if (SymN2I.lookup(S->Info, SymIdx) && !to_integer(S->Info, SymIdx)) { - WithColor::error() << "Unknown symbol referenced: '" << S->Info + if (SymN2I.lookup(S->Signature, SymIdx) && + !to_integer(S->Signature, SymIdx)) { + WithColor::error() << "Unknown symbol referenced: '" << S->Signature << "' at YAML section '" << S->Name << "'.\n"; return false; }