Index: llvm/include/llvm/Object/COFF.h =================================================================== --- llvm/include/llvm/Object/COFF.h +++ llvm/include/llvm/Object/COFF.h @@ -888,8 +888,17 @@ } uint16_t getMachine() const { - if (COFFHeader) + if (COFFHeader) { + if (CHPEMetadata) { + switch (COFFHeader->Machine) { + case COFF::IMAGE_FILE_MACHINE_AMD64: + return COFF::IMAGE_FILE_MACHINE_ARM64EC; + case COFF::IMAGE_FILE_MACHINE_ARM64: + return COFF::IMAGE_FILE_MACHINE_ARM64X; + } + } return COFFHeader->Machine; + } if (COFFBigObjHeader) return COFFBigObjHeader->Machine; llvm_unreachable("no COFF header!"); Index: llvm/test/tools/llvm-objdump/COFF/arm64ec.yaml =================================================================== --- /dev/null +++ llvm/test/tools/llvm-objdump/COFF/arm64ec.yaml @@ -0,0 +1,80 @@ +# RUN: yaml2obj %s -o %t +# RUN: llvm-objdump -d %t | FileCheck -check-prefix=DISAS %s +# RUN: llvm-readobj --coff-load-config %t | FileCheck -check-prefix=CODEMAP %s + +# DISAS: file format coff-arm64ec +# DISAS: 180001000: 52800040 mov w0, #0x2 +# DISAS-NEXT: 180001004: d65f03c0 ret +# DISAS-NEXT: ... +# DISAS: 180002020: 528000a0 mov w0, #0x5 +# DISAS-NEXT: 180002024: d65f03c0 ret + +# CODEMAP: CodeMap [ +# CODEMAP-NEXT: 0x1000 - 0x1008 ARM64EC +# CODEMAP-NEXT: 0x1020 - 0x2007 X64 +# CODEMAP-NEXT: 0x2020 - 0x2028 ARM64EC +# CODEMAP-NEXT: ] + +--- !COFF +OptionalHeader: + ImageBase: 0x180000000 + SectionAlignment: 4096 + FileAlignment: 512 + DLLCharacteristics: [ ] + LoadConfigTable: + RelativeVirtualAddress: 0x3000 + Size: 320 +header: + Machine: IMAGE_FILE_MACHINE_AMD64 + Characteristics: [ IMAGE_FILE_EXECUTABLE_IMAGE, IMAGE_FILE_LARGE_ADDRESS_AWARE, IMAGE_FILE_DLL ] +sections: + - Name: .text + Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ] + VirtualAddress: 0x1000 + VirtualSize: 38 + SectionData: 40008052C0035FD6000000000000000000000000000000000000000000000000B803000000C3 + - Name: .test + Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ] + VirtualAddress: 0x2000 + VirtualSize: 40 + SectionData: B806000000C3CC00000000000000000000000000000000000000000000000000A0008052C0035FD6 + - Name: .rdata + Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ] + VirtualAddress: 0x3000 + VirtualSize: 328 + StructuredData: + - LoadConfig: + CHPEMetadataPointer: 0x180004000 + - Name: .data + Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ, IMAGE_SCN_MEM_WRITE ] + VirtualAddress: 0x4000 + VirtualSize: 112 + StructuredData: + - Uint32: 1 # Version + - Uint32: 0x4050 # CodeMap + - Uint32: 3 # CodeMapCount + - Uint32: 0 # CodeRangesToEntryPoints + - Uint32: 0 # RedirectionMetadata + - Uint32: 0 + - Uint32: 0 + - Uint32: 0 + - Uint32: 0 + - Uint32: 0 + - Uint32: 0 + - Uint32: 0 + - Uint32: 0 # CodeRangesToEntryPointsCount + - Uint32: 0 # RedirectionMetadataCount + - Uint32: 0 + - Uint32: 0 + - Uint32: 0 + - Uint32: 0 + - Uint32: 0 + - Uint32: 0 + - Uint32: 0x1001 # CodeMap[0] + - Uint32: 0x8 + - Uint32: 0x1022 # CodeMap[1] + - Uint32: 0x0fe7 + - Uint32: 0x2021 # CodeMap[2] + - Uint32: 0x8 +symbols: [] +... Index: llvm/test/tools/llvm-objdump/COFF/arm64x.yaml =================================================================== --- /dev/null +++ llvm/test/tools/llvm-objdump/COFF/arm64x.yaml @@ -0,0 +1,80 @@ +# RUN: yaml2obj %s -o %t +# RUN: llvm-objdump -d %t | FileCheck -check-prefix=DISAS %s +# RUN: llvm-readobj --coff-load-config %t | FileCheck -check-prefix=CODEMAP %s + +# DISAS: file format coff-arm64x +# DISAS: 180001000: 52800040 mov w0, #0x2 +# DISAS-NEXT: 180001004: d65f03c0 ret +# DISAS-NEXT: ... +# DISAS: 180002020: 528000a0 mov w0, #0x5 +# DISAS-NEXT: 180002024: d65f03c0 ret + +# CODEMAP: CodeMap [ +# CODEMAP-NEXT: 0x1000 - 0x1008 ARM64 +# CODEMAP-NEXT: 0x1020 - 0x2007 X64 +# CODEMAP-NEXT: 0x2020 - 0x2028 ARM64EC +# CODEMAP-NEXT: ] + +--- !COFF +OptionalHeader: + ImageBase: 0x180000000 + SectionAlignment: 4096 + FileAlignment: 512 + DLLCharacteristics: [ ] + LoadConfigTable: + RelativeVirtualAddress: 0x3000 + Size: 320 +header: + Machine: IMAGE_FILE_MACHINE_ARM64 + Characteristics: [ IMAGE_FILE_EXECUTABLE_IMAGE, IMAGE_FILE_LARGE_ADDRESS_AWARE, IMAGE_FILE_DLL ] +sections: + - Name: .text + Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ] + VirtualAddress: 0x1000 + VirtualSize: 38 + SectionData: 40008052C0035FD6000000000000000000000000000000000000000000000000B803000000C3 + - Name: .test + Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ] + VirtualAddress: 0x2000 + VirtualSize: 40 + SectionData: B806000000C3CC00000000000000000000000000000000000000000000000000A0008052C0035FD6 + - Name: .rdata + Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ] + VirtualAddress: 0x3000 + VirtualSize: 328 + StructuredData: + - LoadConfig: + CHPEMetadataPointer: 0x180004000 + - Name: .data + Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ, IMAGE_SCN_MEM_WRITE ] + VirtualAddress: 0x4000 + VirtualSize: 112 + StructuredData: + - Uint32: 1 # Version + - Uint32: 0x4050 # CodeMap + - Uint32: 3 # CodeMapCount + - Uint32: 0 # CodeRangesToEntryPoints + - Uint32: 0 # RedirectionMetadata + - Uint32: 0 + - Uint32: 0 + - Uint32: 0 + - Uint32: 0 + - Uint32: 0 + - Uint32: 0 + - Uint32: 0 + - Uint32: 0 # CodeRangesToEntryPointsCount + - Uint32: 0 # RedirectionMetadataCount + - Uint32: 0 + - Uint32: 0 + - Uint32: 0 + - Uint32: 0 + - Uint32: 0 + - Uint32: 0 + - Uint32: 0x1000 # CodeMap[0] + - Uint32: 0x8 + - Uint32: 0x1022 # CodeMap[1] + - Uint32: 0x0fe7 + - Uint32: 0x2021 # CodeMap[2] + - Uint32: 0x8 +symbols: [] +...