[PATCH] D149095: [llvm-objdump] Support CHPE code ranges in disassembler.

Jacek Caban via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Apr 24 13:09:54 PDT 2023


jacek created this revision.
jacek added reviewers: jhenderson, MaskRay.
Herald added a subscriber: zzheng.
Herald added a project: All.
jacek requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D149095

Files:
  lld/test/COFF/arm64ec.test
  llvm/tools/llvm-objdump/llvm-objdump.cpp


Index: llvm/tools/llvm-objdump/llvm-objdump.cpp
===================================================================
--- llvm/tools/llvm-objdump/llvm-objdump.cpp
+++ llvm/tools/llvm-objdump/llvm-objdump.cpp
@@ -1399,8 +1399,24 @@
                   SourcePrinter &SP, bool InlineRelocs) {
   DisassemblerTarget *DT = &PrimaryTarget;
   bool PrimaryIsThumb = false;
-  if (isArmElf(Obj))
-    PrimaryIsThumb = PrimaryTarget.SubtargetInfo->checkFeatures("+thumb-mode");
+  const chpe_range_entry *CodeMap;
+  uint32_t CodeMapCount = 0;
+
+  if (SecondaryTarget) {
+    if (isArmElf(Obj)) {
+      PrimaryIsThumb =
+          PrimaryTarget.SubtargetInfo->checkFeatures("+thumb-mode");
+    } else if (const COFFObjectFile *COFFObj = dyn_cast<COFFObjectFile>(&Obj)) {
+      const chpe_metadata *CHPEMetadata = COFFObj->getCHPEMetadata();
+      if (CHPEMetadata && CHPEMetadata->CodeMapCount) {
+        uintptr_t CodeMapInt;
+        if (Error E = COFFObj->getRvaPtr(CHPEMetadata->CodeMap, CodeMapInt))
+          reportError(std::move(E), Obj.getFileName());
+        CodeMap = reinterpret_cast<const chpe_range_entry *>(CodeMapInt);
+        CodeMapCount = CHPEMetadata->CodeMapCount;
+      }
+    }
+  }
 
   std::map<SectionRef, std::vector<RelocationRef>> RelocMap;
   if (InlineRelocs)
@@ -1575,6 +1591,24 @@
           MappingSymbols.emplace_back(Address - SectionAddr,
                                       PrimaryIsThumb ? 'p' : 's');
       }
+    } else if (CodeMapCount) {
+      DT = &PrimaryTarget;
+      for (uint32_t i = 0; i < CodeMapCount; i++) {
+        if ((CodeMap[i].StartOffset & 3) != CHPE_RANGE_AMD64)
+          continue;
+
+        // Mark x86_64 CHPE code ranges.
+        uint64_t Start = (CodeMap[i].StartOffset & ~3) +
+                         cast<COFFObjectFile>(&Obj)->getImageBase();
+        uint64_t End =
+            std::min(Start + CodeMap[i].Length, SectionAddr + SectSize);
+        if (Start < SectionAddr)
+          Start = SectionAddr;
+        if (Start < End) {
+          MappingSymbols.emplace_back(Start - SectionAddr, 's');
+          MappingSymbols.emplace_back(End - SectionAddr, 'p');
+        }
+      }
     }
 
     llvm::sort(MappingSymbols);
@@ -2156,6 +2190,21 @@
         Features.AddFeature("+thumb-mode");
       SecondaryTarget.emplace(PrimaryTarget, Features);
     }
+  } else if (const COFFObjectFile *COFFObj = dyn_cast<COFFObjectFile>(Obj)) {
+    const chpe_metadata *CHPEMetadata = COFFObj->getCHPEMetadata();
+    if (CHPEMetadata && CHPEMetadata->CodeMapCount) {
+      // Setup x86_64 disassembler for ARM64EC binaries.
+      Triple X64Triple("x86_64-windows-msvc");
+      std::string Error;
+      const Target *X64Target =
+          TargetRegistry::lookupTarget("", X64Triple, Error);
+      if (!X64Target)
+        reportError(Obj->getFileName(), "can't find X86_64 target: " + Error);
+
+      SubtargetFeatures X64Features;
+      SecondaryTarget.emplace(X64Target, *Obj, "x86_64-windows-msvc", "",
+                              X64Features);
+    }
   }
 
   const ObjectFile *DbgObj = Obj;
Index: lld/test/COFF/arm64ec.test
===================================================================
--- lld/test/COFF/arm64ec.test
+++ lld/test/COFF/arm64ec.test
@@ -37,9 +37,13 @@
 DISAS:      180001000: 52800040     mov     w0, #0x2
 DISAS-NEXT: 180001004: d65f03c0     ret
 DISAS-NEXT: ...
+DISAS-NEXT: 180002000: b8 03 00 00 00     movl    $0x3, %eax
+DISAS-NEXT: 180002005: c3                 retq
 DISAS:      180005000: 528000a0     mov     w0, #0x5
 DISAS-NEXT: 180005004: d65f03c0     ret
 DISAS-NEXT: ...
+DISAS-NEXT: 180006000: b8 06 00 00 00     movl    $0x6, %eax
+DISAS-NEXT: 180006005: c3                 retq
 
 
 #--- arm64ec-data-sym.s


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D149095.516513.patch
Type: text/x-patch
Size: 3736 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230424/b4601464/attachment.bin>


More information about the llvm-commits mailing list