diff --git a/llvm/lib/ObjectYAML/ELFYAML.cpp b/llvm/lib/ObjectYAML/ELFYAML.cpp --- a/llvm/lib/ObjectYAML/ELFYAML.cpp +++ b/llvm/lib/ObjectYAML/ELFYAML.cpp @@ -232,8 +232,9 @@ void ScalarEnumerationTraits::enumeration( IO &IO, ELFYAML::ELF_ELFDATA &Value) { #define ECase(X) IO.enumCase(Value, #X, ELF::X) - // Since the semantics of ELFDATANONE is "invalid", just don't accept it - // here. + // ELFDATANONE is an invalid data encoding, but we accept it because + // we want to be able to produce invalid binaries for the tests. + ECase(ELFDATANONE); ECase(ELFDATA2LSB); ECase(ELFDATA2MSB); #undef ECase diff --git a/llvm/test/tools/yaml2obj/elf-header-elfdatanone.yaml b/llvm/test/tools/yaml2obj/elf-header-elfdatanone.yaml new file mode 100644 --- /dev/null +++ b/llvm/test/tools/yaml2obj/elf-header-elfdatanone.yaml @@ -0,0 +1,15 @@ +## We have a YAML file describing an invalid data type. +## Check we are able to produce the invalid binary. + +# RUN: yaml2obj %s -o %t.o + +## Check that EI_DATA field is ELFDATANONE(0) +# RUN: od -b %t.o +5 | FileCheck %s +# CHECK: 0000005 000 + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATANONE + Type: ET_REL + Machine: EM_X86_64 diff --git a/llvm/tools/yaml2obj/yaml2elf.cpp b/llvm/tools/yaml2obj/yaml2elf.cpp --- a/llvm/tools/yaml2obj/yaml2elf.cpp +++ b/llvm/tools/yaml2obj/yaml2elf.cpp @@ -207,8 +207,7 @@ Header.e_ident[EI_MAG2] = 'L'; Header.e_ident[EI_MAG3] = 'F'; Header.e_ident[EI_CLASS] = ELFT::Is64Bits ? ELFCLASS64 : ELFCLASS32; - bool IsLittleEndian = ELFT::TargetEndianness == support::little; - Header.e_ident[EI_DATA] = IsLittleEndian ? ELFDATA2LSB : ELFDATA2MSB; + Header.e_ident[EI_DATA] = Doc.Header.Data; Header.e_ident[EI_VERSION] = EV_CURRENT; Header.e_ident[EI_OSABI] = Doc.Header.OSABI; Header.e_ident[EI_ABIVERSION] = Doc.Header.ABIVersion;