From 5290af8ad9ad8f5258305a11ca82936504fe5f42 Mon Sep 17 00:00:00 2001 From: George Rimar Date: Wed, 15 Aug 2018 11:43:00 +0000 Subject: [PATCH] [yaml2obj] - Teach tool to produce SHT_GROUP section with a custom type. Currently, it is possible to use yaml2obj for producing SHT_GROUP sections of type GRP_COMDAT. For LLD test case I need to produce an object with a broken (different from GRP_COMDAT) type. The patch teaches tool to do such things. Differential revision: https://reviews.llvm.org/D50761 llvm-svn: 339764 --- llvm/test/tools/yaml2obj/elf-comdat-broken.yaml | 34 +++++++++++++++++++++++++ llvm/tools/yaml2obj/yaml2elf.cpp | 3 ++- 2 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 llvm/test/tools/yaml2obj/elf-comdat-broken.yaml diff --git a/llvm/test/tools/yaml2obj/elf-comdat-broken.yaml b/llvm/test/tools/yaml2obj/elf-comdat-broken.yaml new file mode 100644 index 0000000..14b4d53 --- /dev/null +++ b/llvm/test/tools/yaml2obj/elf-comdat-broken.yaml @@ -0,0 +1,34 @@ +# RUN: yaml2obj %s -o %t +# RUN: llvm-readobj -sections -elf-section-groups %t | FileCheck %s + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .group + Type: SHT_GROUP + Link: .symtab + Info: foo + Members: + - SectionOrType: 0xFF + - SectionOrType: 3 +Symbols: + Global: + - Name: foo + +## Check we are able to produce SHT_GROUP section with a custom Type (0xFF). +# CHECK: Groups { +# CHECK-NEXT: Group { +# CHECK-NEXT: Name: .group +# CHECK-NEXT: Index: 1 +# CHECK-NEXT: Link: 2 +# CHECK-NEXT: Info: 1 +# CHECK-NEXT: Type: COMDAT (0xFF) +# CHECK-NEXT: Signature: foo +# CHECK-NEXT: Section(s) in group [ +# CHECK-NEXT: .strtab (3) +# CHECK-NEXT: ] +# CHECK-NEXT: } diff --git a/llvm/tools/yaml2obj/yaml2elf.cpp b/llvm/tools/yaml2obj/yaml2elf.cpp index 18f8a27..ccf1bc8 100644 --- a/llvm/tools/yaml2obj/yaml2elf.cpp +++ b/llvm/tools/yaml2obj/yaml2elf.cpp @@ -537,7 +537,8 @@ bool ELFState::writeSectionContent(Elf_Shdr &SHeader, unsigned int sectionIndex = 0; if (member.sectionNameOrType == "GRP_COMDAT") sectionIndex = llvm::ELF::GRP_COMDAT; - else if (SN2I.lookup(member.sectionNameOrType, sectionIndex)) { + else if (SN2I.lookup(member.sectionNameOrType, sectionIndex) && + !to_integer(member.sectionNameOrType, sectionIndex)) { WithColor::error() << "Unknown section referenced: '" << member.sectionNameOrType << "' at YAML section' " << Section.Name << "\n"; -- 2.7.4