Index: llvm/include/llvm/Object/COFF.h =================================================================== --- llvm/include/llvm/Object/COFF.h +++ llvm/include/llvm/Object/COFF.h @@ -745,12 +745,18 @@ support::ulittle32_t AuxiliaryIATCopy; }; +enum chpe_range_type { Arm64 = 0, Arm64EC = 1, Amd64 = 2 }; + struct chpe_range_entry { support::ulittle32_t StartOffset; support::ulittle32_t Length; -}; -enum chpe_range_type { CHPE_RANGE_ARM64, CHPE_RANGE_ARM64EC, CHPE_RANGE_AMD64 }; + // The two low bits of StartOffset contain a range type. + static constexpr uint32_t TypeMask = 3; + + uint32_t getStart() const { return StartOffset & ~TypeMask; } + uint16_t getType() const { return StartOffset & TypeMask; } +}; struct chpe_code_range_entry { support::ulittle32_t StartRva; Index: llvm/tools/llvm-readobj/COFFDumper.cpp =================================================================== --- llvm/tools/llvm-readobj/COFFDumper.cpp +++ llvm/tools/llvm-readobj/COFFDumper.cpp @@ -854,17 +854,17 @@ reportError(std::move(E), Obj->getFileName()); auto CodeMap = reinterpret_cast(CodeMapInt); for (uint32_t i = 0; i < CHPE->CodeMapCount; i++) { - uint32_t Start = CodeMap[i].StartOffset & ~3; + uint32_t Start = CodeMap[i].getStart(); W.startLine() << W.hex(Start) << " - " << W.hex(Start + CodeMap[i].Length) << " "; - switch (CodeMap[i].StartOffset & 3) { - case CHPE_RANGE_ARM64: + switch (CodeMap[i].getType()) { + case chpe_range_type::Arm64: W.getOStream() << "ARM64\n"; break; - case CHPE_RANGE_ARM64EC: + case chpe_range_type::Arm64EC: W.getOStream() << "ARM64EC\n"; break; - case CHPE_RANGE_AMD64: + case chpe_range_type::Amd64: W.getOStream() << "X64\n"; break; default: