diff --git a/llvm/include/llvm/BinaryFormat/COFF.h b/llvm/include/llvm/BinaryFormat/COFF.h --- a/llvm/include/llvm/BinaryFormat/COFF.h +++ b/llvm/include/llvm/BinaryFormat/COFF.h @@ -98,6 +98,7 @@ IMAGE_FILE_MACHINE_ARM = 0x1C0, IMAGE_FILE_MACHINE_ARMNT = 0x1C4, IMAGE_FILE_MACHINE_ARM64 = 0xAA64, + IMAGE_FILE_MACHINE_ARM64EC = 0xA641, IMAGE_FILE_MACHINE_EBC = 0xEBC, IMAGE_FILE_MACHINE_I386 = 0x14C, IMAGE_FILE_MACHINE_IA64 = 0x200, diff --git a/llvm/lib/BinaryFormat/Magic.cpp b/llvm/lib/BinaryFormat/Magic.cpp --- a/llvm/lib/BinaryFormat/Magic.cpp +++ b/llvm/lib/BinaryFormat/Magic.cpp @@ -231,6 +231,11 @@ return file_magic::dxcontainer_object; break; + case 0x41: // ARM64EC windows + if (Magic[1] == char(0xA6)) + return file_magic::coff_object; + break; + default: break; } diff --git a/llvm/lib/Object/COFFObjectFile.cpp b/llvm/lib/Object/COFFObjectFile.cpp --- a/llvm/lib/Object/COFFObjectFile.cpp +++ b/llvm/lib/Object/COFFObjectFile.cpp @@ -977,6 +977,8 @@ return "COFF-ARM"; case COFF::IMAGE_FILE_MACHINE_ARM64: return "COFF-ARM64"; + case COFF::IMAGE_FILE_MACHINE_ARM64EC: + return "COFF-ARM64EC"; default: return "COFF-"; } @@ -991,6 +993,7 @@ case COFF::IMAGE_FILE_MACHINE_ARMNT: return Triple::thumb; case COFF::IMAGE_FILE_MACHINE_ARM64: + case COFF::IMAGE_FILE_MACHINE_ARM64EC: return Triple::aarch64; default: return Triple::UnknownArch; @@ -1283,6 +1286,7 @@ } break; case COFF::IMAGE_FILE_MACHINE_ARM64: + case COFF::IMAGE_FILE_MACHINE_ARM64EC: switch (Type) { LLVM_COFF_SWITCH_RELOC_TYPE_NAME(IMAGE_REL_ARM64_ABSOLUTE); LLVM_COFF_SWITCH_RELOC_TYPE_NAME(IMAGE_REL_ARM64_ADDR32); @@ -1865,6 +1869,7 @@ RVAReloc = COFF::IMAGE_REL_ARM_ADDR32NB; break; case COFF::IMAGE_FILE_MACHINE_ARM64: + case COFF::IMAGE_FILE_MACHINE_ARM64EC: RVAReloc = COFF::IMAGE_REL_ARM64_ADDR32NB; break; default: diff --git a/llvm/lib/ObjectYAML/COFFYAML.cpp b/llvm/lib/ObjectYAML/COFFYAML.cpp --- a/llvm/lib/ObjectYAML/COFFYAML.cpp +++ b/llvm/lib/ObjectYAML/COFFYAML.cpp @@ -65,6 +65,7 @@ ECase(IMAGE_FILE_MACHINE_ARM); ECase(IMAGE_FILE_MACHINE_ARMNT); ECase(IMAGE_FILE_MACHINE_ARM64); + ECase(IMAGE_FILE_MACHINE_ARM64EC); ECase(IMAGE_FILE_MACHINE_EBC); ECase(IMAGE_FILE_MACHINE_I386); ECase(IMAGE_FILE_MACHINE_IA64); @@ -75,6 +76,9 @@ ECase(IMAGE_FILE_MACHINE_POWERPC); ECase(IMAGE_FILE_MACHINE_POWERPCFP); ECase(IMAGE_FILE_MACHINE_R4000); + ECase(IMAGE_FILE_MACHINE_RISCV32); + ECase(IMAGE_FILE_MACHINE_RISCV64); + ECase(IMAGE_FILE_MACHINE_RISCV128); ECase(IMAGE_FILE_MACHINE_SH3); ECase(IMAGE_FILE_MACHINE_SH3DSP); ECase(IMAGE_FILE_MACHINE_SH4); diff --git a/llvm/test/tools/llvm-readobj/COFF/arm64ec.yaml b/llvm/test/tools/llvm-readobj/COFF/arm64ec.yaml new file mode 100644 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/COFF/arm64ec.yaml @@ -0,0 +1,27 @@ +# RUN: yaml2obj < %s | llvm-readobj - --file-headers | FileCheck %s +# Check we can process a simple arm64ec file. +# CHECK: Format: COFF-ARM64EC +# CHECK: Machine: IMAGE_FILE_MACHINE_ARM64EC (0xA641) +--- !COFF +header: + Machine: IMAGE_FILE_MACHINE_ARM64EC + Characteristics: [ ] +sections: + - Name: .text + Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ] + Alignment: 4 + SectionData: '' +symbols: + - Name: .text + Value: 0 + SectionNumber: 1 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_NULL + StorageClass: IMAGE_SYM_CLASS_STATIC + SectionDefinition: + Length: 0 + NumberOfRelocations: 0 + NumberOfLinenumbers: 0 + CheckSum: 0 + Number: 1 +... diff --git a/llvm/tools/llvm-readobj/COFFDumper.cpp b/llvm/tools/llvm-readobj/COFFDumper.cpp --- a/llvm/tools/llvm-readobj/COFFDumper.cpp +++ b/llvm/tools/llvm-readobj/COFFDumper.cpp @@ -344,6 +344,7 @@ LLVM_READOBJ_ENUM_ENT(COFF, IMAGE_FILE_MACHINE_AMD64 ), LLVM_READOBJ_ENUM_ENT(COFF, IMAGE_FILE_MACHINE_ARM ), LLVM_READOBJ_ENUM_ENT(COFF, IMAGE_FILE_MACHINE_ARM64 ), + LLVM_READOBJ_ENUM_ENT(COFF, IMAGE_FILE_MACHINE_ARM64EC ), LLVM_READOBJ_ENUM_ENT(COFF, IMAGE_FILE_MACHINE_ARMNT ), LLVM_READOBJ_ENUM_ENT(COFF, IMAGE_FILE_MACHINE_EBC ), LLVM_READOBJ_ENUM_ENT(COFF, IMAGE_FILE_MACHINE_I386 ), @@ -1616,9 +1617,10 @@ break; } case COFF::IMAGE_FILE_MACHINE_ARM64: + case COFF::IMAGE_FILE_MACHINE_ARM64EC: case COFF::IMAGE_FILE_MACHINE_ARMNT: { - ARM::WinEH::Decoder Decoder(W, Obj->getMachine() == - COFF::IMAGE_FILE_MACHINE_ARM64); + ARM::WinEH::Decoder Decoder(W, Obj->getMachine() != + COFF::IMAGE_FILE_MACHINE_ARMNT); // TODO Propagate the error. consumeError(Decoder.dumpProcedureData(*Obj)); break;