[llvm] [JITLink][MachO] Endianness fix for relocation bit-field handling. (PR #168304)

Lang Hames via llvm-commits llvm-commits at lists.llvm.org
Sun Nov 16 16:42:31 PST 2025


https://github.com/lhames created https://github.com/llvm/llvm-project/pull/168304

When reading r_pcrel, r_length, r_extern and r_type fields of any_relocation_info we need to take endianness into account.

This is an alternative fix the issue described in
for https://github.com/llvm/llvm-project/pull/167902. This fix avoids external calls and further dependence on MachOObject file.

>From b8f4a93633e714a2b571f69f675046c2302c181c Mon Sep 17 00:00:00 2001
From: Lang Hames <lhames at gmail.com>
Date: Mon, 17 Nov 2025 11:28:49 +1100
Subject: [PATCH] [JITLink][MachO] Endianness fix for relocation bit-field
 handling.

When reading r_pcrel, r_length, r_extern and r_type fields of
any_relocation_info we need to take endianness into account.

This is an alternative fix the issue described in
for https://github.com/llvm/llvm-project/pull/167902. This fix avoids external
calls and further dependence on MachOObject file.
---
 .../JITLink/MachOLinkGraphBuilder.h              | 16 ++++++++++++----
 llvm/lib/ExecutionEngine/JITLink/MachO_arm64.cpp |  7 ++++---
 .../lib/ExecutionEngine/JITLink/MachO_x86_64.cpp |  5 +++--
 3 files changed, 19 insertions(+), 9 deletions(-)

diff --git a/llvm/lib/ExecutionEngine/JITLink/MachOLinkGraphBuilder.h b/llvm/lib/ExecutionEngine/JITLink/MachOLinkGraphBuilder.h
index 91021e457532e..e7db1cdc1a3d6 100644
--- a/llvm/lib/ExecutionEngine/JITLink/MachOLinkGraphBuilder.h
+++ b/llvm/lib/ExecutionEngine/JITLink/MachOLinkGraphBuilder.h
@@ -163,6 +163,7 @@ class MachOLinkGraphBuilder {
   static bool isDebugSection(const NormalizedSection &NSec);
   static bool isZeroFillSection(const NormalizedSection &NSec);
 
+  template <endianness ObjE>
   MachO::relocation_info
   getRelocationInfo(const object::relocation_iterator RelItr) {
     MachO::any_relocation_info ARI =
@@ -170,10 +171,17 @@ class MachOLinkGraphBuilder {
     MachO::relocation_info RI;
     RI.r_address = ARI.r_word0;
     RI.r_symbolnum = ARI.r_word1 & 0xffffff;
-    RI.r_pcrel = (ARI.r_word1 >> 24) & 1;
-    RI.r_length = (ARI.r_word1 >> 25) & 3;
-    RI.r_extern = (ARI.r_word1 >> 27) & 1;
-    RI.r_type = (ARI.r_word1 >> 28);
+    if (ObjE == endianness::native) {
+      RI.r_pcrel = (ARI.r_word1 >> 24) & 1;
+      RI.r_length = (ARI.r_word1 >> 25) & 3;
+      RI.r_extern = (ARI.r_word1 >> 27) & 1;
+      RI.r_type = (ARI.r_word1 >> 28);
+    } else {
+      RI.r_pcrel = (ARI.r_word1 >> 28) & 0x1;
+      RI.r_length = (ARI.r_word1 >> 26) & 0x3;
+      RI.r_extern = (ARI.r_word1 >> 25) & 0x1;
+      RI.r_type = (ARI.r_word1 >> 24) & 0xf;
+    }
     return RI;
   }
 
diff --git a/llvm/lib/ExecutionEngine/JITLink/MachO_arm64.cpp b/llvm/lib/ExecutionEngine/JITLink/MachO_arm64.cpp
index f79478038c5cb..52d13d5c18e8e 100644
--- a/llvm/lib/ExecutionEngine/JITLink/MachO_arm64.cpp
+++ b/llvm/lib/ExecutionEngine/JITLink/MachO_arm64.cpp
@@ -165,7 +165,7 @@ class MachOLinkGraphBuilder_arm64 : public MachOLinkGraphBuilder {
       return make_error<JITLinkError>("arm64 SUBTRACTOR without paired "
                                       "UNSIGNED relocation");
 
-    auto UnsignedRI = getRelocationInfo(UnsignedRelItr);
+    auto UnsignedRI = getRelocationInfo<endianness::little>(UnsignedRelItr);
 
     if (SubRI.r_address != UnsignedRI.r_address)
       return make_error<JITLinkError>("arm64 SUBTRACTOR and paired UNSIGNED "
@@ -288,7 +288,8 @@ class MachOLinkGraphBuilder_arm64 : public MachOLinkGraphBuilder {
       for (auto RelItr = S.relocation_begin(), RelEnd = S.relocation_end();
            RelItr != RelEnd; ++RelItr) {
 
-        MachO::relocation_info RI = getRelocationInfo(RelItr);
+        MachO::relocation_info RI =
+            getRelocationInfo<endianness::little>(RelItr);
 
         // Validate the relocation kind.
         auto MachORelocKind = getRelocationKind(RI);
@@ -337,7 +338,7 @@ class MachOLinkGraphBuilder_arm64 : public MachOLinkGraphBuilder {
           if (RelItr == RelEnd)
             return make_error<JITLinkError>("Unpaired Addend reloc at " +
                                             formatv("{0:x16}", FixupAddress));
-          RI = getRelocationInfo(RelItr);
+          RI = getRelocationInfo<endianness::little>(RelItr);
 
           MachORelocKind = getRelocationKind(RI);
           if (!MachORelocKind)
diff --git a/llvm/lib/ExecutionEngine/JITLink/MachO_x86_64.cpp b/llvm/lib/ExecutionEngine/JITLink/MachO_x86_64.cpp
index 27209a82eb5f4..79aee71528b4c 100644
--- a/llvm/lib/ExecutionEngine/JITLink/MachO_x86_64.cpp
+++ b/llvm/lib/ExecutionEngine/JITLink/MachO_x86_64.cpp
@@ -140,7 +140,7 @@ class MachOLinkGraphBuilder_x86_64 : public MachOLinkGraphBuilder {
       return make_error<JITLinkError>("x86_64 SUBTRACTOR without paired "
                                       "UNSIGNED relocation");
 
-    auto UnsignedRI = getRelocationInfo(UnsignedRelItr);
+    auto UnsignedRI = getRelocationInfo<endianness::little>(UnsignedRelItr);
 
     if (SubRI.r_address != UnsignedRI.r_address)
       return make_error<JITLinkError>("x86_64 SUBTRACTOR and paired UNSIGNED "
@@ -264,7 +264,8 @@ class MachOLinkGraphBuilder_x86_64 : public MachOLinkGraphBuilder {
       for (auto RelItr = S.relocation_begin(), RelEnd = S.relocation_end();
            RelItr != RelEnd; ++RelItr) {
 
-        MachO::relocation_info RI = getRelocationInfo(RelItr);
+        MachO::relocation_info RI =
+            getRelocationInfo<endianness::little>(RelItr);
 
         // Find the address of the value to fix up.
         auto FixupAddress = SectionAddress + (uint32_t)RI.r_address;



More information about the llvm-commits mailing list