<div dir="ltr">This broke llvm-objcopy on big-endian platforms. I'm working on a fix for this now.<div><br></div><div>-- Lang.</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Apr 16, 2020 at 4:19 PM Lang Hames via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><br>
Author: Lang Hames<br>
Date: 2020-04-16T16:17:36-07:00<br>
New Revision: 386f1c114d5952c13760cb3368d41d09d8ba099c<br>
<br>
URL: <a href="https://github.com/llvm/llvm-project/commit/386f1c114d5952c13760cb3368d41d09d8ba099c" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project/commit/386f1c114d5952c13760cb3368d41d09d8ba099c</a><br>
DIFF: <a href="https://github.com/llvm/llvm-project/commit/386f1c114d5952c13760cb3368d41d09d8ba099c.diff" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project/commit/386f1c114d5952c13760cb3368d41d09d8ba099c.diff</a><br>
<br>
LOG: [Object] Remove conditional layout of bitfields in MachO::relocation_info.<br>
<br>
This removes the conditional layout of relocation_info bitfields that was<br>
introduced in 3ccd677bf (svn r358839). The platform relocation_info<br>
struct (defined in usr/include/mach-o/reloc.h) does not define the layout of<br>
this struct differently on big-endian platforms and we want to keep the LLVM<br>
and platform definitions in sync.<br>
<br>
To fix the bug that 3ccd677bf addressed this patch modifies JITLink to construct<br>
its relocation_info structs from the raw relocation words using shift and mask<br>
operations.<br>
<br>
Added: <br>
<br>
<br>
Modified: <br>
    llvm/include/llvm/BinaryFormat/MachO.h<br>
    llvm/lib/ExecutionEngine/JITLink/MachOLinkGraphBuilder.h<br>
    llvm/lib/ExecutionEngine/JITLink/MachO_arm64.cpp<br>
    llvm/lib/ExecutionEngine/JITLink/MachO_x86_64.cpp<br>
<br>
Removed: <br>
<br>
<br>
<br>
################################################################################<br>
diff  --git a/llvm/include/llvm/BinaryFormat/MachO.h b/llvm/include/llvm/BinaryFormat/MachO.h<br>
index 53959182e987..0010f36e8b89 100644<br>
--- a/llvm/include/llvm/BinaryFormat/MachO.h<br>
+++ b/llvm/include/llvm/BinaryFormat/MachO.h<br>
@@ -952,13 +952,8 @@ struct fat_arch_64 {<br>
 // Structs from <mach-o/reloc.h><br>
 struct relocation_info {<br>
   int32_t r_address;<br>
-#if defined(BYTE_ORDER) && defined(BIG_ENDIAN) && (BYTE_ORDER == BIG_ENDIAN)<br>
-  uint32_t r_type : 4,  r_extern : 1, r_length : 2, r_pcrel : 1,<br>
-      r_symbolnum : 24;<br>
-#else<br>
   uint32_t r_symbolnum : 24, r_pcrel : 1, r_length : 2, r_extern : 1,<br>
       r_type : 4;<br>
-#endif<br>
 };<br>
<br>
 struct scattered_relocation_info {<br>
<br>
diff  --git a/llvm/lib/ExecutionEngine/JITLink/MachOLinkGraphBuilder.h b/llvm/lib/ExecutionEngine/JITLink/MachOLinkGraphBuilder.h<br>
index 06d4787fc43c..ffe010054ff5 100644<br>
--- a/llvm/lib/ExecutionEngine/JITLink/MachOLinkGraphBuilder.h<br>
+++ b/llvm/lib/ExecutionEngine/JITLink/MachOLinkGraphBuilder.h<br>
@@ -153,6 +153,20 @@ class MachOLinkGraphBuilder {<br>
   static Scope getScope(StringRef Name, uint8_t Type);<br>
   static bool isAltEntry(const NormalizedSymbol &NSym);<br>
<br>
+  MachO::relocation_info<br>
+  getRelocationInfo(const object::relocation_iterator RelItr) {<br>
+    MachO::any_relocation_info ARI =<br>
+        getObject().getRelocation(RelItr->getRawDataRefImpl());<br>
+    MachO::relocation_info RI;<br>
+    RI.r_address = ARI.r_word0;<br>
+    RI.r_symbolnum = ARI.r_word1 & 0xffffff;<br>
+    RI.r_pcrel = (ARI.r_word1 >> 24) & 1;<br>
+    RI.r_length = (ARI.r_word1 >> 25) & 3;<br>
+    RI.r_extern = (ARI.r_word1 >> 27) & 1;<br>
+    RI.r_type = (ARI.r_word1 >> 28);<br>
+    return RI;<br>
+  }<br>
+<br>
 private:<br>
   static unsigned getPointerSize(const object::MachOObjectFile &Obj);<br>
   static support::endianness getEndianness(const object::MachOObjectFile &Obj);<br>
<br>
diff  --git a/llvm/lib/ExecutionEngine/JITLink/MachO_arm64.cpp b/llvm/lib/ExecutionEngine/JITLink/MachO_arm64.cpp<br>
index cc3940393bfc..55c7b36142a0 100644<br>
--- a/llvm/lib/ExecutionEngine/JITLink/MachO_arm64.cpp<br>
+++ b/llvm/lib/ExecutionEngine/JITLink/MachO_arm64.cpp<br>
@@ -92,15 +92,6 @@ class MachOLinkGraphBuilder_arm64 : public MachOLinkGraphBuilder {<br>
         ", length=" + formatv("{0:d}", RI.r_length));<br>
   }<br>
<br>
-  MachO::relocation_info<br>
-  getRelocationInfo(const object::relocation_iterator RelItr) {<br>
-    MachO::any_relocation_info ARI =<br>
-        getObject().getRelocation(RelItr->getRawDataRefImpl());<br>
-    MachO::relocation_info RI;<br>
-    memcpy(&RI, &ARI, sizeof(MachO::relocation_info));<br>
-    return RI;<br>
-  }<br>
-<br>
   using PairRelocInfo =<br>
       std::tuple<MachOARM64RelocationKind, Symbol *, uint64_t>;<br>
<br>
<br>
diff  --git a/llvm/lib/ExecutionEngine/JITLink/MachO_x86_64.cpp b/llvm/lib/ExecutionEngine/JITLink/MachO_x86_64.cpp<br>
index 05e323b18d80..9abeddfb1920 100644<br>
--- a/llvm/lib/ExecutionEngine/JITLink/MachO_x86_64.cpp<br>
+++ b/llvm/lib/ExecutionEngine/JITLink/MachO_x86_64.cpp<br>
@@ -95,15 +95,6 @@ class MachOLinkGraphBuilder_x86_64 : public MachOLinkGraphBuilder {<br>
         ", length=" + formatv("{0:d}", RI.r_length));<br>
   }<br>
<br>
-  MachO::relocation_info<br>
-  getRelocationInfo(const object::relocation_iterator RelItr) {<br>
-    MachO::any_relocation_info ARI =<br>
-        getObject().getRelocation(RelItr->getRawDataRefImpl());<br>
-    MachO::relocation_info RI;<br>
-    memcpy(&RI, &ARI, sizeof(MachO::relocation_info));<br>
-    return RI;<br>
-  }<br>
-<br>
   using PairRelocInfo = std::tuple<MachOX86RelocationKind, Symbol *, uint64_t>;<br>
<br>
   // Parses paired SUBTRACTOR/UNSIGNED relocations and, on success,<br>
<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div>