diff --git a/llvm/include/llvm/Object/WindowsMachineFlag.h b/llvm/include/llvm/Object/WindowsMachineFlag.h index 1cb408ed13d42..ce5b356f8bfee 100644 --- a/llvm/include/llvm/Object/WindowsMachineFlag.h +++ b/llvm/include/llvm/Object/WindowsMachineFlag.h @@ -43,6 +43,8 @@ template Triple::ArchType getMachineArchType(T machine) { case COFF::IMAGE_FILE_MACHINE_ARM64EC: case COFF::IMAGE_FILE_MACHINE_ARM64X: return llvm::Triple::ArchType::aarch64; + case COFF::IMAGE_FILE_MACHINE_R4000: + return llvm::Triple::ArchType::mipsel; default: return llvm::Triple::ArchType::UnknownArch; } diff --git a/llvm/include/llvm/ObjectYAML/COFFYAML.h b/llvm/include/llvm/ObjectYAML/COFFYAML.h index 2f9a1aae0eb05..c22d4e7f0b29d 100644 --- a/llvm/include/llvm/ObjectYAML/COFFYAML.h +++ b/llvm/include/llvm/ObjectYAML/COFFYAML.h @@ -179,6 +179,10 @@ struct ScalarEnumerationTraits { static void enumeration(IO &IO, COFF::RelocationTypeAMD64 &Value); }; +template <> struct ScalarEnumerationTraits { + static void enumeration(IO &IO, COFF::RelocationTypesMips &Value); +}; + template <> struct ScalarEnumerationTraits { static void enumeration(IO &IO, COFF::RelocationTypesARM &Value); diff --git a/llvm/lib/Object/COFFObjectFile.cpp b/llvm/lib/Object/COFFObjectFile.cpp index 7f21be25b68c8..242c123665f76 100644 --- a/llvm/lib/Object/COFFObjectFile.cpp +++ b/llvm/lib/Object/COFFObjectFile.cpp @@ -1132,6 +1132,8 @@ StringRef COFFObjectFile::getFileFormatName() const { return "COFF-ARM64EC"; case COFF::IMAGE_FILE_MACHINE_ARM64X: return "COFF-ARM64X"; + case COFF::IMAGE_FILE_MACHINE_R4000: + return "COFF-MIPS"; default: return "COFF-"; } diff --git a/llvm/lib/ObjectYAML/COFFYAML.cpp b/llvm/lib/ObjectYAML/COFFYAML.cpp index e14e1b5e467b4..53ea40a0354ce 100644 --- a/llvm/lib/ObjectYAML/COFFYAML.cpp +++ b/llvm/lib/ObjectYAML/COFFYAML.cpp @@ -183,6 +183,25 @@ void ScalarEnumerationTraits::enumeration( ECase(IMAGE_REL_AMD64_SSPAN32); } +void ScalarEnumerationTraits::enumeration( + IO &IO, COFF::RelocationTypesMips &Value) { + ECase(IMAGE_REL_MIPS_ABSOLUTE); + ECase(IMAGE_REL_MIPS_REFHALF); + ECase(IMAGE_REL_MIPS_REFWORD); + ECase(IMAGE_REL_MIPS_JMPADDR); + ECase(IMAGE_REL_MIPS_REFHI); + ECase(IMAGE_REL_MIPS_REFLO); + ECase(IMAGE_REL_MIPS_GPREL); + ECase(IMAGE_REL_MIPS_LITERAL); + ECase(IMAGE_REL_MIPS_SECTION); + ECase(IMAGE_REL_MIPS_SECREL); + ECase(IMAGE_REL_MIPS_SECRELLO); + ECase(IMAGE_REL_MIPS_SECRELHI); + ECase(IMAGE_REL_MIPS_JMPADDR16); + ECase(IMAGE_REL_MIPS_REFWORDNB); + ECase(IMAGE_REL_MIPS_PAIR); +} + void ScalarEnumerationTraits::enumeration( IO &IO, COFF::RelocationTypesARM &Value) { ECase(IMAGE_REL_ARM_ABSOLUTE); @@ -427,6 +446,10 @@ void MappingTraits::mapping(IO &IO, MappingNormalization, uint16_t> NT( IO, Rel.Type); IO.mapRequired("Type", NT->Type); + } else if (H.Machine == COFF::IMAGE_FILE_MACHINE_R4000) { + MappingNormalization, uint16_t> NT( + IO, Rel.Type); + IO.mapRequired("Type", NT->Type); } else if (H.Machine == COFF::IMAGE_FILE_MACHINE_ARMNT) { MappingNormalization, uint16_t> NT( IO, Rel.Type); diff --git a/llvm/test/tools/yaml2obj/COFF/basic-mips.yaml b/llvm/test/tools/yaml2obj/COFF/basic-mips.yaml new file mode 100644 index 0000000000000..4c5afd500f714 --- /dev/null +++ b/llvm/test/tools/yaml2obj/COFF/basic-mips.yaml @@ -0,0 +1,39 @@ +# RUN: yaml2obj %s -o %t +# RUN: llvm-readobj --file-headers --relocs %t | FileCheck %s +# RUN: obj2yaml %t | FileCheck %s --check-prefix=ROUNDTRIP + +# CHECK: Format: COFF-MIPS +# CHECK: Arch: mipsel +# CHECK: Machine: IMAGE_FILE_MACHINE_R4000 (0x166) +# CHECK: Relocations [ +# CHECK: Section (1) .text { +# CHECK: 0x4 IMAGE_REL_MIPS_JMPADDR main (0) +# CHECK: } +# CHECK: ] + +# ROUNDTRIP: Machine: IMAGE_FILE_MACHINE_R4000 +# ROUNDTRIP: Relocations: +# ROUNDTRIP-NEXT: - VirtualAddress: 4 +# ROUNDTRIP-NEXT: SymbolName: main +# ROUNDTRIP-NEXT: Type: IMAGE_REL_MIPS_JMPADDR + +--- !COFF +header: + Machine: IMAGE_FILE_MACHINE_R4000 +sections: + - Name: .text + Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ] + VirtualSize: 12 + SectionData: 000000000000000C00000000 + Relocations: + - VirtualAddress: 4 + SymbolName: main + Type: IMAGE_REL_MIPS_JMPADDR +symbols: + - Name: main + Value: 0 + SectionNumber: 1 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_NULL + StorageClass: IMAGE_SYM_CLASS_EXTERNAL +...