From 05d8d6405ef10a81c3d2bc9da53665221a8a9f1b Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Fri, 7 Apr 2023 23:31:16 +0200 Subject: [llvm-readobj] Add support for dumping CHPE metadata. CHPE metadata is used by ARM64EC/ARM64X PE files to provide metadata for emulator/loader. Most of this metadata will need to be generated by LLD. Differential Revision: https://reviews.llvm.org/D149089 --- llvm/lib/Object/COFFObjectFile.cpp | 48 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) (limited to 'llvm/lib/Object/COFFObjectFile.cpp') diff --git a/llvm/lib/Object/COFFObjectFile.cpp b/llvm/lib/Object/COFFObjectFile.cpp index 1b7ab45..08eb0d0 100644 --- a/llvm/lib/Object/COFFObjectFile.cpp +++ b/llvm/lib/Object/COFFObjectFile.cpp @@ -753,6 +753,54 @@ Error COFFObjectFile::initLoadConfigPtr() { return E; LoadConfig = (const void *)IntPtr; + + if (is64()) { + auto Config = getLoadConfig64(); + if (Config->Size >= + offsetof(coff_load_configuration64, CHPEMetadataPointer) + + sizeof(Config->CHPEMetadataPointer) && + Config->CHPEMetadataPointer) { + uint64_t ChpeOff = Config->CHPEMetadataPointer; + if (Error E = + getRvaPtr(ChpeOff - getImageBase(), IntPtr, "CHPE metadata")) + return E; + if (Error E = checkOffset(Data, IntPtr, sizeof(CHPEMetadata))) + return E; + + CHPEMetadata = reinterpret_cast(IntPtr); + + // Validate CHPE metadata + if (CHPEMetadata->CodeMapCount) { + if (Error E = getRvaPtr(CHPEMetadata->CodeMap, IntPtr, "CHPE code map")) + return E; + if (Error E = checkOffset(Data, IntPtr, + CHPEMetadata->CodeMapCount * + sizeof(chpe_range_entry))) + return E; + } + + if (CHPEMetadata->CodeRangesToEntryPointsCount) { + if (Error E = getRvaPtr(CHPEMetadata->CodeRangesToEntryPoints, IntPtr, + "CHPE entry point ranges")) + return E; + if (Error E = checkOffset(Data, IntPtr, + CHPEMetadata->CodeRangesToEntryPointsCount * + sizeof(chpe_code_range_entry))) + return E; + } + + if (CHPEMetadata->RedirectionMetadataCount) { + if (Error E = getRvaPtr(CHPEMetadata->RedirectionMetadata, IntPtr, + "CHPE redirection metadata")) + return E; + if (Error E = checkOffset(Data, IntPtr, + CHPEMetadata->RedirectionMetadataCount * + sizeof(chpe_redirection_entry))) + return E; + } + } + } + return Error::success(); } -- cgit v1.1