From d81d97686138b93aceb1fd67ec956c465e1eb4c4 Mon Sep 17 00:00:00 2001 From: George Rimar Date: Tue, 17 Sep 2019 11:51:26 +0000 Subject: [PATCH] [yaml2obj/obj2yaml] - Allow setting an arbitrary values for e_machine. Currently we only allow using a known named constants for `Machine` field in YAML documents. This patch allows using any numbers (valid or "unknown") and adds test cases for current and new functionality. With this it is possible to write a test cases for really unknown EM_* targets. Differential revision: https://reviews.llvm.org/D67652 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@372108 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/ObjectYAML/ELFYAML.cpp | 1 + test/tools/obj2yaml/elf-emachine.yaml | 39 +++++++++++++++++++ test/tools/yaml2obj/elf-emachine.yaml | 55 +++++++++++++++++++++++++++ 3 files changed, 95 insertions(+) create mode 100644 test/tools/obj2yaml/elf-emachine.yaml create mode 100644 test/tools/yaml2obj/elf-emachine.yaml diff --git a/lib/ObjectYAML/ELFYAML.cpp b/lib/ObjectYAML/ELFYAML.cpp index e7adb8fe4e0..940d5af94f6 100644 --- a/lib/ObjectYAML/ELFYAML.cpp +++ b/lib/ObjectYAML/ELFYAML.cpp @@ -221,6 +221,7 @@ void ScalarEnumerationTraits::enumeration( ECase(EM_LANAI); ECase(EM_BPF); #undef ECase + IO.enumFallback(Value); } void ScalarEnumerationTraits::enumeration( diff --git a/test/tools/obj2yaml/elf-emachine.yaml b/test/tools/obj2yaml/elf-emachine.yaml new file mode 100644 index 00000000000..d351505aa28 --- /dev/null +++ b/test/tools/obj2yaml/elf-emachine.yaml @@ -0,0 +1,39 @@ +## Check how obj2yaml dumps e_machine field. + +## Check it dumps an unknown e_machine as a number. + +# RUN: yaml2obj --docnum=1 %s -o %t1 +# RUN: obj2yaml %t1 | FileCheck %s --check-prefix=UNKNOWN + +# UNKNOWN: --- !ELF +# UNKNOWN-NEXT: FileHeader: +# UNKNOWN-NEXT: Class: ELFCLASS64 +# UNKNOWN-NEXT: Data: ELFDATA2MSB +# UNKNOWN-NEXT: Type: ET_REL +# UNKNOWN-NEXT: Machine: 0x1234 + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2MSB + Type: ET_REL + Machine: 0x1234 + +## Check it dumps a known e_machine value as an enum string. + +# RUN: yaml2obj --docnum=2 %s -o %t2 +# RUN: obj2yaml %t2 | FileCheck %s --check-prefix=KNOWN + +# KNOWN: --- !ELF +# KNOWN-NEXT: FileHeader: +# KNOWN-NEXT: Class: ELFCLASS64 +# KNOWN-NEXT: Data: ELFDATA2MSB +# KNOWN-NEXT: Type: ET_REL +# KNOWN-NEXT: Machine: EM_NONE + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2MSB + Type: ET_REL + Machine: 0 diff --git a/test/tools/yaml2obj/elf-emachine.yaml b/test/tools/yaml2obj/elf-emachine.yaml new file mode 100644 index 00000000000..206be42c7dc --- /dev/null +++ b/test/tools/yaml2obj/elf-emachine.yaml @@ -0,0 +1,55 @@ +## Test how the Machine YAML field can be used to set the e_machine ELF header field. + +## Test we can use an arbitrary value. + +# RUN: yaml2obj --docnum=1 %s -o %t1 +# RUN: llvm-readelf %t1 --file-headers | FileCheck %s --check-prefix=UNKNOWN + +# UNKNOWN: Machine: 1234 + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2MSB + Type: ET_REL + Machine: 0x1234 + +## Test we can't use a number that doesn't fit into 2 bytes. + +# RUN: not yaml2obj --docnum=2 %s 2>&1 | FileCheck %s --check-prefix=ERR + +# ERR: error: out of range hex16 number + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2MSB + Type: ET_REL + Machine: 0x12345 + +## Test we can use a known named constant. + +# RUN: yaml2obj --docnum=3 %s -o %t3 +# RUN: llvm-readelf %t3 --file-headers | FileCheck %s --check-prefix=NONE + +# NONE: Machine: None + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2MSB + Type: ET_REL + Machine: EM_NONE + +## Test we can't use an unknown string constant. + +# RUN: not yaml2obj --docnum=4 %s 2>&1 | FileCheck %s --check-prefix=ERR2 + +# ERR2: error: invalid hex16 number + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2MSB + Type: ET_REL + Machine: EM_UNKNOWN_FOO -- 2.50.1