From 65a6828b1708b03f59058199fdf380b4bc7c5bf0 Mon Sep 17 00:00:00 2001 From: George Rimar Date: Tue, 7 Aug 2018 08:11:38 +0000 Subject: [PATCH] [yaml2obj] - Add a support for changing EntSize. I was trying to add a test case for LLD and found that it is impossible to set sh_entsize via yaml. The patch implements the missing part. Differential revision: https://reviews.llvm.org/D50235 llvm-svn: 339113 --- llvm/include/llvm/ObjectYAML/ELFYAML.h | 1 + llvm/lib/ObjectYAML/ELFYAML.cpp | 1 + llvm/test/tools/yaml2obj/elf-ent-size.yaml | 50 ++++++++++++++++++++++ llvm/tools/yaml2obj/yaml2elf.cpp | 4 +- 4 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 llvm/test/tools/yaml2obj/elf-ent-size.yaml diff --git a/llvm/include/llvm/ObjectYAML/ELFYAML.h b/llvm/include/llvm/ObjectYAML/ELFYAML.h index 6fc69735f1c7..92081f065dce 100644 --- a/llvm/include/llvm/ObjectYAML/ELFYAML.h +++ b/llvm/include/llvm/ObjectYAML/ELFYAML.h @@ -123,6 +123,7 @@ struct Section { StringRef Link; StringRef Info; llvm::yaml::Hex64 AddressAlign; + Optional EntSize; Section(SectionKind Kind) : Kind(Kind) {} virtual ~Section(); diff --git a/llvm/lib/ObjectYAML/ELFYAML.cpp b/llvm/lib/ObjectYAML/ELFYAML.cpp index f916b5d5f392..a381a63d6006 100644 --- a/llvm/lib/ObjectYAML/ELFYAML.cpp +++ b/llvm/lib/ObjectYAML/ELFYAML.cpp @@ -816,6 +816,7 @@ static void commonSectionMapping(IO &IO, ELFYAML::Section &Section) { IO.mapOptional("Address", Section.Address, Hex64(0)); IO.mapOptional("Link", Section.Link, StringRef()); IO.mapOptional("AddressAlign", Section.AddressAlign, Hex64(0)); + IO.mapOptional("EntSize", Section.EntSize); IO.mapOptional("Info", Section.Info, StringRef()); } diff --git a/llvm/test/tools/yaml2obj/elf-ent-size.yaml b/llvm/test/tools/yaml2obj/elf-ent-size.yaml new file mode 100644 index 000000000000..bb26b0467223 --- /dev/null +++ b/llvm/test/tools/yaml2obj/elf-ent-size.yaml @@ -0,0 +1,50 @@ +# RUN: yaml2obj %s -o %t +# RUN: llvm-readobj -sections %t | FileCheck %s + +!ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_FREEBSD + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Type: SHT_PROGBITS + Name: .strings + Flags: [ SHF_ALLOC, SHF_MERGE, SHF_STRINGS ] + AddressAlign: 0x04 + Content: "FFFFFFFFFFFFFFFF" + EntSize: 0x1 + - Name: .mydynamic + Type: SHT_DYNAMIC + EntSize: 0x0 + + +## Check we were able to set entry size for .strings and .mydynamic +# CHECK: Name: .strings +# CHECK-NEXT: Type: SHT_PROGBITS +# CHECK-NEXT: Flags [ +# CHECK-NEXT: SHF_ALLOC +# CHECK-NEXT: SHF_MERGE +# CHECK-NEXT: SHF_STRINGS +# CHECK-NEXT: ] +# CHECK-NEXT: Address: +# CHECK-NEXT: Offset: +# CHECK-NEXT: Size: +# CHECK-NEXT: Link: +# CHECK-NEXT: Info: +# CHECK-NEXT: AddressAlignment: +# CHECK-NEXT: EntrySize: 1 +# CHECK-NEXT: } +# CHECK: Name: .mydynamic +# CHECK-NEXT: Type: SHT_DYNAMIC +# CHECK-NEXT: Flags [ +# CHECK-NEXT: ] +# CHECK-NEXT: Address: +# CHECK-NEXT: Offset: +# CHECK-NEXT: Size: +# CHECK-NEXT: Link: +# CHECK-NEXT: Info: +# CHECK-NEXT: AddressAlignment: +# CHECK-NEXT: EntrySize: 0 +# CHECK-NEXT: } diff --git a/llvm/tools/yaml2obj/yaml2elf.cpp b/llvm/tools/yaml2obj/yaml2elf.cpp index 7ca5ac206c9e..18f8a271d1b2 100644 --- a/llvm/tools/yaml2obj/yaml2elf.cpp +++ b/llvm/tools/yaml2obj/yaml2elf.cpp @@ -461,7 +461,9 @@ ELFState::writeSectionContent(Elf_Shdr &SHeader, Section.Content.writeAsBinary(OS); for (auto i = Section.Content.binary_size(); i < Section.Size; ++i) OS.write(0); - if (Section.Type == llvm::ELF::SHT_RELR) + if (Section.EntSize) + SHeader.sh_entsize = *Section.EntSize; + else if (Section.Type == llvm::ELF::SHT_RELR) SHeader.sh_entsize = sizeof(Elf_Relr); else if (Section.Type == llvm::ELF::SHT_DYNAMIC) SHeader.sh_entsize = sizeof(Elf_Dyn); -- GitLab