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 @@ -221,6 +221,7 @@ ECase(EM_LANAI); ECase(EM_BPF); #undef ECase + IO.enumFallback(Value); } void ScalarEnumerationTraits::enumeration( diff --git a/llvm/test/tools/obj2yaml/elf-emachine.yaml b/llvm/test/tools/obj2yaml/elf-emachine.yaml new file mode 100644 --- /dev/null +++ b/llvm/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/llvm/test/tools/yaml2obj/elf-emachine.yaml b/llvm/test/tools/yaml2obj/elf-emachine.yaml new file mode 100644 --- /dev/null +++ b/llvm/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