<div dir="ltr"><div><div><div><div>Hi Tim,<br><br></div>This revision makes build failures on one of builders:<br><a href="http://lab.llvm.org:8011/builders/lld-x86_64-win7">http://lab.llvm.org:8011/builders/lld-x86_64-win7</a><br></div>Please have a look at this?<br><br></div>Thanks<br><br></div>Galina<br><div><div><div><div><br></div></div></div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Oct 27, 2014 at 3:48 PM, Tim Northover <span dir="ltr"><<a href="mailto:tnorthover@apple.com" target="_blank">tnorthover@apple.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: tnorthover<br>
Date: Mon Oct 27 17:48:35 2014<br>
New Revision: 220730<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=220730&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=220730&view=rev</a><br>
Log:<br>
TMP: fix readN & writeN to not encourage UB<br>
<br>
Modified:<br>
    lld/trunk/lib/ReaderWriter/MachO/ArchHandler.cpp<br>
    lld/trunk/lib/ReaderWriter/MachO/ArchHandler.h<br>
    lld/trunk/lib/ReaderWriter/MachO/ArchHandler_arm.cpp<br>
    lld/trunk/lib/ReaderWriter/MachO/ArchHandler_arm64.cpp<br>
    lld/trunk/lib/ReaderWriter/MachO/ArchHandler_x86.cpp<br>
    lld/trunk/lib/ReaderWriter/MachO/ArchHandler_x86_64.cpp<br>
    lld/trunk/lib/ReaderWriter/MachO/CompactUnwindPass.cpp<br>
    lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryReader.cpp<br>
    lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryUtils.h<br>
    lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileToAtoms.cpp<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/MachO/ArchHandler.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/ArchHandler.cpp?rev=220730&r1=220729&r2=220730&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/ArchHandler.cpp?rev=220730&r1=220729&r2=220730&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/lib/ReaderWriter/MachO/ArchHandler.cpp (original)<br>
+++ lld/trunk/lib/ReaderWriter/MachO/ArchHandler.cpp Mon Oct 27 17:48:35 2014<br>
@@ -124,31 +124,31 @@ void ArchHandler::appendReloc(normalized<br>
 }<br>
<br>
<br>
-int16_t ArchHandler::readS16(bool swap, const uint8_t *addr) {<br>
-  return read16(swap, *reinterpret_cast<const uint16_t*>(addr));<br>
+int16_t ArchHandler::readS16(const uint8_t *addr, bool isBig) {<br>
+    return read16(addr, isBig);<br>
 }<br>
<br>
-int32_t ArchHandler::readS32(bool swap, const uint8_t *addr) {<br>
-  return read32(swap, *reinterpret_cast<const uint32_t*>(addr));<br>
+int32_t ArchHandler::readS32(const uint8_t *addr, bool isBig) {<br>
+  return read32(addr, isBig);<br>
 }<br>
<br>
-uint32_t ArchHandler::readU32(bool swap, const uint8_t *addr) {<br>
-  return read32(swap, *reinterpret_cast<const uint32_t*>(addr));<br>
+uint32_t ArchHandler::readU32(const uint8_t *addr, bool isBig) {<br>
+  return read32(addr, isBig);<br>
 }<br>
<br>
-int64_t ArchHandler::readS64(bool swap, const uint8_t *addr) {<br>
-  return read64(swap, *reinterpret_cast<const uint64_t*>(addr));<br>
+  int64_t ArchHandler::readS64(const uint8_t *addr, bool isBig) {<br>
+  return read64(addr, isBig);<br>
 }<br>
<br>
-bool ArchHandler::isDwarfCIE(bool swap, const DefinedAtom *atom) {<br>
+bool ArchHandler::isDwarfCIE(bool isBig, const DefinedAtom *atom) {<br>
   assert(atom->contentType() == DefinedAtom::typeCFI);<br>
-  uint32_t size = read32(swap, *(uint32_t *)atom->rawContent().data());<br>
+  uint32_t size = read32(atom->rawContent().data(), isBig);<br>
<br>
   uint32_t idOffset = sizeof(uint32_t);<br>
   if (size == 0xffffffffU)<br>
     idOffset += sizeof(uint64_t);<br>
<br>
-  return read32(swap, *(uint32_t *)(atom->rawContent().data() + idOffset)) == 0;<br>
+  return read32(atom->rawContent().data() + idOffset, isBig) == 0;<br>
 }<br>
<br>
 const Atom *ArchHandler::fdeTargetFunction(const DefinedAtom *fde) {<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/MachO/ArchHandler.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/ArchHandler.h?rev=220730&r1=220729&r2=220730&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/ArchHandler.h?rev=220730&r1=220729&r2=220730&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/lib/ReaderWriter/MachO/ArchHandler.h (original)<br>
+++ lld/trunk/lib/ReaderWriter/MachO/ArchHandler.h Mon Oct 27 17:48:35 2014<br>
@@ -118,7 +118,7 @@ public:<br>
           getReferenceInfo(const normalized::Relocation &reloc,<br>
                            const DefinedAtom *inAtom,<br>
                            uint32_t offsetInAtom,<br>
-                           uint64_t fixupAddress, bool swap,<br>
+                           uint64_t fixupAddress, bool isBigEndian,<br>
                            FindAtomBySectionAndAddress atomFromAddress,<br>
                            FindAtomBySymbolIndex atomFromSymbolIndex,<br>
                            Reference::KindValue *kind,<br>
@@ -134,7 +134,7 @@ public:<br>
                            const normalized::Relocation &reloc2,<br>
                            const DefinedAtom *inAtom,<br>
                            uint32_t offsetInAtom,<br>
-                           uint64_t fixupAddress, bool swap, bool scatterable,<br>
+                           uint64_t fixupAddress, bool isBig, bool scatterable,<br>
                            FindAtomBySectionAndAddress atomFromAddress,<br>
                            FindAtomBySymbolIndex atomFromSymbolIndex,<br>
                            Reference::KindValue *kind,<br>
@@ -211,7 +211,7 @@ public:<br>
   }<br>
<br>
   /// Does a given unwind-cfi atom represent a CIE (as opposed to an FDE).<br>
-  static bool isDwarfCIE(bool swap, const DefinedAtom *atom);<br>
+  static bool isDwarfCIE(bool isBig, const DefinedAtom *atom);<br>
<br>
   struct ReferenceInfo {<br>
     Reference::KindArch arch;<br>
@@ -288,10 +288,10 @@ protected:<br>
                           RelocPattern pattern);<br>
<br>
<br>
-  static int16_t  readS16(bool swap, const uint8_t *addr);<br>
-  static int32_t  readS32(bool swap, const uint8_t *addr);<br>
-  static uint32_t readU32(bool swap, const uint8_t *addr);<br>
-  static int64_t  readS64(bool swap, const uint8_t *addr);<br>
+  static int16_t  readS16(const uint8_t *addr, bool isBig);<br>
+  static int32_t  readS32(const uint8_t *addr, bool isBig);<br>
+  static uint32_t readU32(const uint8_t *addr, bool isBig);<br>
+  static int64_t  readS64(const uint8_t *addr, bool isBig);<br>
 };<br>
<br>
 } // namespace mach_o<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/MachO/ArchHandler_arm.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/ArchHandler_arm.cpp?rev=220730&r1=220729&r2=220730&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/ArchHandler_arm.cpp?rev=220730&r1=220729&r2=220730&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/lib/ReaderWriter/MachO/ArchHandler_arm.cpp (original)<br>
+++ lld/trunk/lib/ReaderWriter/MachO/ArchHandler_arm.cpp Mon Oct 27 17:48:35 2014<br>
@@ -13,6 +13,8 @@<br>
 #include "llvm/ADT/StringRef.h"<br>
 #include "llvm/ADT/StringSwitch.h"<br>
 #include "llvm/ADT/Triple.h"<br>
+<br>
+#include "llvm/Support/Endian.h"<br>
 #include "llvm/Support/ErrorHandling.h"<br>
<br>
 using namespace llvm::MachO;<br>
@@ -21,6 +23,10 @@ using namespace lld::mach_o::normalized;<br>
 namespace lld {<br>
 namespace mach_o {<br>
<br>
+using llvm::support::ulittle32_t;<br>
+using llvm::support::little32_t;<br>
+<br>
+<br>
 class ArchHandler_arm : public ArchHandler {<br>
 public:<br>
            ArchHandler_arm();<br>
@@ -191,16 +197,13 @@ private:<br>
                              uint64_t targetAddress,<br>
                              uint64_t inAtomAddress, bool &thumbMode,<br>
                              bool targetIsThumb);<br>
-<br>
-  const bool _swap;<br>
 };<br>
<br>
 //===----------------------------------------------------------------------===//<br>
 //  ArchHandler_arm<br>
 //===----------------------------------------------------------------------===//<br>
<br>
-ArchHandler_arm::ArchHandler_arm() :<br>
-  _swap(!MachOLinkingContext::isHostEndian(MachOLinkingContext::arch_armv7)) {}<br>
+ArchHandler_arm::ArchHandler_arm() { }<br>
<br>
 ArchHandler_arm::~ArchHandler_arm() { }<br>
<br>
@@ -511,14 +514,14 @@ uint32_t ArchHandler_arm::clearThumbBit(<br>
<br>
 std::error_code ArchHandler_arm::getReferenceInfo(<br>
     const Relocation &reloc, const DefinedAtom *inAtom, uint32_t offsetInAtom,<br>
-    uint64_t fixupAddress, bool swap,<br>
+    uint64_t fixupAddress, bool isBig,<br>
     FindAtomBySectionAndAddress atomFromAddress,<br>
     FindAtomBySymbolIndex atomFromSymbolIndex, Reference::KindValue *kind,<br>
     const lld::Atom **target, Reference::Addend *addend) {<br>
   typedef std::error_code E;<br>
   const uint8_t *fixupContent = &inAtom->rawContent()[offsetInAtom];<br>
   uint64_t targetAddress;<br>
-  uint32_t instruction = readU32(swap, fixupContent);<br>
+  uint32_t instruction = *(ulittle32_t *)fixupContent;<br>
   int32_t displacement;<br>
   switch (relocPattern(reloc)) {<br>
   case ARM_THUMB_RELOC_BR22 | rPcRel | rExtern | rLength4:<br>
@@ -626,7 +629,7 @@ ArchHandler_arm::getPairReferenceInfo(co<br>
                                      const normalized::Relocation &reloc2,<br>
                                      const DefinedAtom *inAtom,<br>
                                      uint32_t offsetInAtom,<br>
-                                     uint64_t fixupAddress, bool swap,<br>
+                                     uint64_t fixupAddress, bool isBig,<br>
                                      bool scatterable,<br>
                                      FindAtomBySectionAndAddress atomFromAddr,<br>
                                      FindAtomBySymbolIndex atomFromSymbolIndex,<br>
@@ -778,7 +781,7 @@ ArchHandler_arm::getPairReferenceInfo(co<br>
   }<br>
   const uint8_t *fixupContent = &inAtom->rawContent()[offsetInAtom];<br>
   std::error_code ec;<br>
-  uint32_t instruction = readU32(swap, fixupContent);<br>
+  uint32_t instruction = *(ulittle32_t *)fixupContent;<br>
   uint32_t value;<br>
   uint32_t fromAddress;<br>
   uint32_t toAddress;<br>
@@ -898,7 +901,7 @@ ArchHandler_arm::getPairReferenceInfo(co<br>
   return std::error_code();<br>
 }<br>
<br>
-void ArchHandler_arm::applyFixupFinal(const Reference &ref, uint8_t *location,<br>
+void ArchHandler_arm::applyFixupFinal(const Reference &ref, uint8_t *loc,<br>
                                       uint64_t fixupAddress,<br>
                                       uint64_t targetAddress,<br>
                                       uint64_t inAtomAddress,<br>
@@ -906,7 +909,7 @@ void ArchHandler_arm::applyFixupFinal(co<br>
   if (ref.kindNamespace() != Reference::KindNamespace::mach_o)<br>
     return;<br>
   assert(ref.kindArch() == Reference::KindArch::ARM);<br>
-  int32_t *loc32 = reinterpret_cast<int32_t *>(location);<br>
+  ulittle32_t *loc32 = reinterpret_cast<ulittle32_t *>(loc);<br>
   int32_t displacement;<br>
   uint16_t value16;<br>
   uint32_t value32;<br>
@@ -923,76 +926,76 @@ void ArchHandler_arm::applyFixupFinal(co<br>
   case thumb_bl22:<br>
     assert(thumbMode);<br>
     displacement = (targetAddress - (fixupAddress + 4)) + ref.addend();<br>
-    value32 = setDisplacementInThumbBranch(*loc32, fixupAddress, displacement,<br>
-                                           targetIsThumb);<br>
-    write32(*loc32, _swap, value32);<br>
+    value32 = setDisplacementInThumbBranch(*loc32, fixupAddress,<br>
+                                           displacement, targetIsThumb);<br>
+    *loc32 = value32;<br>
     break;<br>
   case thumb_movw:<br>
     assert(thumbMode);<br>
     value16 = (targetAddress + ref.addend()) & 0xFFFF;<br>
     if (targetIsThumb)<br>
       value16 |= 1;<br>
-    write32(*loc32, _swap, setWordFromThumbMov(*loc32, value16));<br>
+    *loc32 = setWordFromThumbMov(*loc32, value16);<br>
     break;<br>
   case thumb_movt:<br>
     assert(thumbMode);<br>
     value16 = (targetAddress + ref.addend()) >> 16;<br>
-    write32(*loc32, _swap, setWordFromThumbMov(*loc32, value16));<br>
+    *loc32 = setWordFromThumbMov(*loc32, value16);<br>
     break;<br>
   case thumb_movw_funcRel:<br>
     assert(thumbMode);<br>
     value16 = (targetAddress - inAtomAddress + ref.addend()) & 0xFFFF;<br>
     if (targetIsThumb)<br>
       value16 |= 1;<br>
-    write32(*loc32, _swap, setWordFromThumbMov(*loc32, value16));<br>
+    *loc32 = setWordFromThumbMov(*loc32, value16);<br>
     break;<br>
   case thumb_movt_funcRel:<br>
     assert(thumbMode);<br>
     value16 = (targetAddress - inAtomAddress + ref.addend()) >> 16;<br>
-    write32(*loc32, _swap, setWordFromThumbMov(*loc32, value16));<br>
+    *loc32 = setWordFromThumbMov(*loc32, value16);<br>
     break;<br>
   case arm_b24:<br>
   case arm_bl24:<br>
    assert(!thumbMode);<br>
     displacement = (targetAddress - (fixupAddress + 8)) + ref.addend();<br>
     value32 = setDisplacementInArmBranch(*loc32, displacement, targetIsThumb);<br>
-    write32(*loc32, _swap, value32);<br>
+    *loc32 = value32;<br>
     break;<br>
   case arm_movw:<br>
     assert(!thumbMode);<br>
     value16 = (targetAddress + ref.addend()) & 0xFFFF;<br>
     if (targetIsThumb)<br>
       value16 |= 1;<br>
-    write32(*loc32, _swap, setWordFromArmMov(*loc32, value16));<br>
+    *loc32 = setWordFromArmMov(*loc32, value16);<br>
     break;<br>
   case arm_movt:<br>
     assert(!thumbMode);<br>
     value16 = (targetAddress + ref.addend()) >> 16;<br>
-    write32(*loc32, _swap, setWordFromArmMov(*loc32, value16));<br>
+    *loc32 = setWordFromArmMov(*loc32, value16);<br>
     break;<br>
   case arm_movw_funcRel:<br>
     assert(!thumbMode);<br>
     value16 = (targetAddress - inAtomAddress + ref.addend()) & 0xFFFF;<br>
     if (targetIsThumb)<br>
       value16 |= 1;<br>
-    write32(*loc32, _swap, setWordFromArmMov(*loc32, value16));<br>
+    *loc32 = setWordFromArmMov(*loc32, value16);<br>
     break;<br>
   case arm_movt_funcRel:<br>
     assert(!thumbMode);<br>
     value16 = (targetAddress - inAtomAddress + ref.addend()) >> 16;<br>
-    write32(*loc32, _swap, setWordFromArmMov(*loc32, value16));<br>
+    *loc32 = setWordFromArmMov(*loc32, value16);<br>
     break;<br>
   case pointer32:<br>
     if (targetIsThumb)<br>
-      write32(*loc32, _swap, targetAddress + ref.addend() + 1);<br>
+      *loc32 = targetAddress + ref.addend() + 1;<br>
     else<br>
-      write32(*loc32, _swap, targetAddress + ref.addend());<br>
+      *loc32 = targetAddress + ref.addend();<br>
     break;<br>
   case delta32:<br>
     if (targetIsThumb)<br>
-      write32(*loc32, _swap, targetAddress - fixupAddress + ref.addend() + 1);<br>
+      *loc32 = targetAddress - fixupAddress + ref.addend() + 1;<br>
     else<br>
-      write32(*loc32, _swap, targetAddress - fixupAddress + ref.addend());<br>
+      *loc32 = targetAddress - fixupAddress + ref.addend();<br>
     break;<br>
   case lazyPointer:<br>
   case lazyImmediateLocation:<br>
@@ -1058,15 +1061,14 @@ bool ArchHandler_arm::useExternalRelocat<br>
   return false;<br>
 }<br>
<br>
-void ArchHandler_arm::applyFixupRelocatable(const Reference &ref,<br>
-                                             uint8_t *location,<br>
-                                             uint64_t fixupAddress,<br>
-                                             uint64_t targetAddress,<br>
-                                             uint64_t inAtomAddress,<br>
-                                             bool &thumbMode,<br>
-                                             bool targetIsThumb) {<br>
+void ArchHandler_arm::applyFixupRelocatable(const Reference &ref, uint8_t *loc,<br>
+                                            uint64_t fixupAddress,<br>
+                                            uint64_t targetAddress,<br>
+                                            uint64_t inAtomAddress,<br>
+                                            bool &thumbMode,<br>
+                                            bool targetIsThumb) {<br>
   bool useExternalReloc = useExternalRelocationTo(*ref.target());<br>
-  int32_t *loc32 = reinterpret_cast<int32_t *>(location);<br>
+  ulittle32_t *loc32 = reinterpret_cast<ulittle32_t *>(loc);<br>
   int32_t displacement;<br>
   uint16_t value16;<br>
   uint32_t value32;<br>
@@ -1086,9 +1088,9 @@ void ArchHandler_arm::applyFixupRelocata<br>
       displacement = (ref.addend() - (fixupAddress + 4));<br>
     else<br>
       displacement = (targetAddress - (fixupAddress + 4)) + ref.addend();<br>
-    value32 = setDisplacementInThumbBranch(*loc32, fixupAddress, displacement,<br>
-                                           targetIsThumb);<br>
-    write32(*loc32, _swap, value32);<br>
+    value32 = setDisplacementInThumbBranch(*loc32, fixupAddress,<br>
+                                           displacement, targetIsThumb);<br>
+    *loc32 = value32;<br>
     break;<br>
   case thumb_movw:<br>
     assert(thumbMode);<br>
@@ -1096,7 +1098,7 @@ void ArchHandler_arm::applyFixupRelocata<br>
       value16 = ref.addend() & 0xFFFF;<br>
     else<br>
       value16 = (targetAddress + ref.addend()) & 0xFFFF;<br>
-    write32(*loc32, _swap, setWordFromThumbMov(*loc32, value16));<br>
+    *loc32 = setWordFromThumbMov(*loc32, value16);<br>
     break;<br>
   case thumb_movt:<br>
     assert(thumbMode);<br>
@@ -1104,17 +1106,17 @@ void ArchHandler_arm::applyFixupRelocata<br>
       value16 = ref.addend() >> 16;<br>
     else<br>
       value16 = (targetAddress + ref.addend()) >> 16;<br>
-    write32(*loc32, _swap, setWordFromThumbMov(*loc32, value16));<br>
+    *loc32 = setWordFromThumbMov(*loc32, value16);<br>
     break;<br>
   case thumb_movw_funcRel:<br>
     assert(thumbMode);<br>
     value16 = (targetAddress - inAtomAddress + ref.addend()) & 0xFFFF;<br>
-    write32(*loc32, _swap, setWordFromThumbMov(*loc32, value16));<br>
+    *loc32 = setWordFromThumbMov(*loc32, value16);<br>
     break;<br>
   case thumb_movt_funcRel:<br>
     assert(thumbMode);<br>
     value16 = (targetAddress - inAtomAddress + ref.addend()) >> 16;<br>
-    write32(*loc32, _swap, setWordFromThumbMov(*loc32, value16));<br>
+    *loc32 = setWordFromThumbMov(*loc32, value16);<br>
     break;<br>
   case arm_b24:<br>
   case arm_bl24:<br>
@@ -1123,8 +1125,9 @@ void ArchHandler_arm::applyFixupRelocata<br>
       displacement = (ref.addend() - (fixupAddress + 8));<br>
     else<br>
       displacement = (targetAddress - (fixupAddress + 8)) + ref.addend();<br>
-    value32 = setDisplacementInArmBranch(*loc32, displacement, targetIsThumb);<br>
-    write32(*loc32, _swap, value32);<br>
+    value32 = setDisplacementInArmBranch(*loc32, displacement,<br>
+                                         targetIsThumb);<br>
+    *loc32 = value32;<br>
     break;<br>
   case arm_movw:<br>
     assert(!thumbMode);<br>
@@ -1132,7 +1135,7 @@ void ArchHandler_arm::applyFixupRelocata<br>
       value16 = ref.addend() & 0xFFFF;<br>
     else<br>
       value16 = (targetAddress + ref.addend()) & 0xFFFF;<br>
-    write32(*loc32, _swap, setWordFromArmMov(*loc32, value16));<br>
+    *loc32 = setWordFromArmMov(*loc32, value16);<br>
     break;<br>
   case arm_movt:<br>
     assert(!thumbMode);<br>
@@ -1140,23 +1143,23 @@ void ArchHandler_arm::applyFixupRelocata<br>
       value16 = ref.addend() >> 16;<br>
     else<br>
       value16 = (targetAddress + ref.addend()) >> 16;<br>
-    write32(*loc32, _swap, setWordFromArmMov(*loc32, value16));<br>
+    *loc32 = setWordFromArmMov(*loc32, value16);<br>
     break;<br>
   case arm_movw_funcRel:<br>
     assert(!thumbMode);<br>
     value16 = (targetAddress - inAtomAddress + ref.addend()) & 0xFFFF;<br>
-    write32(*loc32, _swap, setWordFromArmMov(*loc32, value16));<br>
+    *loc32 = setWordFromArmMov(*loc32, value16);<br>
     break;<br>
   case arm_movt_funcRel:<br>
     assert(!thumbMode);<br>
     value16 = (targetAddress - inAtomAddress + ref.addend()) >> 16;<br>
-    write32(*loc32, _swap, setWordFromArmMov(*loc32, value16));<br>
+    *loc32 = setWordFromArmMov(*loc32, value16);<br>
     break;<br>
   case pointer32:<br>
-    write32(*loc32, _swap, targetAddress + ref.addend());<br>
+    *loc32 = targetAddress + ref.addend();<br>
     break;<br>
   case delta32:<br>
-    write32(*loc32, _swap, targetAddress - fixupAddress + ref.addend());<br>
+    *loc32 = targetAddress - fixupAddress + ref.addend();<br>
     break;<br>
   case lazyPointer:<br>
   case lazyImmediateLocation:<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/MachO/ArchHandler_arm64.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/ArchHandler_arm64.cpp?rev=220730&r1=220729&r2=220730&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/ArchHandler_arm64.cpp?rev=220730&r1=220729&r2=220730&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/lib/ReaderWriter/MachO/ArchHandler_arm64.cpp (original)<br>
+++ lld/trunk/lib/ReaderWriter/MachO/ArchHandler_arm64.cpp Mon Oct 27 17:48:35 2014<br>
@@ -13,6 +13,8 @@<br>
 #include "llvm/ADT/StringRef.h"<br>
 #include "llvm/ADT/StringSwitch.h"<br>
 #include "llvm/ADT/Triple.h"<br>
+<br>
+#include "llvm/Support/Endian.h"<br>
 #include "llvm/Support/ErrorHandling.h"<br>
 #include "llvm/Support/Format.h"<br>
<br>
@@ -22,6 +24,12 @@ using namespace lld::mach_o::normalized;<br>
 namespace lld {<br>
 namespace mach_o {<br>
<br>
+using llvm::support::ulittle32_t;<br>
+using llvm::support::ulittle64_t;<br>
+<br>
+using llvm::support::little32_t;<br>
+using llvm::support::little64_t;<br>
+<br>
 class ArchHandler_arm64 : public ArchHandler {<br>
 public:<br>
   ArchHandler_arm64();<br>
@@ -109,7 +117,7 @@ public:<br>
   std::error_code getReferenceInfo(const normalized::Relocation &reloc,<br>
                                    const DefinedAtom *inAtom,<br>
                                    uint32_t offsetInAtom,<br>
-                                   uint64_t fixupAddress, bool swap,<br>
+                                   uint64_t fixupAddress, bool isBig,<br>
                                    FindAtomBySectionAndAddress atomFromAddress,<br>
                                    FindAtomBySymbolIndex atomFromSymbolIndex,<br>
                                    Reference::KindValue *kind,<br>
@@ -120,7 +128,7 @@ public:<br>
                            const normalized::Relocation &reloc2,<br>
                            const DefinedAtom *inAtom,<br>
                            uint32_t offsetInAtom,<br>
-                           uint64_t fixupAddress, bool swap, bool scatterable,<br>
+                           uint64_t fixupAddress, bool isBig, bool scatterable,<br>
                            FindAtomBySectionAndAddress atomFromAddress,<br>
                            FindAtomBySymbolIndex atomFromSymbolIndex,<br>
                            Reference::KindValue *kind,<br>
@@ -190,13 +198,9 @@ private:<br>
   static uint32_t setDisplacementInADRP(uint32_t instr, int64_t disp);<br>
   static Arm64_Kinds offset12KindFromInstruction(uint32_t instr);<br>
   static uint32_t setImm12(uint32_t instr, uint32_t offset);<br>
-<br>
-  const bool _swap;<br>
 };<br>
<br>
-ArchHandler_arm64::ArchHandler_arm64()<br>
-  : _swap(!MachOLinkingContext::isHostEndian(MachOLinkingContext::arch_arm64)) {<br>
-}<br>
+ArchHandler_arm64::ArchHandler_arm64() {}<br>
<br>
 ArchHandler_arm64::~ArchHandler_arm64() {}<br>
<br>
@@ -334,7 +338,7 @@ uint32_t ArchHandler_arm64::setImm12(uin<br>
<br>
 std::error_code ArchHandler_arm64::getReferenceInfo(<br>
     const Relocation &reloc, const DefinedAtom *inAtom, uint32_t offsetInAtom,<br>
-    uint64_t fixupAddress, bool swap,<br>
+    uint64_t fixupAddress, bool isBig,<br>
     FindAtomBySectionAndAddress atomFromAddress,<br>
     FindAtomBySymbolIndex atomFromSymbolIndex, Reference::KindValue *kind,<br>
     const lld::Atom **target, Reference::Addend *addend) {<br>
@@ -356,7 +360,7 @@ std::error_code ArchHandler_arm64::getRe<br>
     return std::error_code();<br>
   case ARM64_RELOC_PAGEOFF12                   | rExtern | rLength4:<br>
     // ex: ldr x0, [x1, _foo@PAGEOFF]<br>
-    *kind = offset12KindFromInstruction(readS32(swap, fixupContent));<br>
+    *kind = offset12KindFromInstruction(*(little32_t *)fixupContent);<br>
     if (auto ec = atomFromSymbolIndex(reloc.symbol, target))<br>
       return ec;<br>
     *addend = 0;<br>
@@ -394,7 +398,7 @@ std::error_code ArchHandler_arm64::getRe<br>
     *kind = pointer64;<br>
     if (auto ec = atomFromSymbolIndex(reloc.symbol, target))<br>
       return ec;<br>
-    *addend = readS64(swap, fixupContent);<br>
+    *addend = *(little64_t *)fixupContent;<br>
     return std::error_code();<br>
   case ARM64_RELOC_POINTER_TO_GOT              | rExtern | rLength8:<br>
     // ex: .quad _foo@GOT<br>
@@ -454,7 +458,7 @@ std::error_code ArchHandler_arm64::getPa<br>
     *kind = delta64;<br>
     if (auto ec = atomFromSymbolIndex(reloc2.symbol, target))<br>
       return ec;<br>
-    *addend = readS64(swap, fixupContent) + offsetInAtom;<br>
+    *addend = *(little64_t *)fixupContent + offsetInAtom;<br>
     return std::error_code();<br>
   case ((ARM64_RELOC_SUBTRACTOR                  | rExtern | rLength4) << 16 |<br>
          ARM64_RELOC_UNSIGNED                    | rExtern | rLength4):<br>
@@ -462,7 +466,7 @@ std::error_code ArchHandler_arm64::getPa<br>
     *kind = delta32;<br>
     if (auto ec = atomFromSymbolIndex(reloc2.symbol, target))<br>
       return ec;<br>
-    *addend = readS32(swap, fixupContent) + offsetInAtom;<br>
+    *addend = *(little32_t *)fixupContent + offsetInAtom;<br>
     return std::error_code();<br>
   default:<br>
     return make_dynamic_error_code(Twine("unsupported arm64 relocation pair"));<br>
@@ -494,86 +498,79 @@ void ArchHandler_arm64::generateAtomCont<br>
   }<br>
 }<br>
<br>
-void ArchHandler_arm64::applyFixupFinal(const Reference &ref, uint8_t *location,<br>
+void ArchHandler_arm64::applyFixupFinal(const Reference &ref, uint8_t *loc,<br>
                                         uint64_t fixupAddress,<br>
                                         uint64_t targetAddress,<br>
                                         uint64_t inAtomAddress) {<br>
   if (ref.kindNamespace() != Reference::KindNamespace::mach_o)<br>
     return;<br>
   assert(ref.kindArch() == Reference::KindArch::AArch64);<br>
-  int32_t *loc32 = reinterpret_cast<int32_t *>(location);<br>
-  uint64_t *loc64 = reinterpret_cast<uint64_t *>(location);<br>
+  ulittle32_t *loc32 = reinterpret_cast<ulittle32_t *>(loc);<br>
+  ulittle64_t *loc64 = reinterpret_cast<ulittle64_t *>(loc);<br>
   int32_t displacement;<br>
   uint32_t instruction;<br>
   uint32_t value32;<br>
   switch (static_cast<Arm64_Kinds>(ref.kindValue())) {<br>
   case branch26:<br>
     displacement = (targetAddress - fixupAddress) + ref.addend();<br>
-    value32 = setDisplacementInBranch26(*loc32, displacement);<br>
-    write32(*loc32, _swap, value32);<br>
+    *loc32 = setDisplacementInBranch26(*loc32, displacement);<br>
     return;<br>
   case page21:<br>
   case gotPage21:<br>
   case tlvPage21:<br>
     displacement =<br>
         ((targetAddress + ref.addend()) & (-4096)) - (fixupAddress & (-4096));<br>
-    value32 = setDisplacementInADRP(*loc32, displacement);<br>
-    write32(*loc32, _swap, value32);<br>
+    *loc32 = setDisplacementInADRP(*loc32, displacement);<br>
     return;<br>
   case offset12:<br>
   case gotOffset12:<br>
   case tlvOffset12:<br>
     displacement = (targetAddress + ref.addend()) & 0x00000FFF;<br>
-    value32 = setImm12(*loc32, displacement);<br>
-    write32(*loc32, _swap, value32);<br>
+    *loc32 = setImm12(*loc32, displacement);<br>
     return;<br>
   case offset12scale2:<br>
     displacement = (targetAddress + ref.addend()) & 0x00000FFF;<br>
     assert(((displacement & 0x1) == 0) &&<br>
            "scaled imm12 not accessing 2-byte aligneds");<br>
-    value32 = setImm12(*loc32, displacement >> 1);<br>
-    write32(*loc32, _swap, value32);<br>
+    *loc32 = setImm12(*loc32, displacement >> 1);<br>
     return;<br>
   case offset12scale4:<br>
     displacement = (targetAddress + ref.addend()) & 0x00000FFF;<br>
     assert(((displacement & 0x3) == 0) &&<br>
            "scaled imm12 not accessing 4-byte aligned");<br>
-    value32 = setImm12(*loc32, displacement >> 2);<br>
-    write32(*loc32, _swap, value32);<br>
+    *loc32 = setImm12(*loc32, displacement >> 2);<br>
     return;<br>
   case offset12scale8:<br>
     displacement = (targetAddress + ref.addend()) & 0x00000FFF;<br>
     assert(((displacement & 0x7) == 0) &&<br>
            "scaled imm12 not accessing 8-byte aligned");<br>
-    value32 = setImm12(*loc32, displacement >> 3);<br>
-    write32(*loc32, _swap, value32);<br>
+    *loc32 = setImm12(*loc32, displacement >> 3);<br>
     return;<br>
   case offset12scale16:<br>
     displacement = (targetAddress + ref.addend()) & 0x00000FFF;<br>
     assert(((displacement & 0xF) == 0) &&<br>
            "scaled imm12 not accessing 16-byte aligned");<br>
-    value32 = setImm12(*loc32, displacement >> 4);<br>
-    write32(*loc32, _swap, value32);<br>
+    *loc32 = setImm12(*loc32, displacement >> 4);<br>
     return;<br>
   case addOffset12:<br>
-    instruction = read32(_swap, *loc32);<br>
+    instruction = *loc32;<br>
     assert(((instruction & 0xFFC00000) == 0xF9400000) &&<br>
            "GOT reloc is not an LDR instruction");<br>
     displacement = (targetAddress + ref.addend()) & 0x00000FFF;<br>
     value32 = 0x91000000 | (instruction & 0x000003FF);<br>
     instruction = setImm12(value32, displacement);<br>
-    write32(*loc32, _swap, instruction);<br>
+    *loc32 = instruction;<br>
     return;<br>
   case pointer64:<br>
   case pointer64ToGOT:<br>
-    write64(*loc64, _swap, targetAddress + ref.addend());<br>
+    *loc64 = targetAddress + ref.addend();<br>
     return;<br>
   case delta64:<br>
-    write64(*loc64, _swap, (targetAddress - fixupAddress) + ref.addend());<br>
+    *loc64 = (targetAddress - fixupAddress) + ref.addend();<br>
     return;<br>
   case delta32:<br>
   case delta32ToGOT:<br>
-    write32(*loc32, _swap, (targetAddress - fixupAddress) + ref.addend());<br>
+    *loc32 = (targetAddress - fixupAddress) + ref.addend();<br>
     return;<br>
   case lazyPointer:<br>
   case lazyImmediateLocation:<br>
@@ -587,26 +584,23 @@ void ArchHandler_arm64::applyFixupFinal(<br>
 }<br>
<br>
 void ArchHandler_arm64::applyFixupRelocatable(const Reference &ref,<br>
-                                              uint8_t *location,<br>
+                                              uint8_t *loc,<br>
                                               uint64_t fixupAddress,<br>
                                               uint64_t targetAddress,<br>
                                               uint64_t inAtomAddress) {<br>
   if (ref.kindNamespace() != Reference::KindNamespace::mach_o)<br>
     return;<br>
   assert(ref.kindArch() == Reference::KindArch::AArch64);<br>
-  int32_t *loc32 = reinterpret_cast<int32_t *>(location);<br>
-  uint64_t *loc64 = reinterpret_cast<uint64_t *>(location);<br>
-  uint32_t value32;<br>
+  ulittle32_t *loc32 = reinterpret_cast<ulittle32_t *>(loc);<br>
+  ulittle64_t *loc64 = reinterpret_cast<ulittle64_t *>(loc);<br>
   switch (static_cast<Arm64_Kinds>(ref.kindValue())) {<br>
   case branch26:<br>
-    value32 = setDisplacementInBranch26(*loc32, 0);<br>
-    write32(*loc32, _swap, value32);<br>
+    *loc32 = setDisplacementInBranch26(*loc32, 0);<br>
     return;<br>
   case page21:<br>
   case gotPage21:<br>
   case tlvPage21:<br>
-    value32 = setDisplacementInADRP(*loc32, 0);<br>
-    write32(*loc32, _swap, value32);<br>
+    *loc32 = setDisplacementInADRP(*loc32, 0);<br>
     return;<br>
   case offset12:<br>
   case offset12scale2:<br>
@@ -615,23 +609,22 @@ void ArchHandler_arm64::applyFixupReloca<br>
   case offset12scale16:<br>
   case gotOffset12:<br>
   case tlvOffset12:<br>
-    value32 = setImm12(*loc32, 0);<br>
-    write32(*loc32, _swap, value32);<br>
+    *loc32 = setImm12(*loc32, 0);<br>
     return;<br>
   case pointer64:<br>
-    write64(*loc64, _swap, ref.addend());<br>
+    *loc64 = ref.addend();<br>
     return;<br>
   case delta64:<br>
-    write64(*loc64, _swap, ref.addend() + inAtomAddress - fixupAddress);<br>
+    *loc64 = ref.addend() + inAtomAddress - fixupAddress;<br>
     return;<br>
   case delta32:<br>
-    write32(*loc32, _swap, ref.addend() + inAtomAddress - fixupAddress);<br>
+    *loc32 = ref.addend() + inAtomAddress - fixupAddress;<br>
     return;<br>
   case pointer64ToGOT:<br>
-    write64(*loc64, _swap, 0);<br>
+    *loc64 = 0;<br>
     return;<br>
   case delta32ToGOT:<br>
-    write32(*loc32, _swap, -fixupAddress);<br>
+    *loc32 = -fixupAddress;<br>
     return;<br>
   case addOffset12:<br>
     llvm_unreachable("lazy reference kind implies GOT pass was run");<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/MachO/ArchHandler_x86.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/ArchHandler_x86.cpp?rev=220730&r1=220729&r2=220730&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/ArchHandler_x86.cpp?rev=220730&r1=220729&r2=220730&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/lib/ReaderWriter/MachO/ArchHandler_x86.cpp (original)<br>
+++ lld/trunk/lib/ReaderWriter/MachO/ArchHandler_x86.cpp Mon Oct 27 17:48:35 2014<br>
@@ -13,6 +13,8 @@<br>
 #include "llvm/ADT/StringRef.h"<br>
 #include "llvm/ADT/StringSwitch.h"<br>
 #include "llvm/ADT/Triple.h"<br>
+<br>
+#include "llvm/Support/Endian.h"<br>
 #include "llvm/Support/ErrorHandling.h"<br>
<br>
 using namespace llvm::MachO;<br>
@@ -21,6 +23,12 @@ using namespace lld::mach_o::normalized;<br>
 namespace lld {<br>
 namespace mach_o {<br>
<br>
+using llvm::support::ulittle16_t;<br>
+using llvm::support::ulittle32_t;<br>
+<br>
+using llvm::support::little16_t;<br>
+using llvm::support::little32_t;<br>
+<br>
 class ArchHandler_x86 : public ArchHandler {<br>
 public:<br>
            ArchHandler_x86();<br>
@@ -156,16 +164,13 @@ private:<br>
                              uint64_t fixupAddress,<br>
                              uint64_t targetAddress,<br>
                              uint64_t inAtomAddress);<br>
-<br>
-  const bool _swap;<br>
 };<br>
<br>
 //===----------------------------------------------------------------------===//<br>
 //  ArchHandler_x86<br>
 //===----------------------------------------------------------------------===//<br>
<br>
-ArchHandler_x86::ArchHandler_x86() :<br>
-  _swap(!MachOLinkingContext::isHostEndian(MachOLinkingContext::arch_x86)) {}<br>
+ArchHandler_x86::ArchHandler_x86() {}<br>
<br>
 ArchHandler_x86::~ArchHandler_x86() { }<br>
<br>
@@ -257,18 +262,18 @@ ArchHandler_x86::getReferenceInfo(const<br>
     *kind = branch32;<br>
     if (E ec = atomFromSymbolIndex(reloc.symbol, target))<br>
       return ec;<br>
-    *addend = fixupAddress + 4 + readS32(swap, fixupContent);<br>
+    *addend = fixupAddress + 4 + *(little32_t *)fixupContent;<br>
     break;<br>
   case GENERIC_RELOC_VANILLA | rPcRel | rLength4:<br>
     // ex: call _foo (and _foo defined)<br>
     *kind = branch32;<br>
-    targetAddress = fixupAddress + 4 + readS32(swap, fixupContent);<br>
+    targetAddress = fixupAddress + 4 + *(little32_t *)fixupContent;<br>
     return atomFromAddress(reloc.symbol, targetAddress, target, addend);<br>
     break;<br>
   case GENERIC_RELOC_VANILLA | rScattered | rPcRel | rLength4:<br>
     // ex: call _foo+n (and _foo defined)<br>
     *kind = branch32;<br>
-    targetAddress = fixupAddress + 4 + readS32(swap, fixupContent);<br>
+    targetAddress = fixupAddress + 4 + *(little32_t *)fixupContent;<br>
     if (E ec = atomFromAddress(0, reloc.value, target, addend))<br>
       return ec;<br>
     *addend = targetAddress - reloc.value;<br>
@@ -278,18 +283,18 @@ ArchHandler_x86::getReferenceInfo(const<br>
     *kind = branch16;<br>
     if (E ec = atomFromSymbolIndex(reloc.symbol, target))<br>
       return ec;<br>
-    *addend = fixupAddress + 2 + readS16(swap, fixupContent);<br>
+    *addend = fixupAddress + 2 + *(little16_t *)fixupContent;<br>
     break;<br>
   case GENERIC_RELOC_VANILLA | rPcRel | rLength2:<br>
     // ex: callw _foo (and _foo defined)<br>
     *kind = branch16;<br>
-    targetAddress = fixupAddress + 2 + readS16(swap, fixupContent);<br>
+  targetAddress = fixupAddress + 2 + *(little16_t *)fixupContent;<br>
     return atomFromAddress(reloc.symbol, targetAddress, target, addend);<br>
     break;<br>
   case GENERIC_RELOC_VANILLA | rScattered | rPcRel | rLength2:<br>
     // ex: callw _foo+n (and _foo defined)<br>
     *kind = branch16;<br>
-    targetAddress = fixupAddress + 2 + readS16(swap, fixupContent);<br>
+    targetAddress = fixupAddress + 2 + *(little16_t *)fixupContent;<br>
     if (E ec = atomFromAddress(0, reloc.value, target, addend))<br>
       return ec;<br>
     *addend = targetAddress - reloc.value;<br>
@@ -303,7 +308,7 @@ ArchHandler_x86::getReferenceInfo(const<br>
                                                                  : pointer32;<br>
     if (E ec = atomFromSymbolIndex(reloc.symbol, target))<br>
       return ec;<br>
-    *addend = readU32(swap, fixupContent);<br>
+    *addend = *(ulittle32_t *)fixupContent;<br>
     break;<br>
   case GENERIC_RELOC_VANILLA | rLength4:<br>
     // ex: movl        _foo, %eax   (and _foo defined)<br>
@@ -312,7 +317,7 @@ ArchHandler_x86::getReferenceInfo(const<br>
     *kind =<br>
         ((perms & DefinedAtom::permR_X) == DefinedAtom::permR_X) ? abs32<br>
                                                                  : pointer32;<br>
-    targetAddress = readU32(swap, fixupContent);<br>
+    targetAddress = *(ulittle32_t *)fixupContent;<br>
     return atomFromAddress(reloc.symbol, targetAddress, target, addend);<br>
     break;<br>
   case GENERIC_RELOC_VANILLA | rScattered | rLength4:<br>
@@ -323,7 +328,7 @@ ArchHandler_x86::getReferenceInfo(const<br>
                                                                  : pointer32;<br>
     if (E ec = atomFromAddress(0, reloc.value, target, addend))<br>
       return ec;<br>
-    *addend = readU32(swap, fixupContent) - reloc.value;<br>
+    *addend = *(ulittle32_t *)fixupContent - reloc.value;<br>
     break;<br>
   default:<br>
     return make_dynamic_error_code(Twine("unsupported i386 relocation type"));<br>
@@ -359,7 +364,7 @@ ArchHandler_x86::getPairReferenceInfo(co<br>
          GENERIC_RELOC_PAIR | rScattered | rLength4):<br>
     toAddress = reloc1.value;<br>
     fromAddress = reloc2.value;<br>
-    value = readS32(swap, fixupContent);<br>
+    value = *(little32_t *)fixupContent;<br>
     ec = atomFromAddr(0, toAddress, target, &offsetInTo);<br>
     if (ec)<br>
       return ec;<br>
@@ -425,34 +430,33 @@ void ArchHandler_x86::generateAtomConten<br>
   }<br>
 }<br>
<br>
-void ArchHandler_x86::applyFixupFinal(const Reference &ref, uint8_t *location,<br>
+void ArchHandler_x86::applyFixupFinal(const Reference &ref, uint8_t *loc,<br>
                                       uint64_t fixupAddress,<br>
                                       uint64_t targetAddress,<br>
                                       uint64_t inAtomAddress) {<br>
   if (ref.kindNamespace() != Reference::KindNamespace::mach_o)<br>
     return;<br>
   assert(ref.kindArch() == Reference::KindArch::x86);<br>
-  int32_t *loc32 = reinterpret_cast<int32_t *>(location);<br>
-  int16_t *loc16 = reinterpret_cast<int16_t *>(location);<br>
+  ulittle32_t *loc32 = reinterpret_cast<ulittle32_t *>(loc);<br>
   switch (ref.kindValue()) {<br>
   case branch32:<br>
-    write32(*loc32, _swap, (targetAddress - (fixupAddress + 4)) + ref.addend());<br>
+    *loc32 = (targetAddress - (fixupAddress + 4)) + ref.addend();<br>
     break;<br>
   case branch16:<br>
-    write16(*loc16, _swap, (targetAddress - (fixupAddress + 2)) + ref.addend());<br>
+    *loc32 = (targetAddress - (fixupAddress + 2)) + ref.addend();<br>
     break;<br>
   case pointer32:<br>
   case abs32:<br>
-    write32(*loc32, _swap, targetAddress + ref.addend());<br>
+    *loc32 = targetAddress + ref.addend();<br>
     break;<br>
   case funcRel32:<br>
-    write32(*loc32, _swap, targetAddress - inAtomAddress + ref.addend());<br>
+    *loc32 = targetAddress - inAtomAddress + ref.addend();<br>
     break;<br>
   case delta32:<br>
-    write32(*loc32, _swap, targetAddress - fixupAddress + ref.addend());<br>
+    *loc32 = targetAddress - fixupAddress + ref.addend();<br>
     break;<br>
   case negDelta32:<br>
-    write32(*loc32, _swap, fixupAddress - targetAddress + ref.addend());<br>
+    *loc32 = fixupAddress - targetAddress + ref.addend();<br>
     break;<br>
   case modeCode:<br>
   case modeData:<br>
@@ -467,38 +471,38 @@ void ArchHandler_x86::applyFixupFinal(co<br>
 }<br>
<br>
 void ArchHandler_x86::applyFixupRelocatable(const Reference &ref,<br>
-                                               uint8_t *location,<br>
+                                               uint8_t *loc,<br>
                                                uint64_t fixupAddress,<br>
                                                uint64_t targetAddress,<br>
                                                uint64_t inAtomAddress) {<br>
-  int32_t *loc32 = reinterpret_cast<int32_t *>(location);<br>
-  int16_t *loc16 = reinterpret_cast<int16_t *>(location);<br>
   bool useExternalReloc = useExternalRelocationTo(*ref.target());<br>
+  ulittle16_t *loc16 = reinterpret_cast<ulittle16_t *>(loc);<br>
+  ulittle32_t *loc32 = reinterpret_cast<ulittle32_t *>(loc);<br>
   switch (ref.kindValue()) {<br>
   case branch32:<br>
     if (useExternalReloc)<br>
-      write32(*loc32, _swap, ref.addend() - (fixupAddress + 4));<br>
+      *loc32 = ref.addend() - (fixupAddress + 4);<br>
     else<br>
-      write32(*loc32, _swap, (targetAddress - (fixupAddress+4)) + ref.addend());<br>
+      *loc32  =(targetAddress - (fixupAddress+4)) + ref.addend();<br>
     break;<br>
   case branch16:<br>
     if (useExternalReloc)<br>
-      write16(*loc16, _swap, ref.addend() - (fixupAddress + 2));<br>
+      *loc16 = ref.addend() - (fixupAddress + 2);<br>
     else<br>
-      write16(*loc16, _swap, (targetAddress - (fixupAddress+2)) + ref.addend());<br>
+      *loc16 = (targetAddress - (fixupAddress+2)) + ref.addend();<br>
     break;<br>
   case pointer32:<br>
   case abs32:<br>
-    write32(*loc32, _swap, targetAddress + ref.addend());<br>
+    *loc32 = targetAddress + ref.addend();<br>
     break;<br>
   case funcRel32:<br>
-    write32(*loc32, _swap, targetAddress - inAtomAddress + ref.addend()); // FIXME<br>
+    *loc32 = targetAddress - inAtomAddress + ref.addend(); // FIXME<br>
     break;<br>
   case delta32:<br>
-    write32(*loc32, _swap, targetAddress - fixupAddress + ref.addend());<br>
+    *loc32 = targetAddress - fixupAddress + ref.addend();<br>
     break;<br>
   case negDelta32:<br>
-    write32(*loc32, _swap, fixupAddress - targetAddress + ref.addend());<br>
+    *loc32 = fixupAddress - targetAddress + ref.addend();<br>
     break;<br>
   case modeCode:<br>
   case modeData:<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/MachO/ArchHandler_x86_64.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/ArchHandler_x86_64.cpp?rev=220730&r1=220729&r2=220730&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/ArchHandler_x86_64.cpp?rev=220730&r1=220729&r2=220730&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/lib/ReaderWriter/MachO/ArchHandler_x86_64.cpp (original)<br>
+++ lld/trunk/lib/ReaderWriter/MachO/ArchHandler_x86_64.cpp Mon Oct 27 17:48:35 2014<br>
@@ -13,6 +13,8 @@<br>
 #include "llvm/ADT/StringRef.h"<br>
 #include "llvm/ADT/StringSwitch.h"<br>
 #include "llvm/ADT/Triple.h"<br>
+<br>
+#include "llvm/Support/Endian.h"<br>
 #include "llvm/Support/ErrorHandling.h"<br>
<br>
 using namespace llvm::MachO;<br>
@@ -21,6 +23,12 @@ using namespace lld::mach_o::normalized;<br>
 namespace lld {<br>
 namespace mach_o {<br>
<br>
+using llvm::support::ulittle32_t;<br>
+using llvm::support::ulittle64_t;<br>
+<br>
+using llvm::support::little32_t;<br>
+using llvm::support::little64_t;<br>
+<br>
 class ArchHandler_x86_64 : public ArchHandler {<br>
 public:<br>
            ArchHandler_x86_64();<br>
@@ -200,13 +208,10 @@ private:<br>
                              uint64_t fixupAddress,<br>
                              uint64_t targetAddress,<br>
                              uint64_t inAtomAddress);<br>
-<br>
-  const bool _swap;<br>
 };<br>
<br>
<br>
-ArchHandler_x86_64::ArchHandler_x86_64() :<br>
-  _swap(!MachOLinkingContext::isHostEndian(MachOLinkingContext::arch_x86_64)) {}<br>
+ArchHandler_x86_64::ArchHandler_x86_64() { }<br>
<br>
 ArchHandler_x86_64::~ArchHandler_x86_64() { }<br>
<br>
@@ -335,25 +340,25 @@ ArchHandler_x86_64::getReferenceInfo(con<br>
   case ripRel32:<br>
     if (E ec = atomFromSymbolIndex(reloc.symbol, target))<br>
       return ec;<br>
-    *addend = readS32(swap, fixupContent);<br>
+    *addend = *(little32_t *)fixupContent;<br>
     return std::error_code();<br>
   case ripRel32Minus1:<br>
     if (E ec = atomFromSymbolIndex(reloc.symbol, target))<br>
       return ec;<br>
-    *addend = readS32(swap, fixupContent) + 1;<br>
+    *addend = *(little32_t *)fixupContent + 1;<br>
     return std::error_code();<br>
   case ripRel32Minus2:<br>
     if (E ec = atomFromSymbolIndex(reloc.symbol, target))<br>
       return ec;<br>
-    *addend = readS32(swap, fixupContent) + 2;<br>
+    *addend = *(little32_t *)fixupContent + 2;<br>
     return std::error_code();<br>
   case ripRel32Minus4:<br>
     if (E ec = atomFromSymbolIndex(reloc.symbol, target))<br>
       return ec;<br>
-    *addend = readS32(swap, fixupContent) + 4;<br>
+    *addend = *(little32_t *)fixupContent + 4;<br>
     return std::error_code();<br>
   case ripRel32Anon:<br>
-    targetAddress = fixupAddress + 4 + readS32(swap, fixupContent);<br>
+    targetAddress = fixupAddress + 4 + *(little32_t *)fixupContent;<br>
     return atomFromAddress(reloc.symbol, targetAddress, target, addend);<br>
   case ripRel32GotLoad:<br>
   case ripRel32Got:<br>
@@ -364,10 +369,10 @@ ArchHandler_x86_64::getReferenceInfo(con<br>
   case pointer64:<br>
     if (E ec = atomFromSymbolIndex(reloc.symbol, target))<br>
       return ec;<br>
-    *addend = readS64(swap, fixupContent);<br>
+    *addend = *(little64_t *)fixupContent;<br>
     return std::error_code();<br>
   case pointer64Anon:<br>
-    targetAddress = readS64(swap, fixupContent);<br>
+    targetAddress = *(little64_t *)fixupContent;<br>
     return atomFromAddress(reloc.symbol, targetAddress, target, addend);<br>
   default:<br>
     llvm_unreachable("bad reloc kind");<br>
@@ -422,18 +427,18 @@ ArchHandler_x86_64::getPairReferenceInfo<br>
   case delta64:<br>
     if (E ec = atomFromSymbolIndex(reloc2.symbol, target))<br>
       return ec;<br>
-    *addend = readS64(swap, fixupContent) + offsetInAtom;<br>
+    *addend = *(little64_t *)fixupContent + offsetInAtom;<br>
     return std::error_code();<br>
   case delta32:<br>
     if (E ec = atomFromSymbolIndex(reloc2.symbol, target))<br>
       return ec;<br>
-    *addend = readS32(swap, fixupContent) + offsetInAtom;<br>
+    *addend = *(little32_t *)fixupContent + offsetInAtom;<br>
     return std::error_code();<br>
   case delta64Anon:<br>
-    targetAddress = offsetInAtom + readS64(swap, fixupContent);<br>
+    targetAddress = offsetInAtom + *(little64_t *)fixupContent;<br>
     return atomFromAddress(reloc2.symbol, targetAddress, target, addend);<br>
   case delta32Anon:<br>
-    targetAddress = offsetInAtom + readS32(swap, fixupContent);<br>
+    targetAddress = offsetInAtom + *(little32_t *)fixupContent;<br>
     return atomFromAddress(reloc2.symbol, targetAddress, target, addend);<br>
   default:<br>
     llvm_unreachable("bad reloc pair kind");<br>
@@ -468,52 +473,52 @@ void ArchHandler_x86_64::generateAtomCon<br>
 }<br>
<br>
 void ArchHandler_x86_64::applyFixupFinal(<br>
-    const Reference &ref, uint8_t *location, uint64_t fixupAddress,<br>
+    const Reference &ref, uint8_t *loc, uint64_t fixupAddress,<br>
     uint64_t targetAddress, uint64_t inAtomAddress, uint64_t imageBaseAddress,<br>
     FindAddressForAtom findSectionAddress) {<br>
+  ulittle32_t *loc32 = reinterpret_cast<ulittle32_t *>(loc);<br>
+  ulittle64_t *loc64 = reinterpret_cast<ulittle64_t *>(loc);<br>
   if (ref.kindNamespace() != Reference::KindNamespace::mach_o)<br>
     return;<br>
   assert(ref.kindArch() == Reference::KindArch::x86_64);<br>
-  int32_t *loc32 = reinterpret_cast<int32_t *>(location);<br>
-  uint64_t *loc64 = reinterpret_cast<uint64_t *>(location);<br>
   switch (static_cast<X86_64_Kinds>(ref.kindValue())) {<br>
   case branch32:<br>
   case ripRel32:<br>
   case ripRel32Anon:<br>
   case ripRel32Got:<br>
   case ripRel32GotLoad:<br>
-    write32(*loc32, _swap, (targetAddress - (fixupAddress + 4)) + ref.addend());<br>
+    *loc32 = targetAddress - (fixupAddress + 4) + ref.addend();<br>
     return;<br>
   case pointer64:<br>
   case pointer64Anon:<br>
-    write64(*loc64, _swap, targetAddress + ref.addend());<br>
+    *loc64 = targetAddress + ref.addend();<br>
     return;<br>
   case ripRel32Minus1:<br>
-    write32(*loc32, _swap, (targetAddress - (fixupAddress + 5)) + ref.addend());<br>
+    *loc32 = targetAddress - (fixupAddress + 5) + ref.addend();<br>
     return;<br>
   case ripRel32Minus2:<br>
-    write32(*loc32, _swap, (targetAddress - (fixupAddress + 6)) + ref.addend());<br>
+    *loc32 = targetAddress - (fixupAddress + 6) + ref.addend();<br>
     return;<br>
   case ripRel32Minus4:<br>
-    write32(*loc32, _swap, (targetAddress - (fixupAddress + 8)) + ref.addend());<br>
+    *loc32 = targetAddress - (fixupAddress + 8) + ref.addend();<br>
     return;<br>
   case delta32:<br>
   case delta32Anon:<br>
-    write32(*loc32, _swap, (targetAddress - fixupAddress) + ref.addend());<br>
+    *loc32 = targetAddress - fixupAddress + ref.addend();<br>
     return;<br>
   case delta64:<br>
   case delta64Anon:<br>
   case unwindFDEToFunction:<br>
-    write64(*loc64, _swap, (targetAddress - fixupAddress) + ref.addend());<br>
+    *loc64 = targetAddress - fixupAddress + ref.addend();<br>
     return;<br>
   case ripRel32GotLoadNowLea:<br>
     // Change MOVQ to LEA<br>
-    assert(location[-2] == 0x8B);<br>
-    location[-2] = 0x8D;<br>
-    write32(*loc32, _swap, (targetAddress - (fixupAddress + 4)) + ref.addend());<br>
+    assert(loc[-2] == 0x8B);<br>
+    loc[-2] = 0x8D;<br>
+    *loc32 = targetAddress - (fixupAddress + 4) + ref.addend();<br>
     return;<br>
   case negDelta32:<br>
-    write32(*loc32, _swap, fixupAddress - targetAddress + ref.addend());<br>
+    *loc32 = fixupAddress - targetAddress + ref.addend();<br>
     return;<br>
   case lazyPointer:<br>
   case lazyImmediateLocation:<br>
@@ -521,13 +526,12 @@ void ArchHandler_x86_64::applyFixupFinal<br>
     return;<br>
   case imageOffset:<br>
   case imageOffsetGot:<br>
-    write32(*loc32, _swap, (targetAddress - imageBaseAddress) + ref.addend());<br>
+    *loc32 = (targetAddress - imageBaseAddress) + ref.addend();<br>
     return;<br>
   case unwindInfoToEhFrame: {<br>
     uint64_t val = targetAddress - findSectionAddress(*ref.target()) + ref.addend();<br>
     assert(val < 0xffffffU && "offset in __eh_frame too large");<br>
-    uint32_t encoding = read32(_swap, *loc32) & 0xff000000U;<br>
-    write32(*loc32, _swap, encoding | val);<br>
+    *loc32 = (*loc32 & 0xff000000U) | val;<br>
     return;<br>
   }<br>
   case invalid:<br>
@@ -539,51 +543,51 @@ void ArchHandler_x86_64::applyFixupFinal<br>
<br>
<br>
 void ArchHandler_x86_64::applyFixupRelocatable(const Reference &ref,<br>
-                                               uint8_t *location,<br>
+                                               uint8_t *loc,<br>
                                                uint64_t fixupAddress,<br>
                                                uint64_t targetAddress,<br>
                                                uint64_t inAtomAddress)  {<br>
-  int32_t *loc32 = reinterpret_cast<int32_t *>(location);<br>
-  uint64_t *loc64 = reinterpret_cast<uint64_t *>(location);<br>
+  ulittle32_t *loc32 = reinterpret_cast<ulittle32_t *>(loc);<br>
+  ulittle64_t *loc64 = reinterpret_cast<ulittle64_t *>(loc);<br>
   switch (static_cast<X86_64_Kinds>(ref.kindValue())) {<br>
   case branch32:<br>
   case ripRel32:<br>
   case ripRel32Got:<br>
   case ripRel32GotLoad:<br>
-    write32(*loc32, _swap, ref.addend());<br>
+    *loc32 = ref.addend();<br>
     return;<br>
   case ripRel32Anon:<br>
-    write32(*loc32, _swap, (targetAddress - (fixupAddress + 4)) + ref.addend());<br>
+    *loc32 = (targetAddress - (fixupAddress + 4)) + ref.addend();<br>
     return;<br>
   case pointer64:<br>
-    write64(*loc64, _swap, ref.addend());<br>
+    *loc64 = ref.addend();<br>
     return;<br>
   case pointer64Anon:<br>
-    write64(*loc64, _swap, targetAddress + ref.addend());<br>
+    *loc64 = targetAddress + ref.addend();<br>
     return;<br>
   case ripRel32Minus1:<br>
-    write32(*loc32, _swap, ref.addend() - 1);<br>
+    *loc32 = ref.addend() - 1;<br>
     return;<br>
   case ripRel32Minus2:<br>
-    write32(*loc32, _swap, ref.addend() - 2);<br>
+    *loc32 = ref.addend() - 2;<br>
     return;<br>
   case ripRel32Minus4:<br>
-    write32(*loc32, _swap, ref.addend() - 4);<br>
+    *loc32 = ref.addend() - 4;<br>
     return;<br>
   case delta32:<br>
-    write32(*loc32, _swap, ref.addend() + inAtomAddress - fixupAddress);<br>
+    *loc32 = ref.addend() + inAtomAddress - fixupAddress;<br>
     return;<br>
   case delta32Anon:<br>
-    write32(*loc32, _swap, (targetAddress - fixupAddress) + ref.addend());<br>
+    *loc32 = (targetAddress - fixupAddress) + ref.addend();<br>
     return;<br>
   case delta64:<br>
-    write64(*loc64, _swap, ref.addend() + inAtomAddress - fixupAddress);<br>
+    *loc64 = ref.addend() + inAtomAddress - fixupAddress;<br>
     return;<br>
   case delta64Anon:<br>
-    write64(*loc64, _swap, (targetAddress - fixupAddress) + ref.addend());<br>
+    *loc64 = (targetAddress - fixupAddress) + ref.addend();<br>
     return;<br>
   case negDelta32:<br>
-    write32(*loc32, _swap, fixupAddress - targetAddress + ref.addend());<br>
+    *loc32 = fixupAddress - targetAddress + ref.addend();<br>
     return;<br>
   case ripRel32GotLoadNowLea:<br>
     llvm_unreachable("ripRel32GotLoadNowLea implies GOT pass was run");<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/MachO/CompactUnwindPass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/CompactUnwindPass.cpp?rev=220730&r1=220729&r2=220730&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/CompactUnwindPass.cpp?rev=220730&r1=220729&r2=220730&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/lib/ReaderWriter/MachO/CompactUnwindPass.cpp (original)<br>
+++ lld/trunk/lib/ReaderWriter/MachO/CompactUnwindPass.cpp Mon Oct 27 17:48:35 2014<br>
@@ -66,7 +66,7 @@ struct UnwindInfoPage {<br>
<br>
 class UnwindInfoAtom : public SimpleDefinedAtom {<br>
 public:<br>
-  UnwindInfoAtom(ArchHandler &archHandler, const File &file, bool swap,<br>
+  UnwindInfoAtom(ArchHandler &archHandler, const File &file, bool isBig,<br>
                  std::vector<uint32_t> commonEncodings,<br>
                  std::vector<const Atom *> personalities,<br>
                  std::vector<UnwindInfoPage> pages, uint32_t numLSDAs)<br>
@@ -79,7 +79,7 @@ public:<br>
         _lsdaIndexOffset(_topLevelIndexOffset +<br>
                          3 * (pages.size() + 1) * sizeof(uint32_t)),<br>
         _firstPageOffset(_lsdaIndexOffset + 2 * numLSDAs * sizeof(uint32_t)),<br>
-        _swap(swap) {<br>
+        _isBig(isBig) {<br>
<br>
     addHeader(commonEncodings.size(), personalities.size(), pages.size());<br>
     addCommonEncodings(commonEncodings);<br>
@@ -110,21 +110,22 @@ public:<br>
     uint32_t headerSize = 7 * sizeof(uint32_t);<br>
     _contents.resize(headerSize);<br>
<br>
-    int32_t *headerEntries = (int32_t *)_contents.data();<br>
+    uint8_t *headerEntries = _contents.data();<br>
     // version<br>
-    write32(headerEntries[0], _swap, 1);<br>
+    write32(headerEntries, 1, _isBig);<br>
     // commonEncodingsArraySectionOffset<br>
-    write32(headerEntries[1], _swap, _commonEncodingsOffset);<br>
+    write32(headerEntries + sizeof(uint32_t), _commonEncodingsOffset, _isBig);<br>
     // commonEncodingsArrayCount<br>
-    write32(headerEntries[2], _swap, numCommon);<br>
+    write32(headerEntries + 2 * sizeof(uint32_t), numCommon, _isBig);<br>
     // personalityArraySectionOffset<br>
-    write32(headerEntries[3], _swap, _personalityArrayOffset);<br>
+    write32(headerEntries + 3 * sizeof(uint32_t), _personalityArrayOffset,<br>
+            _isBig);<br>
     // personalityArrayCount<br>
-    write32(headerEntries[4], _swap, numPersonalities);<br>
+    write32(headerEntries + 4 * sizeof(uint32_t), numPersonalities, _isBig);<br>
     // indexSectionOffset<br>
-    write32(headerEntries[5], _swap, _topLevelIndexOffset);<br>
+    write32(headerEntries + 5 * sizeof(uint32_t), _topLevelIndexOffset, _isBig);<br>
     // indexCount<br>
-    write32(headerEntries[6], _swap, numPages + 1);<br>
+    write32(headerEntries + 6 * sizeof(uint32_t), numPages + 1, _isBig);<br>
   }<br>
<br>
   /// Add the list of common encodings to the section; this is simply an array<br>
@@ -134,11 +135,13 @@ public:<br>
<br>
     _contents.resize(_commonEncodingsOffset +<br>
                      commonEncodings.size() * sizeof(uint32_t));<br>
-    int32_t *commonEncodingsArea =<br>
-        reinterpret_cast<int32_t *>(_contents.data() + _commonEncodingsOffset);<br>
+    uint8_t *commonEncodingsArea =<br>
+        reinterpret_cast<uint8_t *>(_contents.data() + _commonEncodingsOffset);<br>
<br>
-    for (uint32_t encoding : commonEncodings)<br>
-      write32(*commonEncodingsArea++, _swap, encoding);<br>
+    for (uint32_t encoding : commonEncodings) {<br>
+      write32(commonEncodingsArea, encoding, _isBig);<br>
+      commonEncodingsArea += sizeof(uint32_t);<br>
+    }<br>
   }<br>
<br>
   void addPersonalityFunctions(std::vector<const Atom *> personalities) {<br>
@@ -160,16 +163,16 @@ public:<br>
<br>
     // The most difficult job here is calculating the LSDAs; everything else<br>
     // follows fairly naturally, but we can't state where the first<br>
-    int32_t *indexData = (int32_t *)&_contents[_topLevelIndexOffset];<br>
+    uint8_t *indexData = &_contents[_topLevelIndexOffset];<br>
     uint32_t numLSDAs = 0;<br>
     for (unsigned i = 0; i < pages.size(); ++i) {<br>
       // functionOffset<br>
       addImageReference(_topLevelIndexOffset + 3 * i * sizeof(uint32_t),<br>
                         pages[i].entries[0].rangeStart);<br>
       // secondLevelPagesSectionOffset<br>
-      write32(indexData[3 * i + 1], _swap, pageLoc);<br>
-      write32(indexData[3 * i + 2], _swap,<br>
-              _lsdaIndexOffset + numLSDAs * 2 * sizeof(uint32_t));<br>
+      write32(indexData + (3 * i + 1) * sizeof(uint32_t), pageLoc, _isBig);<br>
+      write32(indexData + (3 * i + 2) * sizeof(uint32_t),<br>
+              _lsdaIndexOffset + numLSDAs * 2 * sizeof(uint32_t), _isBig);<br>
<br>
       for (auto &entry : pages[i].entries)<br>
         if (entry.lsdaLocation)<br>
@@ -182,8 +185,8 @@ public:<br>
                           3 * pages.size() * sizeof(uint32_t),<br>
                       finalEntry.rangeStart, finalEntry.rangeLength);<br>
     // secondLevelPagesSectionOffset => 0<br>
-    indexData[3 * pages.size() + 2] =<br>
-        _lsdaIndexOffset + numLSDAs * 2 * sizeof(uint32_t);<br>
+    write32(indexData + (3 * pages.size() + 2) * sizeof(uint32_t),<br>
+            _lsdaIndexOffset + numLSDAs * 2 * sizeof(uint32_t), _isBig);<br>
   }<br>
<br>
   void addLSDAIndexes(std::vector<UnwindInfoPage> &pages, uint32_t numLSDAs) {<br>
@@ -218,18 +221,17 @@ public:<br>
     using normalized::write32;<br>
     using normalized::write16;<br>
     // 2 => regular page<br>
-    write32(*(int32_t *)&_contents[curPageOffset], _swap, 2);<br>
+    write32(&_contents[curPageOffset], 2, _isBig);<br>
     // offset of 1st entry<br>
-    write16(*(int16_t *)&_contents[curPageOffset + 4], _swap, headerSize);<br>
-    write16(*(int16_t *)&_contents[curPageOffset + 6], _swap,<br>
-            page.entries.size());<br>
+    write16(&_contents[curPageOffset + 4], headerSize, _isBig);<br>
+    write16(&_contents[curPageOffset + 6], page.entries.size(), _isBig);<br>
<br>
     uint32_t pagePos = curPageOffset + headerSize;<br>
     for (auto &entry : page.entries) {<br>
       addImageReference(pagePos, entry.rangeStart);<br>
<br>
-      write32(reinterpret_cast<int32_t *>(_contents.data() + pagePos)[1], _swap,<br>
-              entry.encoding);<br>
+      write32(_contents.data() + pagePos + sizeof(uint32_t), entry.encoding,<br>
+              _isBig);<br>
       if ((entry.encoding & 0x0f000000U) ==<br>
           _archHandler.dwarfCompactUnwindType())<br>
         addEhFrameReference(pagePos + sizeof(uint32_t), entry.ehFrame);<br>
@@ -263,7 +265,7 @@ private:<br>
   uint32_t _topLevelIndexOffset;<br>
   uint32_t _lsdaIndexOffset;<br>
   uint32_t _firstPageOffset;<br>
-  bool _swap;<br>
+  bool _isBig;<br>
 };<br>
<br>
 /// Pass for instantiating and optimizing GOT slots.<br>
@@ -273,7 +275,7 @@ public:<br>
   CompactUnwindPass(const MachOLinkingContext &context)<br>
       : _context(context), _archHandler(_context.archHandler()),<br>
         _file("<mach-o Compact Unwind Pass>"),<br>
-        _swap(!MachOLinkingContext::isHostEndian(_context.arch())) {}<br>
+        _isBig(MachOLinkingContext::isBigEndian(_context.arch())) {}<br>
<br>
 private:<br>
   void perform(std::unique_ptr<MutableFile> &mergedFile) override {<br>
@@ -337,7 +339,7 @@ private:<br>
<br>
     // FIXME: we should also erase all compact-unwind atoms; their job is done.<br>
     UnwindInfoAtom *unwind = new (_file.allocator())<br>
-        UnwindInfoAtom(_archHandler, _file, _swap, std::vector<uint32_t>(),<br>
+        UnwindInfoAtom(_archHandler, _file, _isBig, std::vector<uint32_t>(),<br>
                        personalities, pages, numLSDAs);<br>
     mergedFile->addAtom(*unwind);<br>
   }<br>
@@ -404,8 +406,9 @@ private:<br>
<br>
     using normalized::read32;<br>
     entry.rangeLength =<br>
-        read32(_swap, ((uint32_t *)atom->rawContent().data())[2]);<br>
-    entry.encoding = read32(_swap, ((uint32_t *)atom->rawContent().data())[3]);<br>
+        read32(atom->rawContent().data() + 2 * sizeof(uint32_t), _isBig);<br>
+    entry.encoding =<br>
+        read32(atom->rawContent().data() + 3 * sizeof(uint32_t), _isBig);<br>
     return entry;<br>
   }<br>
<br>
@@ -415,7 +418,7 @@ private:<br>
     for (const DefinedAtom *ehFrameAtom : mergedFile->defined()) {<br>
       if (ehFrameAtom->contentType() != DefinedAtom::typeCFI)<br>
         continue;<br>
-      if (ArchHandler::isDwarfCIE(_swap, ehFrameAtom))<br>
+      if (ArchHandler::isDwarfCIE(_isBig, ehFrameAtom))<br>
         continue;<br>
<br>
       if (const Atom *function = _archHandler.fdeTargetFunction(ehFrameAtom))<br>
@@ -506,7 +509,7 @@ private:<br>
   const MachOLinkingContext &_context;<br>
   mach_o::ArchHandler &_archHandler;<br>
   MachOFile _file;<br>
-  bool _swap;<br>
+  bool _isBig;<br>
 };<br>
<br>
 void addCompactUnwindPass(PassManager &pm, const MachOLinkingContext &ctx) {<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryReader.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryReader.cpp?rev=220730&r1=220729&r2=220730&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryReader.cpp?rev=220730&r1=220729&r2=220730&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryReader.cpp (original)<br>
+++ lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryReader.cpp Mon Oct 27 17:48:35 2014<br>
@@ -53,14 +53,14 @@ namespace normalized {<br>
<br>
 // Utility to call a lambda expression on each load command.<br>
 static std::error_code forEachLoadCommand(<br>
-    StringRef lcRange, unsigned lcCount, bool swap, bool is64,<br>
+    StringRef lcRange, unsigned lcCount, bool isBig, bool is64,<br>
     std::function<bool(uint32_t cmd, uint32_t size, const char *lc)> func) {<br>
   const char* p = lcRange.begin();<br>
   for (unsigned i=0; i < lcCount; ++i) {<br>
     const load_command *lc = reinterpret_cast<const load_command*>(p);<br>
     load_command lcCopy;<br>
     const load_command *slc = lc;<br>
-    if (swap) {<br>
+    if (isBig != llvm::sys::IsBigEndianHost) {<br>
       memcpy(&lcCopy, lc, sizeof(load_command));<br>
       swapStruct(lcCopy);<br>
       slc = &lcCopy;<br>
@@ -78,7 +78,7 @@ static std::error_code forEachLoadComman<br>
 }<br>
<br>
 static std::error_code appendRelocations(Relocations &relocs, StringRef buffer,<br>
-                                         bool swap, bool bigEndian,<br>
+                                         bool bigEndian,<br>
                                          uint32_t reloff, uint32_t nreloc) {<br>
   if ((reloff + nreloc*8) > buffer.size())<br>
     return make_error_code(llvm::errc::executable_format_error);<br>
@@ -86,24 +86,24 @@ static std::error_code appendRelocations<br>
             reinterpret_cast<const any_relocation_info*>(buffer.begin()+reloff);<br>
<br>
   for(uint32_t i=0; i < nreloc; ++i) {<br>
-    relocs.push_back(unpackRelocation(relocsArray[i], swap, bigEndian));<br>
+    relocs.push_back(unpackRelocation(relocsArray[i], bigEndian));<br>
   }<br>
   return std::error_code();<br>
 }<br>
<br>
 static std::error_code<br>
-appendIndirectSymbols(IndirectSymbols &isyms, StringRef buffer, bool swap,<br>
-                      bool bigEndian, uint32_t istOffset, uint32_t istCount,<br>
+appendIndirectSymbols(IndirectSymbols &isyms, StringRef buffer, bool isBig,<br>
+                      uint32_t istOffset, uint32_t istCount,<br>
                       uint32_t startIndex, uint32_t count) {<br>
   if ((istOffset + istCount*4) > buffer.size())<br>
     return make_error_code(llvm::errc::executable_format_error);<br>
   if (startIndex+count  > istCount)<br>
     return make_error_code(llvm::errc::executable_format_error);<br>
-  const uint32_t *indirectSymbolArray =<br>
-            reinterpret_cast<const uint32_t*>(buffer.begin()+istOffset);<br>
+  const uint8_t *indirectSymbolArray = (const uint8_t *)buffer.data();<br>
<br>
   for(uint32_t i=0; i < count; ++i) {<br>
-    isyms.push_back(read32(swap, indirectSymbolArray[startIndex+i]));<br>
+    isyms.push_back(read32(<br>
+        indirectSymbolArray + (startIndex + i) * sizeof(uint32_t), isBig));<br>
   }<br>
   return std::error_code();<br>
 }<br>
@@ -116,23 +116,23 @@ template <typename T> static T readBigEn<br>
 }<br>
<br>
<br>
-static bool isMachOHeader(const mach_header *mh, bool &is64, bool &swap) {<br>
-  switch (mh->magic) {<br>
+static bool isMachOHeader(const mach_header *mh, bool &is64, bool &isBig) {<br>
+  switch (read32(&mh->magic, false)) {<br>
   case llvm::MachO::MH_MAGIC:<br>
     is64 = false;<br>
-    swap = false;<br>
+    isBig = false;<br>
     return true;<br>
   case llvm::MachO::MH_MAGIC_64:<br>
     is64 = true;<br>
-    swap = false;<br>
+    isBig = false;<br>
     return true;<br>
   case llvm::MachO::MH_CIGAM:<br>
     is64 = false;<br>
-    swap = true;<br>
+    isBig = true;<br>
     return true;<br>
   case llvm::MachO::MH_CIGAM_64:<br>
     is64 = true;<br>
-    swap = true;<br>
+    isBig = true;<br>
     return true;<br>
   default:<br>
     return false;<br>
@@ -154,17 +154,18 @@ bool isThinObjectFile(StringRef path, Ma<br>
   // If file buffer does not start with MH_MAGIC (and variants), not obj file.<br>
   const mach_header *mh = reinterpret_cast<const mach_header *>(<br>
                                                             fileBuffer.begin());<br>
-  bool is64, swap;<br>
-  if (!isMachOHeader(mh, is64, swap))<br>
+  bool is64, isBig;<br>
+  if (!isMachOHeader(mh, is64, isBig))<br>
     return false;<br>
<br>
   // If not MH_OBJECT, not object file.<br>
-  if (read32(swap, mh->filetype) != MH_OBJECT)<br>
+  if (read32(&mh->filetype, isBig) != MH_OBJECT)<br>
     return false;<br>
<br>
   // Lookup up arch from cpu/subtype pair.<br>
-  arch = MachOLinkingContext::archFromCpuType(read32(swap, mh->cputype),<br>
-                                              read32(swap, mh->cpusubtype));<br>
+  arch = MachOLinkingContext::archFromCpuType(<br>
+      read32(&mh->cputype, isBig),<br>
+      read32(&mh->cpusubtype, isBig));<br>
   return true;<br>
 }<br>
<br>
@@ -217,14 +218,14 @@ readBinary(std::unique_ptr<MemoryBuffer><br>
   }<br>
<br>
   // Determine endianness and pointer size for mach-o file.<br>
-  bool is64, swap;<br>
-  if (!isMachOHeader(mh, is64, swap))<br>
+  bool is64, isBig;<br>
+  if (!isMachOHeader(mh, is64, isBig))<br>
     return make_error_code(llvm::errc::executable_format_error);<br>
<br>
   // Endian swap header, if needed.<br>
   mach_header headerCopy;<br>
   const mach_header *smh = mh;<br>
-  if (swap) {<br>
+  if (isBig != llvm::sys::IsBigEndianHost) {<br>
     memcpy(&headerCopy, mh, sizeof(mach_header));<br>
     swapStruct(headerCopy);<br>
     smh = &headerCopy;<br>
@@ -247,7 +248,6 @@ readBinary(std::unique_ptr<MemoryBuffer><br>
                                   + MachOLinkingContext::nameFromArch(f->arch)<br>
                                   + ")" ));<br>
   }<br>
-  bool isBigEndianArch = MachOLinkingContext::isBigEndian(f->arch);<br>
   // Copy file type and flags<br>
   f->fileType = HeaderFileType(smh->filetype);<br>
   f->flags = smh->flags;<br>
@@ -256,13 +256,13 @@ readBinary(std::unique_ptr<MemoryBuffer><br>
   // Pre-scan load commands looking for indirect symbol table.<br>
   uint32_t indirectSymbolTableOffset = 0;<br>
   uint32_t indirectSymbolTableCount = 0;<br>
-  std::error_code ec = forEachLoadCommand(lcRange, lcCount, swap, is64,<br>
+  std::error_code ec = forEachLoadCommand(lcRange, lcCount, isBig, is64,<br>
                                           [&](uint32_t cmd, uint32_t size,<br>
                                               const char *lc) -> bool {<br>
     if (cmd == LC_DYSYMTAB) {<br>
       const dysymtab_command *d = reinterpret_cast<const dysymtab_command*>(lc);<br>
-      indirectSymbolTableOffset = read32(swap, d->indirectsymoff);<br>
-      indirectSymbolTableCount = read32(swap, d->nindirectsyms);<br>
+      indirectSymbolTableOffset = read32(&d->indirectsymoff, isBig);<br>
+      indirectSymbolTableCount = read32(&d->nindirectsyms, isBig);<br>
       return true;<br>
     }<br>
     return false;<br>
@@ -274,16 +274,14 @@ readBinary(std::unique_ptr<MemoryBuffer><br>
   const data_in_code_entry *dataInCode = nullptr;<br>
   const dyld_info_command *dyldInfo = nullptr;<br>
   uint32_t dataInCodeSize = 0;<br>
-  ec = forEachLoadCommand(lcRange, lcCount, swap, is64,<br>
+  ec = forEachLoadCommand(lcRange, lcCount, isBig, is64,<br>
                     [&] (uint32_t cmd, uint32_t size, const char* lc) -> bool {<br>
     switch(cmd) {<br>
     case LC_SEGMENT_64:<br>
       if (is64) {<br>
         const segment_command_64 *seg =<br>
                               reinterpret_cast<const segment_command_64*>(lc);<br>
-        const unsigned sectionCount = (swap<br>
-                                       ? llvm::sys::getSwappedBytes(seg->nsects)<br>
-                                       : seg->nsects);<br>
+        const unsigned sectionCount = read32(&seg->nsects, isBig);<br>
         const section_64 *sects = reinterpret_cast<const section_64*><br>
                                   (lc + sizeof(segment_command_64));<br>
         const unsigned lcSize = sizeof(segment_command_64)<br>
@@ -296,26 +294,27 @@ readBinary(std::unique_ptr<MemoryBuffer><br>
           Section section;<br>
           section.segmentName = getString16(sect->segname);<br>
           section.sectionName = getString16(sect->sectname);<br>
-          section.type        = (SectionType)(read32(swap, sect->flags)<br>
-                                                                & SECTION_TYPE);<br>
-          section.attributes  = read32(swap, sect->flags) & SECTION_ATTRIBUTES;<br>
-          section.alignment   = read32(swap, sect->align);<br>
-          section.address     = read64(swap, sect->addr);<br>
+          section.type = (SectionType)(read32(&sect->flags, isBig) &<br>
+                                       SECTION_TYPE);<br>
+          section.attributes  = read32(&sect->flags, isBig) & SECTION_ATTRIBUTES;<br>
+          section.alignment   = read32(&sect->align, isBig);<br>
+          section.address     = read64(&sect->addr, isBig);<br>
           const uint8_t *content =<br>
-              (uint8_t *)start + read32(swap, sect->offset);<br>
-          size_t contentSize = read64(swap, sect->size);<br>
+            (uint8_t *)start + read32(&sect->offset, isBig);<br>
+          size_t contentSize = read64(&sect->size, isBig);<br>
           // Note: this assign() is copying the content bytes.  Ideally,<br>
           // we can use a custom allocator for vector to avoid the copy.<br>
           section.content = llvm::makeArrayRef(content, contentSize);<br>
-          appendRelocations(section.relocations, mb->getBuffer(),<br>
-                            swap, isBigEndianArch, read32(swap, sect->reloff),<br>
-                                                   read32(swap, sect->nreloc));<br>
+          appendRelocations(section.relocations, mb->getBuffer(), isBig,<br>
+                            read32(&sect->reloff, isBig),<br>
+                            read32(&sect->nreloc, isBig));<br>
           if (section.type == S_NON_LAZY_SYMBOL_POINTERS) {<br>
             appendIndirectSymbols(section.indirectSymbols, mb->getBuffer(),<br>
-                                  swap, isBigEndianArch,<br>
+                                  isBig,<br>
                                   indirectSymbolTableOffset,<br>
                                   indirectSymbolTableCount,<br>
-                                  read32(swap, sect->reserved1), contentSize/4);<br>
+                                  read32(&sect->reserved1, isBig),<br>
+                                  contentSize/4);<br>
           }<br>
           f->sections.push_back(section);<br>
         }<br>
@@ -325,9 +324,7 @@ readBinary(std::unique_ptr<MemoryBuffer><br>
       if (!is64) {<br>
         const segment_command *seg =<br>
                               reinterpret_cast<const segment_command*>(lc);<br>
-        const unsigned sectionCount = (swap<br>
-                                       ? llvm::sys::getSwappedBytes(seg->nsects)<br>
-                                       : seg->nsects);<br>
+        const unsigned sectionCount = read32(&seg->nsects, isBig);<br>
         const section *sects = reinterpret_cast<const section*><br>
                                   (lc + sizeof(segment_command));<br>
         const unsigned lcSize = sizeof(segment_command)<br>
@@ -340,26 +337,26 @@ readBinary(std::unique_ptr<MemoryBuffer><br>
           Section section;<br>
           section.segmentName = getString16(sect->segname);<br>
           section.sectionName = getString16(sect->sectname);<br>
-          section.type        = (SectionType)(read32(swap, sect->flags)<br>
-                                                                & SECTION_TYPE);<br>
-          section.attributes  = read32(swap, sect->flags) & SECTION_ATTRIBUTES;<br>
-          section.alignment   = read32(swap, sect->align);<br>
-          section.address     = read32(swap, sect->addr);<br>
+          section.type = (SectionType)(read32(&sect->flags, isBig) &<br>
+                                       SECTION_TYPE);<br>
+          section.attributes =<br>
+              read32((uint8_t *)&sect->flags, isBig) & SECTION_ATTRIBUTES;<br>
+          section.alignment   = read32(&sect->align, isBig);<br>
+          section.address     = read32(&sect->addr, isBig);<br>
           const uint8_t *content =<br>
-              (uint8_t *)start + read32(swap, sect->offset);<br>
-          size_t contentSize = read32(swap, sect->size);<br>
+            (uint8_t *)start + read32(&sect->offset, isBig);<br>
+          size_t contentSize = read32(&sect->size, isBig);<br>
           // Note: this assign() is copying the content bytes.  Ideally,<br>
           // we can use a custom allocator for vector to avoid the copy.<br>
           section.content = llvm::makeArrayRef(content, contentSize);<br>
-          appendRelocations(section.relocations, mb->getBuffer(),<br>
-                            swap, isBigEndianArch, read32(swap, sect->reloff),<br>
-                                                   read32(swap, sect->nreloc));<br>
+          appendRelocations(section.relocations, mb->getBuffer(), isBig,<br>
+                            read32(&sect->reloff, isBig),<br>
+                            read32(&sect->nreloc, isBig));<br>
           if (section.type == S_NON_LAZY_SYMBOL_POINTERS) {<br>
-            appendIndirectSymbols(section.indirectSymbols, mb->getBuffer(),<br>
-                                  swap, isBigEndianArch,<br>
-                                  indirectSymbolTableOffset,<br>
-                                  indirectSymbolTableCount,<br>
-                                  read32(swap, sect->reserved1), contentSize/4);<br>
+            appendIndirectSymbols(<br>
+                section.indirectSymbols, mb->getBuffer(), isBig,<br>
+                indirectSymbolTableOffset, indirectSymbolTableCount,<br>
+                read32(&sect->reserved1, isBig), contentSize / 4);<br>
           }<br>
           f->sections.push_back(section);<br>
         }<br>
@@ -367,15 +364,16 @@ readBinary(std::unique_ptr<MemoryBuffer><br>
       break;<br>
     case LC_SYMTAB: {<br>
       const symtab_command *st = reinterpret_cast<const symtab_command*>(lc);<br>
-      const char *strings = start + read32(swap, st->stroff);<br>
-      const uint32_t strSize = read32(swap, st->strsize);<br>
+      const char *strings = start + read32(&st->stroff, isBig);<br>
+      const uint32_t strSize = read32(&st->strsize, isBig);<br>
       // Validate string pool and symbol table all in buffer.<br>
-      if ( read32(swap, st->stroff)+read32(swap, st->strsize)<br>
-                                                        > objSize )<br>
+      if (read32((uint8_t *)&st->stroff, isBig) +<br>
+              read32((uint8_t *)&st->strsize, isBig) ><br>
+          objSize)<br>
         return true;<br>
       if (is64) {<br>
-        const uint32_t symOffset = read32(swap, st->symoff);<br>
-        const uint32_t symCount = read32(swap, st->nsyms);<br>
+        const uint32_t symOffset = read32(&st->symoff, isBig);<br>
+        const uint32_t symCount = read32(&st->nsyms, isBig);<br>
         if ( symOffset+(symCount*sizeof(nlist_64)) > objSize)<br>
           return true;<br>
         const nlist_64 *symbols =<br>
@@ -384,7 +382,7 @@ readBinary(std::unique_ptr<MemoryBuffer><br>
         for(uint32_t i=0; i < symCount; ++i) {<br>
           const nlist_64 *sin = &symbols[i];<br>
           nlist_64 tempSym;<br>
-          if (swap) {<br>
+          if (isBig != llvm::sys::IsBigEndianHost) {<br>
             tempSym = *sin; swapStruct(tempSym); sin = &tempSym;<br>
           }<br>
           Symbol sout;<br>
@@ -404,8 +402,8 @@ readBinary(std::unique_ptr<MemoryBuffer><br>
             f->localSymbols.push_back(sout);<br>
         }<br>
       } else {<br>
-        const uint32_t symOffset = read32(swap, st->symoff);<br>
-        const uint32_t symCount = read32(swap, st->nsyms);<br>
+        const uint32_t symOffset = read32(&st->symoff, isBig);<br>
+        const uint32_t symCount = read32(&st->nsyms, isBig);<br>
         if ( symOffset+(symCount*sizeof(nlist)) > objSize)<br>
           return true;<br>
         const nlist *symbols =<br>
@@ -414,7 +412,7 @@ readBinary(std::unique_ptr<MemoryBuffer><br>
         for(uint32_t i=0; i < symCount; ++i) {<br>
           const nlist *sin = &symbols[i];<br>
           nlist tempSym;<br>
-          if (swap) {<br>
+          if (isBig != llvm::sys::IsBigEndianHost) {<br>
             tempSym = *sin; swapStruct(tempSym); sin = &tempSym;<br>
           }<br>
           Symbol sout;<br>
@@ -438,15 +436,15 @@ readBinary(std::unique_ptr<MemoryBuffer><br>
       break;<br>
     case LC_ID_DYLIB: {<br>
       const dylib_command *dl = reinterpret_cast<const dylib_command*>(lc);<br>
-      f->installName = lc + read32(swap, dl-><a href="http://dylib.name" target="_blank">dylib.name</a>);<br>
+      f->installName = lc + read32(&dl-><a href="http://dylib.name" target="_blank">dylib.name</a>, isBig);<br>
       }<br>
       break;<br>
     case LC_DATA_IN_CODE: {<br>
       const linkedit_data_command *ldc =<br>
                             reinterpret_cast<const linkedit_data_command*>(lc);<br>
-      dataInCode = reinterpret_cast<const data_in_code_entry*>(<br>
-                                            start + read32(swap, ldc->dataoff));<br>
-      dataInCodeSize = read32(swap, ldc->datasize);<br>
+      dataInCode = reinterpret_cast<const data_in_code_entry *>(<br>
+          start + read32(&ldc->dataoff, isBig));<br>
+      dataInCodeSize = read32(&ldc->datasize, isBig);<br>
       }<br>
       break;<br>
     case LC_LOAD_DYLIB:<br>
@@ -455,7 +453,7 @@ readBinary(std::unique_ptr<MemoryBuffer><br>
     case LC_LOAD_UPWARD_DYLIB: {<br>
       const dylib_command *dl = reinterpret_cast<const dylib_command*>(lc);<br>
       DependentDylib entry;<br>
-      entry.path = lc + read32(swap, dl-><a href="http://dylib.name" target="_blank">dylib.name</a>);<br>
+      entry.path = lc + read32(&dl-><a href="http://dylib.name" target="_blank">dylib.name</a>, isBig);<br>
       entry.kind = LoadCommandType(cmd);<br>
       f->dependentDylibs.push_back(entry);<br>
       }<br>
@@ -474,9 +472,10 @@ readBinary(std::unique_ptr<MemoryBuffer><br>
     // Convert on-disk data_in_code_entry array to DataInCode vector.<br>
     for (unsigned i=0; i < dataInCodeSize/sizeof(data_in_code_entry); ++i) {<br>
       DataInCode entry;<br>
-      entry.offset = read32(swap, dataInCode[i].offset);<br>
-      entry.length = read16(swap, dataInCode[i].length);<br>
-      entry.kind   = (DataRegionType)read16(swap, dataInCode[i].kind);<br>
+      entry.offset = read32(&dataInCode[i].offset, isBig);<br>
+      entry.length = read16(&dataInCode[i].length, isBig);<br>
+      entry.kind =<br>
+          (DataRegionType)read16((uint8_t *)&dataInCode[i].kind, isBig);<br>
       f->dataInCode.push_back(entry);<br>
     }<br>
   }<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryUtils.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryUtils.h?rev=220730&r1=220729&r2=220730&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryUtils.h?rev=220730&r1=220729&r2=220730&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryUtils.h (original)<br>
+++ lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryUtils.h Mon Oct 27 17:48:35 2014<br>
@@ -13,6 +13,7 @@<br>
 #include "lld/Core/LLVM.h"<br>
 #include "llvm/ADT/StringRef.h"<br>
 #include "llvm/Support/Casting.h"<br>
+#include "llvm/Support/Endian.h"<br>
 #include "llvm/Support/ErrorHandling.h"<br>
 #include "llvm/Support/Host.h"<br>
 #include "llvm/Support/MachO.h"<br>
@@ -27,28 +28,54 @@ namespace normalized {<br>
<br>
 using llvm::sys::getSwappedBytes;<br>
<br>
-inline uint16_t read16(bool swap, uint16_t value) {<br>
-    return (swap ? getSwappedBytes(value) : value);<br>
-}<br>
-<br>
-inline uint32_t read32(bool swap, uint32_t value) {<br>
-    return (swap ? getSwappedBytes(value) : value);<br>
-}<br>
-<br>
-inline uint64_t read64(bool swap, uint64_t value) {<br>
-    return (swap ? getSwappedBytes(value) : value);<br>
-}<br>
-<br>
-inline void write16(int16_t &loc, bool swap, int16_t value) {<br>
-    loc = (swap ? getSwappedBytes(value) : value);<br>
-}<br>
-<br>
-inline void write32(int32_t &loc, bool swap, int32_t value) {<br>
-    loc = (swap ? getSwappedBytes(value) : value);<br>
-}<br>
-<br>
-inline void write64(uint64_t &loc, bool swap, uint64_t value) {<br>
-    loc = (swap ? getSwappedBytes(value) : value);<br>
+ using llvm::support::ubig16_t;<br>
+ using llvm::support::ubig32_t;<br>
+ using llvm::support::ubig64_t;<br>
+<br>
+ using llvm::support::ulittle16_t;<br>
+ using llvm::support::ulittle32_t;<br>
+ using llvm::support::ulittle64_t;<br>
+<br>
+template<typename T><br>
+static inline uint16_t read16(const T *loc, bool isBig) {<br>
+  assert((uint64_t)loc % llvm::alignOf<T>() == 0 &&<br>
+         "invalid pointer alignment");<br>
+  return isBig ? *(ubig16_t *)loc : *(ulittle16_t *)loc;<br>
+}<br>
+<br>
+template<typename T><br>
+static inline uint32_t read32(const T *loc, bool isBig) {<br>
+  assert((uint64_t)loc % llvm::alignOf<T>() == 0 &&<br>
+         "invalid pointer alignment");<br>
+  return isBig ? *(ubig32_t *)loc : *(ulittle32_t *)loc;<br>
+}<br>
+<br>
+template<typename T><br>
+static inline uint64_t read64(const T *loc, bool isBig) {<br>
+  assert((uint64_t)loc % llvm::alignOf<T>() == 0 &&<br>
+         "invalid pointer alignment");<br>
+  return isBig ? *(ubig64_t *)loc : *(ulittle64_t *)loc;<br>
+}<br>
+<br>
+inline void write16(uint8_t *loc, uint16_t value, bool isBig) {<br>
+  if (isBig)<br>
+    *(ubig16_t *)loc = value;<br>
+  else<br>
+    *(ulittle16_t *)loc = value;<br>
+}<br>
+<br>
+inline void write32(uint8_t *loc, uint32_t value, bool isBig) {<br>
+  if (isBig)<br>
+    *(ubig32_t *)loc = value;<br>
+  else<br>
+    *(ulittle32_t *)loc = value;<br>
+}<br>
+<br>
+inline void write64(uint8_t *loc, uint64_t value, bool isBig) {<br>
+  if (isBig)<br>
+    *(ubig64_t *)loc = value;<br>
+  else<br>
+    *(ulittle64_t *)loc = value;<br>
 }<br>
<br>
 inline uint32_t<br>
@@ -69,11 +96,10 @@ bitFieldSet(uint32_t &bits, bool isBigEn<br>
   bits |= (newBits << shift);<br>
 }<br>
<br>
-inline Relocation<br>
-unpackRelocation(const llvm::MachO::any_relocation_info &r, bool swap,<br>
-                                                            bool isBigEndian) {<br>
-  uint32_t r0 = read32(swap, r.r_word0);<br>
-  uint32_t r1 = read32(swap, r.r_word1);<br>
+inline Relocation unpackRelocation(const llvm::MachO::any_relocation_info &r,<br>
+                                   bool isBigEndian) {<br>
+  uint32_t r0 = read32(&r.r_word0, isBigEndian);<br>
+  uint32_t r1 = read32(&r.r_word1, isBigEndian);<br>
<br>
   Relocation result;<br>
   if (r0 & llvm::MachO::R_SCATTERED) {<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileToAtoms.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileToAtoms.cpp?rev=220730&r1=220729&r2=220730&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileToAtoms.cpp?rev=220730&r1=220729&r2=220730&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileToAtoms.cpp (original)<br>
+++ lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileToAtoms.cpp Mon Oct 27 17:48:35 2014<br>
@@ -365,7 +365,7 @@ std::error_code processSection(DefinedAt<br>
                                MachOFile &file, bool scatterable,<br>
                                bool copyRefs) {<br>
   const bool is64 = MachOLinkingContext::is64Bit(normalizedFile.arch);<br>
-  const bool swap = !MachOLinkingContext::isHostEndian(normalizedFile.arch);<br>
+  const bool isBig = MachOLinkingContext::isBigEndian(normalizedFile.arch);<br>
<br>
   // Get info on how to atomize section.<br>
   unsigned int       sizeMultiple;<br>
@@ -423,7 +423,7 @@ std::error_code processSection(DefinedAt<br>
       case atomizeCFI:<br>
         // Break section up into dwarf unwind CFIs (FDE or CIE).<br>
         cfi = reinterpret_cast<const uint32_t *>(&section.content[offset]);<br>
-        size = read32(swap, *cfi) + 4;<br>
+        size = read32(&section.content[offset], isBig) + 4;<br>
         if (offset+size > section.content.size()) {<br>
           return make_dynamic_error_code(Twine(Twine("Section ")<br>
                                          + section.segmentName<br>
@@ -572,7 +572,7 @@ std::error_code convertRelocs(const Sect<br>
     }<br>
   };<br>
<br>
-  const bool swap = !MachOLinkingContext::isHostEndian(normalizedFile.arch);<br>
+  const bool isBig = MachOLinkingContext::isBigEndian(normalizedFile.arch);<br>
   // Use old-school iterator so that paired relocations can be grouped.<br>
   for (auto it=section.relocations.begin(), e=section.relocations.end();<br>
                                                                 it != e; ++it) {<br>
@@ -595,18 +595,16 @@ std::error_code convertRelocs(const Sect<br>
     std::error_code relocErr;<br>
     if (handler.isPairedReloc(reloc)) {<br>
      // Handle paired relocations together.<br>
-     relocErr = handler.getPairReferenceInfo(reloc, *++it, inAtom,<br>
-                                             offsetInAtom, fixupAddress, swap,<br>
-                                             scatterable, atomByAddr,<br>
-                                             atomBySymbol, &kind,<br>
-                                             &target, &addend);<br>
+      relocErr = handler.getPairReferenceInfo(<br>
+          reloc, *++it, inAtom, offsetInAtom, fixupAddress, isBig, scatterable,<br>
+          atomByAddr, atomBySymbol, &kind, &target, &addend);<br>
     }<br>
     else {<br>
       // Use ArchHandler to convert relocation record into information<br>
       // needed to instantiate an lld::Reference object.<br>
-      relocErr = handler.getReferenceInfo(reloc, inAtom, offsetInAtom,<br>
-                                          fixupAddress,swap, atomByAddr,<br>
-                                         atomBySymbol, &kind, &target, &addend);<br>
+      relocErr = handler.getReferenceInfo(<br>
+          reloc, inAtom, offsetInAtom, fixupAddress, isBig, atomByAddr,<br>
+          atomBySymbol, &kind, &target, &addend);<br>
     }<br>
     if (relocErr) {<br>
       return make_dynamic_error_code(<br>
@@ -638,18 +636,18 @@ bool isDebugInfoSection(const Section &s<br>
   return section.segmentName.equals("__DWARF");<br>
 }<br>
<br>
-static int64_t readSPtr(bool is64, bool swap, const uint8_t *addr) {<br>
+static int64_t readSPtr(bool is64, bool isBig, const uint8_t *addr) {<br>
   if (is64)<br>
-    return read64(swap, *reinterpret_cast<const uint64_t *>(addr));<br>
+    return read64(addr, isBig);<br>
<br>
-  int32_t res = read32(swap, *reinterpret_cast<const uint32_t *>(addr));<br>
+  int32_t res = read32(addr, isBig);<br>
   return res;<br>
 }<br>
<br>
 std::error_code addEHFrameReferences(const NormalizedFile &normalizedFile,<br>
                                      MachOFile &file,<br>
                                      mach_o::ArchHandler &handler) {<br>
-  const bool swap = !MachOLinkingContext::isHostEndian(normalizedFile.arch);<br>
+  const bool isBig = MachOLinkingContext::isBigEndian(normalizedFile.arch);<br>
   const bool is64 = MachOLinkingContext::is64Bit(normalizedFile.arch);<br>
<br>
   const Section *ehFrameSection = nullptr;<br>
@@ -668,7 +666,7 @@ std::error_code addEHFrameReferences(con<br>
                          [&](MachODefinedAtom *atom, uint64_t offset) -> void {<br>
     assert(atom->contentType() == DefinedAtom::typeCFI);<br>
<br>
-    if (ArchHandler::isDwarfCIE(swap, atom))<br>
+    if (ArchHandler::isDwarfCIE(isBig, atom))<br>
       return;<br>
<br>
     // Compiler wasn't lazy and actually told us what it meant.<br>
@@ -676,14 +674,14 @@ std::error_code addEHFrameReferences(con<br>
       return;<br>
<br>
     const uint8_t *frameData = atom->rawContent().data();<br>
-    uint32_t size = read32(swap, *(uint32_t *)frameData);<br>
+    uint32_t size = read32(frameData, isBig);<br>
     uint64_t cieFieldInFDE = size == 0xffffffffU<br>
                                    ? sizeof(uint32_t) + sizeof(uint64_t)<br>
                                    : sizeof(uint32_t);<br>
<br>
     // Linker needs to fixup a reference from the FDE to its parent CIE (a<br>
     // 32-bit byte offset backwards in the __eh_frame section).<br>
-    uint32_t cieDelta = read32(swap, *(uint32_t *)(frameData + cieFieldInFDE));<br>
+    uint32_t cieDelta = read32(frameData + cieFieldInFDE, isBig);<br>
     uint64_t cieAddress = ehFrameSection->address + offset + cieFieldInFDE;<br>
     cieAddress -= cieDelta;<br>
<br>
@@ -699,7 +697,7 @@ std::error_code addEHFrameReferences(con<br>
     // (hopefully)<br>
     uint64_t rangeFieldInFDE = cieFieldInFDE + sizeof(uint32_t);<br>
<br>
-    int64_t functionFromFDE = readSPtr(is64, swap, frameData + rangeFieldInFDE);<br>
+    int64_t functionFromFDE = readSPtr(is64, isBig, frameData + rangeFieldInFDE);<br>
     uint64_t rangeStart = ehFrameSection->address + offset + rangeFieldInFDE;<br>
     rangeStart += functionFromFDE;<br>
<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>