From 64002dd8fea4015890c8ebdd90015d49efa165ec Mon Sep 17 00:00:00 2001 From: George Rimar Date: Thu, 20 Dec 2018 10:43:49 +0000 Subject: [PATCH] [yaml2obj/obj2yaml] - Support dumping/parsing ABI version. These tools were assuming ABI version is 0, that is not always true. Patch teaches them to work with that field. Differential revision: https://reviews.llvm.org/D55884 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@349737 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/ObjectYAML/ELFYAML.h | 1 + lib/ObjectYAML/ELFYAML.cpp | 1 + test/tools/yaml2obj/elf-abiversion.yaml | 16 ++++++++++++++++ tools/obj2yaml/elf2yaml.cpp | 1 + tools/yaml2obj/yaml2elf.cpp | 2 +- 5 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 test/tools/yaml2obj/elf-abiversion.yaml diff --git a/include/llvm/ObjectYAML/ELFYAML.h b/include/llvm/ObjectYAML/ELFYAML.h index 92081f065dc..f2b0c35521f 100644 --- a/include/llvm/ObjectYAML/ELFYAML.h +++ b/include/llvm/ObjectYAML/ELFYAML.h @@ -68,6 +68,7 @@ struct FileHeader { ELF_ELFCLASS Class; ELF_ELFDATA Data; ELF_ELFOSABI OSABI; + llvm::yaml::Hex8 ABIVersion; ELF_ET Type; ELF_EM Machine; ELF_EF Flags; diff --git a/lib/ObjectYAML/ELFYAML.cpp b/lib/ObjectYAML/ELFYAML.cpp index b9f52432fc8..215d6bdd091 100644 --- a/lib/ObjectYAML/ELFYAML.cpp +++ b/lib/ObjectYAML/ELFYAML.cpp @@ -753,6 +753,7 @@ void MappingTraits::mapping(IO &IO, IO.mapRequired("Class", FileHdr.Class); IO.mapRequired("Data", FileHdr.Data); IO.mapOptional("OSABI", FileHdr.OSABI, ELFYAML::ELF_ELFOSABI(0)); + IO.mapOptional("ABIVersion", FileHdr.ABIVersion, Hex8(0)); IO.mapRequired("Type", FileHdr.Type); IO.mapRequired("Machine", FileHdr.Machine); IO.mapOptional("Flags", FileHdr.Flags, ELFYAML::ELF_EF(0)); diff --git a/test/tools/yaml2obj/elf-abiversion.yaml b/test/tools/yaml2obj/elf-abiversion.yaml new file mode 100644 index 00000000000..0f43e69828f --- /dev/null +++ b/test/tools/yaml2obj/elf-abiversion.yaml @@ -0,0 +1,16 @@ +# RUN: yaml2obj %s -o %t +# RUN: llvm-readobj -file-headers %t | FileCheck %s --check-prefix=FROMYAML +# RUN: obj2yaml %t | FileCheck %s --check-prefix=TOYAML + +## Check we are able to parse/emit the ABI version with yaml2obj/obj2yaml. + +# FROMYAML: ABIVersion: 5 +# TOYAML: ABIVersion: 0x05 + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 + ABIVersion: 0x05 diff --git a/tools/obj2yaml/elf2yaml.cpp b/tools/obj2yaml/elf2yaml.cpp index dea4d1b3182..48ecee02c4d 100644 --- a/tools/obj2yaml/elf2yaml.cpp +++ b/tools/obj2yaml/elf2yaml.cpp @@ -114,6 +114,7 @@ template ErrorOr ELFDumper::dump() { Y->Header.Class = ELFYAML::ELF_ELFCLASS(Obj.getHeader()->getFileClass()); Y->Header.Data = ELFYAML::ELF_ELFDATA(Obj.getHeader()->getDataEncoding()); Y->Header.OSABI = Obj.getHeader()->e_ident[ELF::EI_OSABI]; + Y->Header.ABIVersion = Obj.getHeader()->e_ident[ELF::EI_ABIVERSION]; Y->Header.Type = Obj.getHeader()->e_type; Y->Header.Machine = Obj.getHeader()->e_machine; Y->Header.Flags = Obj.getHeader()->e_flags; diff --git a/tools/yaml2obj/yaml2elf.cpp b/tools/yaml2obj/yaml2elf.cpp index 672d1540daf..5e23bc6f085 100644 --- a/tools/yaml2obj/yaml2elf.cpp +++ b/tools/yaml2obj/yaml2elf.cpp @@ -196,7 +196,7 @@ void ELFState::initELFHeader(Elf_Ehdr &Header) { Header.e_ident[EI_DATA] = IsLittleEndian ? ELFDATA2LSB : ELFDATA2MSB; Header.e_ident[EI_VERSION] = EV_CURRENT; Header.e_ident[EI_OSABI] = Doc.Header.OSABI; - Header.e_ident[EI_ABIVERSION] = 0; + Header.e_ident[EI_ABIVERSION] = Doc.Header.ABIVersion; Header.e_type = Doc.Header.Type; Header.e_machine = Doc.Header.Machine; Header.e_version = EV_CURRENT; -- 2.11.0