<div dir="ltr">Thinking about the number of files in include/Core that can be moved to the new directory, I think it's a bit overkill to create a new directory.<div><br></div><div>Also the fundamental idea of lld/include/Support itself may be wrong; if we have very a generic feature, which is so generic that that doesn't depends on any other part of LLD, it needs to go to LLVM's Support or ADT directory.</div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Feb 26, 2015 at 9:33 PM, Shankar Easwaran <span dir="ltr"><<a href="mailto:shankare@codeaurora.org" target="_blank">shankare@codeaurora.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">This is one place where I am confused. I think lld needs a Support directory to house all these utility functions.<br>
<br>
We have a lot of header files in lld/Core and its growing, possibly some of them need to be moved to Support as that doesnot affect the core functionality of lld.<br>
<br>
Shankar Easwaran<div><div><br>
<br>
On 2/26/2015 9:18 PM, Rui Ueyama wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Author: ruiu<br>
Date: Thu Feb 26 21:18:46 2015<br>
New Revision: 230725<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=230725&view=rev" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project?rev=230725&view=rev</a><br>
Log:<br>
Add {read,write}{16,32,64}{le,be} functions.<br>
<br>
Nothing wrong with reinterpret_cast<llvm::<u></u>support::ulittle32_t *>(loc),<br>
but that's redundant and not great from readability point of view.<br>
The new functions are wrappers for that kind of reinterpet_casts.<br>
<br>
Surprisingly or unsurprisingly, there was no use of big endian read<br>
and write. {read,write}{16,32,64}be have no user. But I think they<br>
still worth to be there in the header for completeness.<br>
<br>
<a href="http://reviews.llvm.org/D7927" target="_blank">http://reviews.llvm.org/D7927</a><br>
<br>
Added:<br>
     lld/trunk/include/lld/Core/<u></u>Endian.h<br>
Modified:<br>
     lld/trunk/lib/ReaderWriter/<u></u>ELF/AArch64/<u></u>AArch64RelocationHandler.cpp<br>
     lld/trunk/lib/ReaderWriter/<u></u>ELF/ARM/ARMRelocationHandler.<u></u>cpp<br>
     lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonRelocationHandler.cpp<br>
     lld/trunk/lib/ReaderWriter/<u></u>ELF/X86/X86RelocationHandler.<u></u>cpp<br>
     lld/trunk/lib/ReaderWriter/<u></u>ELF/X86_64/X86_<u></u>64RelocationHandler.cpp<br>
     lld/trunk/lib/ReaderWriter/<u></u>PECOFF/IdataPass.cpp<br>
     lld/trunk/lib/ReaderWriter/<u></u>PECOFF/ReaderImportHeader.cpp<br>
     lld/trunk/lib/ReaderWriter/<u></u>PECOFF/WriterPECOFF.cpp<br>
<br>
Added: lld/trunk/include/lld/Core/<u></u>Endian.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/Core/Endian.h?rev=230725&view=auto" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/include/lld/<u></u>Core/Endian.h?rev=230725&view=<u></u>auto</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/include/lld/Core/<u></u>Endian.h (added)<br>
+++ lld/trunk/include/lld/Core/<u></u>Endian.h Thu Feb 26 21:18:46 2015<br>
@@ -0,0 +1,67 @@<br>
+//===--- Endian.h - utility functions for endian-aware reads/writes -----*-===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is distributed under the University of Illinois Open Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<u></u>------------------------------<u></u>----------------===//<br>
+<br>
+#ifndef LLD_CORE_ENDIAN_H<br>
+#define LLD_CORE_ENDIAN_H<br>
+<br>
+#include "llvm/Support/Endian.h"<br>
+<br>
+namespace lld {<br>
+<br>
+inline uint16_t read16le(const void *p) {<br>
+  return *reinterpret_cast<const llvm::support::ulittle16_t *>(p);<br>
+}<br>
+<br>
+inline uint32_t read32le(const void *p) {<br>
+  return *reinterpret_cast<const llvm::support::ulittle32_t *>(p);<br>
+}<br>
+<br>
+inline uint64_t read64le(const void *p) {<br>
+  return *reinterpret_cast<const llvm::support::ulittle64_t *>(p);<br>
+}<br>
+<br>
+inline void write16le(void *p, uint16_t v) {<br>
+  *reinterpret_cast<llvm::<u></u>support::ulittle16_t *>(p) = v;<br>
+}<br>
+<br>
+inline void write32le(void *p, uint32_t v) {<br>
+  *reinterpret_cast<llvm::<u></u>support::ulittle32_t *>(p) = v;<br>
+}<br>
+<br>
+inline void write64le(void *p, uint64_t v) {<br>
+  *reinterpret_cast<llvm::<u></u>support::ulittle64_t *>(p) = v;<br>
+}<br>
+<br>
+inline uint16_t read16be(const void *p) {<br>
+  return *reinterpret_cast<const llvm::support::ubig16_t *>(p);<br>
+}<br>
+<br>
+inline uint32_t read32be(const void *p) {<br>
+  return *reinterpret_cast<const llvm::support::ubig32_t *>(p);<br>
+}<br>
+<br>
+inline uint64_t read64be(const void *p) {<br>
+  return *reinterpret_cast<const llvm::support::ubig64_t *>(p);<br>
+}<br>
+<br>
+inline void write16be(void *p, uint16_t v) {<br>
+  *reinterpret_cast<llvm::<u></u>support::ubig16_t *>(p) = v;<br>
+}<br>
+<br>
+inline void write32be(void *p, uint32_t v) {<br>
+  *reinterpret_cast<llvm::<u></u>support::ubig32_t *>(p) = v;<br>
+}<br>
+<br>
+inline void write64be(void *p, uint64_t v) {<br>
+  *reinterpret_cast<llvm::<u></u>support::ubig64_t *>(p) = v;<br>
+}<br>
+<br>
+} // namespace lld<br>
+<br>
+#endif<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/<u></u>ELF/AArch64/<u></u>AArch64RelocationHandler.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/AArch64/AArch64RelocationHandler.cpp?rev=230725&r1=230724&r2=230725&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/ELF/AArch64/<u></u>AArch64RelocationHandler.cpp?<u></u>rev=230725&r1=230724&r2=<u></u>230725&view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>ELF/AArch64/<u></u>AArch64RelocationHandler.cpp (original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>ELF/AArch64/<u></u>AArch64RelocationHandler.cpp Thu Feb 26 21:18:46 2015<br>
@@ -9,6 +9,7 @@<br>
    #include "AArch64TargetHandler.h"<br>
  #include "AArch64LinkingContext.h"<br>
+#include "lld/Core/Endian.h"<br>
  #include "llvm/Support/Debug.h"<br>
  #include "llvm/Support/MathExtras.h"<br>
  @@ -32,18 +33,14 @@ static void relocR_AARCH64_ABS64(uint8_t<br>
        llvm::dbgs() << " A: 0x" << Twine::utohexstr(A);<br>
        llvm::dbgs() << " P: 0x" << Twine::utohexstr(P);<br>
        llvm::dbgs() << " result: 0x" << Twine::utohexstr(result) << "\n");<br>
-  *reinterpret_cast<llvm::<u></u>support::ulittle64_t *>(location) =<br>
-      result |<br>
-      (int64_t) * reinterpret_cast<llvm::<u></u>support::little64_t *>(location);<br>
+  write64le(location, result | read64le(location));<br>
  }<br>
    /// \brief R_AARCH64_PREL32 - word32: S + A - P<br>
  static void relocR_AARCH64_PREL32(uint8_t *location, uint64_t P, uint64_t S,<br>
                                    int64_t A) {<br>
    int32_t result = (int32_t)((S + A) - P);<br>
-  *reinterpret_cast<llvm::<u></u>support::little32_t *>(location) =<br>
-      result +<br>
-      (int32_t) * reinterpret_cast<llvm::<u></u>support::little32_t *>(location);<br>
+  write32le(location, result + (int32_t)read32le(location));<br>
  }<br>
    /// \brief R_AARCH64_ABS32 - word32:  S + A<br>
@@ -58,9 +55,7 @@ static std::error_code relocR_AARCH64_AB<br>
        llvm::dbgs() << " A: 0x" << Twine::utohexstr(A);<br>
        llvm::dbgs() << " P: 0x" << Twine::utohexstr(P);<br>
        llvm::dbgs() << " result: 0x" << Twine::utohexstr(result) << "\n");<br>
-  *reinterpret_cast<llvm::<u></u>support::ulittle32_t *>(location) =<br>
-      result |<br>
-      (int32_t) * reinterpret_cast<llvm::<u></u>support::little32_t *>(location);<br>
+  write32le(location, result | read32le(location));<br>
    return std::error_code();<br>
  }<br>
  @@ -81,9 +76,7 @@ static void relocR_AARCH64_ADR_PREL_PG_H<br>
        llvm::dbgs() << " immhi: " << Twine::utohexstr(immhi);<br>
        llvm::dbgs() << " immlo: " << Twine::utohexstr(immlo);<br>
        llvm::dbgs() << " result: " << Twine::utohexstr(result) << "\n");<br>
-  *reinterpret_cast<llvm::<u></u>support::little32_t *>(location) =<br>
-      immlo | immhi |<br>
-      (int32_t) * reinterpret_cast<llvm::<u></u>support::little32_t *>(location);<br>
+  write32le(location, immlo | immhi | read32le(location));<br>
    // TODO: Make sure this is correct!<br>
  }<br>
  @@ -103,9 +96,7 @@ static void relocR_AARCH64_ADR_PREL_LO21<br>
        llvm::dbgs() << " immhi: " << Twine::utohexstr(immhi);<br>
        llvm::dbgs() << " immlo: " << Twine::utohexstr(immlo);<br>
        llvm::dbgs() << " result: " << Twine::utohexstr(result) << "\n");<br>
-  *reinterpret_cast<llvm::<u></u>support::little32_t *>(location) =<br>
-      immlo | immhi |<br>
-      (int32_t) * reinterpret_cast<llvm::<u></u>support::little32_t *>(location);<br>
+  write32le(location, immlo | immhi | read32le(location));<br>
    // TODO: Make sure this is correct!<br>
  }<br>
  @@ -120,9 +111,7 @@ static void relocR_AARCH64_ADD_ABS_LO12_<br>
        llvm::dbgs() << " A: " << Twine::utohexstr(A);<br>
        llvm::dbgs() << " P: " << Twine::utohexstr(P);<br>
        llvm::dbgs() << " result: " << Twine::utohexstr(result) << "\n");<br>
-  *reinterpret_cast<llvm::<u></u>support::little32_t *>(location) =<br>
-      result |<br>
-      (int32_t) * reinterpret_cast<llvm::<u></u>support::little32_t *>(location);<br>
+  write32le(location, result | read32le(location));<br>
  }<br>
    static void relocJump26(uint8_t *location, uint64_t P, uint64_t S, int64_t A) {<br>
@@ -135,9 +124,7 @@ static void relocJump26(uint8_t *locatio<br>
        llvm::dbgs() << " A: " << Twine::utohexstr(A);<br>
        llvm::dbgs() << " P: " << Twine::utohexstr(P);<br>
        llvm::dbgs() << " result: " << Twine::utohexstr(result) << "\n");<br>
-  *reinterpret_cast<llvm::<u></u>support::little32_t *>(location) =<br>
-      result |<br>
-      (int32_t) * reinterpret_cast<llvm::<u></u>support::little32_t *>(location);<br>
+  write32le(location, result | read32le(location));<br>
  }<br>
    /// \brief R_AARCH64_CONDBR19<br>
@@ -152,9 +139,7 @@ static void relocR_AARCH64_CONDBR19(uint<br>
        llvm::dbgs() << " A: " << Twine::utohexstr(A);<br>
        llvm::dbgs() << " P: " << Twine::utohexstr(P);<br>
        llvm::dbgs() << " result: " << Twine::utohexstr(result) << "\n");<br>
-  *reinterpret_cast<llvm::<u></u>support::little32_t *>(location) =<br>
-      result |<br>
-      (int32_t) * reinterpret_cast<llvm::<u></u>support::little32_t *>(location);<br>
+  write32le(location, result | read32le(location));<br>
  }<br>
    /// \brief R_AARCH64_LDST8_ABS_LO12_NC - S + A<br>
@@ -168,9 +153,7 @@ static void relocR_AARCH64_LDST8_ABS_LO1<br>
        llvm::dbgs() << " A: " << Twine::utohexstr(A);<br>
        llvm::dbgs() << " P: " << Twine::utohexstr(P);<br>
        llvm::dbgs() << " result: " << Twine::utohexstr(result) << "\n");<br>
-  *reinterpret_cast<llvm::<u></u>support::little32_t *>(location) =<br>
-      result |<br>
-      (int32_t) * reinterpret_cast<llvm::<u></u>support::little32_t *>(location);<br>
+  write32le(location, result | read32le(location));<br>
  }<br>
    /// \brief R_AARCH64_LDST16_ABS_LO12_NC<br>
@@ -185,9 +168,7 @@ static void relocR_AARCH64_LDST16_ABS_LO<br>
        llvm::dbgs() << " A: " << Twine::utohexstr(A);<br>
        llvm::dbgs() << " P: " << Twine::utohexstr(P);<br>
        llvm::dbgs() << " result: " << Twine::utohexstr(result) << "\n");<br>
-  *reinterpret_cast<llvm::<u></u>support::little32_t *>(location) =<br>
-      result |<br>
-      (int32_t) * reinterpret_cast<llvm::<u></u>support::little32_t *>(location);<br>
+  write32le(location, result | read32le(location));<br>
  }<br>
    /// \brief R_AARCH64_LDST32_ABS_LO12_NC<br>
@@ -202,9 +183,7 @@ static void relocR_AARCH64_LDST32_ABS_LO<br>
        llvm::dbgs() << " A: " << Twine::utohexstr(A);<br>
        llvm::dbgs() << " P: " << Twine::utohexstr(P);<br>
        llvm::dbgs() << " result: " << Twine::utohexstr(result) << "\n");<br>
-  *reinterpret_cast<llvm::<u></u>support::little32_t *>(location) =<br>
-      result |<br>
-      (int32_t) * reinterpret_cast<llvm::<u></u>support::little32_t *>(location);<br>
+  write32le(location, result | read32le(location));<br>
  }<br>
    /// \brief R_AARCH64_LDST64_ABS_LO12_NC<br>
@@ -219,9 +198,7 @@ static void relocR_AARCH64_LDST64_ABS_LO<br>
        llvm::dbgs() << " A: " << Twine::utohexstr(A);<br>
        llvm::dbgs() << " P: " << Twine::utohexstr(P);<br>
        llvm::dbgs() << " result: " << Twine::utohexstr(result) << "\n");<br>
-  *reinterpret_cast<llvm::<u></u>support::little32_t *>(location) =<br>
-      result |<br>
-      (int32_t) * reinterpret_cast<llvm::<u></u>support::little32_t *>(location);<br>
+  write32le(location, result | read32le(location));<br>
  }<br>
    /// \brief R_AARCH64_LDST128_ABS_LO12_NC<br>
@@ -236,9 +213,7 @@ static void relocR_AARCH64_LDST128_ABS_L<br>
        llvm::dbgs() << " A: " << Twine::utohexstr(A);<br>
        llvm::dbgs() << " P: " << Twine::utohexstr(P);<br>
        llvm::dbgs() << " result: " << Twine::utohexstr(result) << "\n");<br>
-  *reinterpret_cast<llvm::<u></u>support::little32_t *>(location) =<br>
-      result |<br>
-      (int32_t) * reinterpret_cast<llvm::<u></u>support::little32_t *>(location);<br>
+  write32le(location, result | read32le(location));<br>
  }<br>
    static void relocR_AARCH64_ADR_GOT_PAGE(<u></u>uint8_t *location, uint64_t P,<br>
@@ -257,9 +232,7 @@ static void relocR_AARCH64_ADR_GOT_PAGE(<br>
        llvm::dbgs() << " immhi: " << Twine::utohexstr(immhi);<br>
        llvm::dbgs() << " immlo: " << Twine::utohexstr(immlo);<br>
        llvm::dbgs() << " result: " << Twine::utohexstr(result) << "\n");<br>
-  *reinterpret_cast<llvm::<u></u>support::little32_t *>(location) =<br>
-      immlo | immhi |<br>
-      (int32_t) * reinterpret_cast<llvm::<u></u>support::little32_t *>(location);<br>
+  write32le(location, result | read32le(location));<br>
  }<br>
    // R_AARCH64_LD64_GOT_LO12_NC<br>
@@ -274,9 +247,7 @@ static void relocR_AARCH64_LD64_GOT_LO12<br>
        llvm::dbgs() << " result: " << Twine::utohexstr(result) << "\n");<br>
    result &= 0xFF8;<br>
    result <<= 7;<br>
-  *reinterpret_cast<llvm::<u></u>support::little32_t *>(location) =<br>
-      result |<br>
-      (int32_t) * reinterpret_cast<llvm::<u></u>support::little32_t *>(location);<br>
+  write32le(location, result | read32le(location));<br>
  }<br>
    // ADD_AARCH64_GOTRELINDEX<br>
@@ -291,9 +262,7 @@ static void relocADD_AARCH64_GOTRELINDEX<br>
        llvm::dbgs() << " result: " << Twine::utohexstr(result) << "\n");<br>
    result &= 0xFFF;<br>
    result <<= 10;<br>
-  *reinterpret_cast<llvm::<u></u>support::little32_t *>(location) =<br>
-      result |<br>
-      (int32_t) * reinterpret_cast<llvm::<u></u>support::little32_t *>(location);<br>
+  write32le(location, result | read32le(location));<br>
  }<br>
    // R_AARCH64_TLSIE_ADR_GOTTPREL_<u></u>PAGE21<br>
@@ -314,9 +283,7 @@ static void relocR_AARCH64_TLSIE_ADR_GOT<br>
        llvm::dbgs() << " immhi: " << Twine::utohexstr(immhi);<br>
        llvm::dbgs() << " immlo: " << Twine::utohexstr(immlo);<br>
        llvm::dbgs() << " result: " << Twine::utohexstr(result) << "\n");<br>
-  *reinterpret_cast<llvm::<u></u>support::little32_t *>(location) =<br>
-      immlo | immhi |<br>
-      (int32_t) * reinterpret_cast<llvm::<u></u>support::little32_t *>(location);<br>
+  write32le(location, immlo | immhi | read32le(location));<br>
  }<br>
    // R_AARCH64_TLSIE_LD64_GOTTPREL_<u></u>LO12_NC<br>
@@ -332,9 +299,7 @@ static void relocR_AARCH64_TLSIE_LD64_GO<br>
        llvm::dbgs() << " A: " << Twine::utohexstr(A);<br>
        llvm::dbgs() << " P: " << Twine::utohexstr(P);<br>
        llvm::dbgs() << " result: " << Twine::utohexstr(result) << "\n");<br>
-  *reinterpret_cast<llvm::<u></u>support::little32_t *>(location) =<br>
-      result |<br>
-      (int32_t) * reinterpret_cast<llvm::<u></u>support::little32_t *>(location);<br>
+  write32le(location, result | read32le(location));<br>
  }<br>
    /// \brief R_AARCH64_TLSLE_ADD_TPREL_HI12<br>
@@ -349,9 +314,7 @@ static void relocR_AARCH64_TLSLE_ADD_TPR<br>
        llvm::dbgs() << " A: " << Twine::utohexstr(A);<br>
        llvm::dbgs() << " P: " << Twine::utohexstr(P);<br>
        llvm::dbgs() << " result: " << Twine::utohexstr(result) << "\n");<br>
-  *reinterpret_cast<llvm::<u></u>support::little32_t *>(location) =<br>
-      result |<br>
-      (int32_t) * reinterpret_cast<llvm::<u></u>support::little32_t *>(location);<br>
+  write32le(location, result | read32le(location));<br>
  }<br>
    /// \brief R_AARCH64_TLSLE_ADD_TPREL_<u></u>LO12_NC<br>
@@ -367,9 +330,7 @@ static void relocR_AARCH64_TLSLE_ADD_TPR<br>
        llvm::dbgs() << " A: " << Twine::utohexstr(A);<br>
        llvm::dbgs() << " P: " << Twine::utohexstr(P);<br>
        llvm::dbgs() << " result: " << Twine::utohexstr(result) << "\n");<br>
-  *reinterpret_cast<llvm::<u></u>support::little32_t *>(location) =<br>
-      result |<br>
-      (int32_t) * reinterpret_cast<llvm::<u></u>support::little32_t *>(location);<br>
+  write32le(location, result | read32le(location));<br>
  }<br>
    std::error_code AArch64TargetRelocationHandler<u></u>::applyRelocation(<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/<u></u>ELF/ARM/ARMRelocationHandler.<u></u>cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/ARM/ARMRelocationHandler.cpp?rev=230725&r1=230724&r2=230725&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/ELF/ARM/<u></u>ARMRelocationHandler.cpp?rev=<u></u>230725&r1=230724&r2=230725&<u></u>view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>ELF/ARM/ARMRelocationHandler.<u></u>cpp (original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>ELF/ARM/ARMRelocationHandler.<u></u>cpp Thu Feb 26 21:18:46 2015<br>
@@ -10,6 +10,7 @@<br>
  #include "ARMTargetHandler.h"<br>
  #include "ARMLinkingContext.h"<br>
  +#include "lld/Core/Endian.h"<br>
  #include "llvm/Support/Debug.h"<br>
  #include "llvm/Support/MathExtras.h"<br>
  @@ -17,10 +18,8 @@ using namespace lld;<br>
  using namespace elf;<br>
    static Reference::Addend readAddend_THM_MOV(const uint8_t *location) {<br>
-  const auto halfHi = uint16_t(<br>
-      *reinterpret_cast<const llvm::support::ulittle16_t *>(location));<br>
-  const auto halfLo = uint16_t(<br>
-      *reinterpret_cast<const llvm::support::ulittle16_t *>(location + 2));<br>
+  const uint16_t halfHi = read16le(location);<br>
+  const uint16_t halfLo = read16le(location + 2);<br>
      const uint16_t imm8 = halfLo & 0xFF;<br>
    const uint16_t imm3 = (halfLo >> 12) & 0x7;<br>
@@ -33,8 +32,7 @@ static Reference::Addend readAddend_THM_<br>
  }<br>
    static Reference::Addend readAddend_ARM_MOV(const uint8_t *location) {<br>
-  const auto value = uint32_t(<br>
-      *reinterpret_cast<const llvm::support::ulittle32_t *>(location));<br>
+  const uint32_t value = read32le(location);<br>
      const uint32_t imm12 = value & 0xFFF;<br>
    const uint32_t imm4 = (value >> 16) & 0xF;<br>
@@ -44,10 +42,8 @@ static Reference::Addend readAddend_ARM_<br>
  }<br>
    static Reference::Addend readAddend_THM_CALL(const uint8_t *location) {<br>
-  const auto halfHi = uint16_t(<br>
-      *reinterpret_cast<const llvm::support::ulittle16_t *>(location));<br>
-  const auto halfLo = uint16_t(<br>
-      *reinterpret_cast<const llvm::support::ulittle16_t *>(location + 2));<br>
+  const uint16_t halfHi = read16le(location);<br>
+  const uint16_t halfLo = read16le(location + 2);<br>
      const uint16_t imm10 = halfHi & 0x3FF;<br>
    const uint16_t bitS = (halfHi >> 10) & 0x1;<br>
@@ -64,8 +60,7 @@ static Reference::Addend readAddend_THM_<br>
  }<br>
    static Reference::Addend readAddend_ARM_CALL(const uint8_t *location) {<br>
-  const auto value = uint32_t(<br>
-      *reinterpret_cast<const llvm::support::ulittle32_t *>(location));<br>
+  const uint32_t value = read32le(location);<br>
      const bool isBLX = (value & 0xF0000000) == 0xF0000000;<br>
    const uint32_t bitH = isBLX ? ((value & 0x1000000) >> 24) : 0;<br>
@@ -78,8 +73,7 @@ static Reference::Addend readAddend(cons<br>
                                      Reference::KindValue kindValue) {<br>
    switch (kindValue) {<br>
    case R_ARM_ABS32:<br>
-    return int32_t(<br>
-        *reinterpret_cast<const llvm::support::little32_t *>(location));<br>
+    return (int32_t)read32le(location);<br>
    case R_ARM_THM_CALL:<br>
    case R_ARM_THM_JUMP24:<br>
      return readAddend_THM_CALL(location);<br>
@@ -100,22 +94,16 @@ static Reference::Addend readAddend(cons<br>
  static inline void applyArmReloc(uint8_t *location, uint32_t result,<br>
                                   uint32_t mask = 0xFFFFFFFF) {<br>
    assert(!(result & ~mask));<br>
-  *reinterpret_cast<llvm::<u></u>support::ulittle32_t *>(location) =<br>
-      (uint32_t(*reinterpret_cast<<u></u>llvm::support::ulittle32_t *>(location)) &<br>
-       ~mask) | (result & mask);<br>
+  write32le(location, (read32le(location) & ~mask) | (result & mask));<br>
  }<br>
    static inline void applyThmReloc(uint8_t *location, uint16_t resHi,<br>
                                   uint16_t resLo, uint16_t maskHi,<br>
                                   uint16_t maskLo = 0xFFFF) {<br>
    assert(!(resHi & ~maskHi) && !(resLo & ~maskLo));<br>
-  *reinterpret_cast<llvm::<u></u>support::ulittle16_t *>(location) =<br>
-      (uint16_t(*reinterpret_cast<<u></u>llvm::support::ulittle16_t *>(location)) &<br>
-       ~maskHi) | (resHi & maskHi);<br>
+  write16le(location, (read16le(location) & ~maskHi) | (resHi & maskHi));<br>
    location += 2;<br>
-  *reinterpret_cast<llvm::<u></u>support::ulittle16_t *>(location) =<br>
-      (uint16_t(*reinterpret_cast<<u></u>llvm::support::ulittle16_t *>(location)) &<br>
-       ~maskLo) | (resLo & maskLo);<br>
+  write16le(location, (read16le(location) & ~maskLo) | (resLo & maskLo));<br>
  }<br>
    /// \brief R_ARM_ABS32 - (S + A) | T<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonRelocationHandler.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonRelocationHandler.cpp?rev=230725&r1=230724&r2=230725&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/ELF/Hexagon/<u></u>HexagonRelocationHandler.cpp?<u></u>rev=230725&r1=230724&r2=<u></u>230725&view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonRelocationHandler.cpp (original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonRelocationHandler.cpp Thu Feb 26 21:18:46 2015<br>
@@ -7,10 +7,11 @@<br>
  //<br>
  //===-------------------------<u></u>------------------------------<u></u>---------------===//<br>
  -#include "HexagonTargetHandler.h"<br>
  #include "HexagonLinkingContext.h"<br>
  #include "HexagonRelocationFunctions.h"<br>
+#include "HexagonTargetHandler.h"<br>
  #include "HexagonRelocationHandler.h"<br>
+#include "lld/Core/Endian.h"<br>
    using namespace lld;<br>
  using namespace elf;<br>
@@ -18,9 +19,7 @@ using namespace elf;<br>
  using namespace llvm::ELF;<br>
    #define APPLY_RELOC(result)                                                    \<br>
-  *reinterpret_cast<llvm::<u></u>support::ulittle32_t *>(location) =                  \<br>
-      result |                                                                 \<br>
-      (uint32_t) * reinterpret_cast<llvm::<u></u>support::ulittle32_t *>(location);<br>
+  write32le(location, result | read32le(location));<br>
    static int relocBNPCREL(uint8_t *location, uint64_t P, uint64_t S, uint64_t A,<br>
                          int32_t nBits) {<br>
@@ -349,5 +348,3 @@ std::error_code HexagonTargetRelocationH<br>
      return std::error_code();<br>
  }<br>
-<br>
-<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/<u></u>ELF/X86/X86RelocationHandler.<u></u>cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/X86/X86RelocationHandler.cpp?rev=230725&r1=230724&r2=230725&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/ELF/X86/<u></u>X86RelocationHandler.cpp?rev=<u></u>230725&r1=230724&r2=230725&<u></u>view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>ELF/X86/X86RelocationHandler.<u></u>cpp (original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>ELF/X86/X86RelocationHandler.<u></u>cpp Thu Feb 26 21:18:46 2015<br>
@@ -9,6 +9,7 @@<br>
    #include "X86LinkingContext.h"<br>
  #include "X86TargetHandler.h"<br>
+#include "lld/Core/Endian.h"<br>
    using namespace lld;<br>
  using namespace elf;<br>
@@ -17,18 +18,14 @@ namespace {<br>
  /// \brief R_386_32 - word32:  S + A<br>
  static int reloc32(uint8_t *location, uint64_t P, uint64_t S, uint64_t A) {<br>
    int32_t result = (uint32_t)(S + A);<br>
-  *reinterpret_cast<llvm::<u></u>support::ulittle32_t *>(location) =<br>
-      result |<br>
-      (uint32_t) * reinterpret_cast<llvm::<u></u>support::ulittle32_t *>(location);<br>
+  write32le(location, result | read32le(location));<br>
    return 0;<br>
  }<br>
    /// \brief R_386_PC32 - word32: S + A - P<br>
  static int relocPC32(uint8_t *location, uint64_t P, uint64_t S, uint64_t A) {<br>
    uint32_t result = (uint32_t)((S + A) - P);<br>
-  *reinterpret_cast<llvm::<u></u>support::ulittle32_t *>(location) =<br>
-      result +<br>
-      (uint32_t) * reinterpret_cast<llvm::<u></u>support::ulittle32_t *>(location);<br>
+  write32le(location, result + read32le(location));<br>
    return 0;<br>
  }<br>
  }<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/<u></u>ELF/X86_64/X86_<u></u>64RelocationHandler.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64RelocationHandler.cpp?rev=230725&r1=230724&r2=230725&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/ELF/X86_64/X86_<u></u>64RelocationHandler.cpp?rev=<u></u>230725&r1=230724&r2=230725&<u></u>view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>ELF/X86_64/X86_<u></u>64RelocationHandler.cpp (original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>ELF/X86_64/X86_<u></u>64RelocationHandler.cpp Thu Feb 26 21:18:46 2015<br>
@@ -9,6 +9,7 @@<br>
    #include "X86_64LinkingContext.h"<br>
  #include "X86_64TargetHandler.h"<br>
+#include "lld/Core/Endian.h"<br>
    using namespace lld;<br>
  using namespace elf;<br>
@@ -16,52 +17,40 @@ using namespace elf;<br>
  /// \brief R_X86_64_64 - word64: S + A<br>
  static void reloc64(uint8_t *location, uint64_t P, uint64_t S, int64_t A) {<br>
    uint64_t result = S + A;<br>
-  *reinterpret_cast<llvm::<u></u>support::ulittle64_t *>(location) =<br>
-      result |<br>
-      (uint64_t) * reinterpret_cast<llvm::<u></u>support::ulittle64_t *>(location);<br>
+  write64le(location, result | read64le(location));<br>
  }<br>
    /// \brief R_X86_64_PC32 - word32: S + A - P<br>
  static void relocPC32(uint8_t *location, uint64_t P, uint64_t S, int64_t A) {<br>
    uint32_t result = (uint32_t)((S + A) - P);<br>
-  *reinterpret_cast<llvm::<u></u>support::ulittle32_t *>(location) =<br>
-      result +<br>
-      (uint32_t) * reinterpret_cast<llvm::<u></u>support::ulittle32_t *>(location);<br>
+  write32le(location, result + read32le(location));<br>
  }<br>
    /// \brief R_X86_64_32 - word32:  S + A<br>
  static void reloc32(uint8_t *location, uint64_t P, uint64_t S, int64_t A) {<br>
    int32_t result = (uint32_t)(S + A);<br>
-  *reinterpret_cast<llvm::<u></u>support::ulittle32_t *>(location) =<br>
-      result |<br>
-      (uint32_t) * reinterpret_cast<llvm::<u></u>support::ulittle32_t *>(location);<br>
+  write32le(location, result | read32le(location));<br>
    // TODO: Make sure that the result zero extends to the 64bit value.<br>
  }<br>
    /// \brief R_X86_64_32S - word32:  S + A<br>
  static void reloc32S(uint8_t *location, uint64_t P, uint64_t S, int64_t A) {<br>
    int32_t result = (int32_t)(S + A);<br>
-  *reinterpret_cast<llvm::<u></u>support::little32_t *>(location) =<br>
-      result |<br>
-      (int32_t) * reinterpret_cast<llvm::<u></u>support::little32_t *>(location);<br>
+  write32le(location, result | read32le(location));<br>
    // TODO: Make sure that the result sign extends to the 64bit value.<br>
  }<br>
    /// \brief R_X86_64_16 - word16:  S + A<br>
  static void reloc16(uint8_t *location, uint64_t P, uint64_t S, int64_t A) {<br>
    uint16_t result = (uint16_t)(S + A);<br>
-  *reinterpret_cast<llvm::<u></u>support::ulittle16_t *>(location) =<br>
-      result |<br>
-      (uint16_t) * reinterpret_cast<llvm::<u></u>support::ulittle16_t *>(location);<br>
+  write16le(location, result | read16le(location));<br>
    // TODO: Check for overflow.<br>
  }<br>
    /// \brief R_X86_64_PC64 - word64: S + A - P<br>
  static void relocPC64(uint8_t *location, uint64_t P, uint64_t S, uint64_t A) {<br>
    int64_t result = (uint64_t)((S + A) - P);<br>
-  *reinterpret_cast<llvm::<u></u>support::ulittle64_t *>(location) =<br>
-      result |<br>
-      (uint64_t) * reinterpret_cast<llvm::<u></u>support::ulittle64_t *>(location);<br>
+  write64le(location, result | read64le(location));<br>
  }<br>
    std::error_code X86_64TargetRelocationHandler:<u></u>:applyRelocation(<br>
@@ -100,11 +89,9 @@ std::error_code X86_64TargetRelocationHa<br>
      _tlsSize = _x86_64Layout.getTLSSize();<br>
      if (ref.kindValue() == R_X86_64_TPOFF32 ||<br>
          ref.kindValue() == R_X86_64_DTPOFF32) {<br>
-      int32_t result = (int32_t)(targetVAddress - _tlsSize);<br>
-      *reinterpret_cast<llvm::<u></u>support::little32_t *>(location) = result;<br>
+      write32le(location, targetVAddress - _tlsSize);<br>
      } else {<br>
-      int64_t result = (int64_t)(targetVAddress - _tlsSize);<br>
-      *reinterpret_cast<llvm::<u></u>support::little64_t *>(location) = result;<br>
+      write64le(location, targetVAddress - _tlsSize);<br>
      }<br>
      break;<br>
    }<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/<u></u>PECOFF/IdataPass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/IdataPass.cpp?rev=230725&r1=230724&r2=230725&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/PECOFF/IdataPass.<u></u>cpp?rev=230725&r1=230724&r2=<u></u>230725&view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>PECOFF/IdataPass.cpp (original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>PECOFF/IdataPass.cpp Thu Feb 26 21:18:46 2015<br>
@@ -9,6 +9,7 @@<br>
    #include "IdataPass.h"<br>
  #include "Pass.h"<br>
+#include "lld/Core/Endian.h"<br>
  #include "lld/Core/File.h"<br>
  #include "lld/Core/Pass.h"<br>
  #include "lld/Core/Simple.h"<br>
@@ -45,7 +46,7 @@ std::vector<uint8_t> HintNameAtom::assem<br>
    std::vector<uint8_t> ret(size);<br>
    ret[importName.size()] = 0;<br>
    ret[importName.size() - 1] = 0;<br>
-  *reinterpret_cast<llvm::<u></u>support::ulittle16_t *>(&ret[0]) = hint;<br>
+  write16le(&ret[0], hint);<br>
    std::memcpy(&ret[2], importName.data(), importName.size());<br>
    return ret;<br>
  }<br>
@@ -56,11 +57,11 @@ ImportTableEntryAtom::<u></u>assembleRawContent<br>
    // in PE+. In PE+, bits 62-31 are filled with zero.<br>
    if (is64) {<br>
      std::vector<uint8_t> ret(8);<br>
-    *reinterpret_cast<llvm::<u></u>support::ulittle64_t *>(&ret[0]) = rva;<br>
+    write64le(&ret[0], rva);<br>
      return ret;<br>
    }<br>
    std::vector<uint8_t> ret(4);<br>
-  *reinterpret_cast<llvm::<u></u>support::ulittle32_t *>(&ret[0]) = rva;<br>
+  write32le(&ret[0], rva);<br>
    return ret;<br>
  }<br>
  <br>
Modified: lld/trunk/lib/ReaderWriter/<u></u>PECOFF/ReaderImportHeader.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/ReaderImportHeader.cpp?rev=230725&r1=230724&r2=230725&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/PECOFF/<u></u>ReaderImportHeader.cpp?rev=<u></u>230725&r1=230724&r2=230725&<u></u>view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>PECOFF/ReaderImportHeader.cpp (original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>PECOFF/ReaderImportHeader.cpp Thu Feb 26 21:18:46 2015<br>
@@ -119,6 +119,7 @@<br>
  //===-------------------------<u></u>------------------------------<u></u>---------------===//<br>
    #include "Atoms.h"<br>
+#include "lld/Core/Endian.h"<br>
  #include "lld/Core/Error.h"<br>
  #include "lld/Core/File.h"<br>
  #include "lld/Core/SharedLibraryAtom.h"<br>
@@ -245,22 +246,20 @@ public:<br>
      const char *end = _mb->getBufferEnd();<br>
        // The size of the string that follows the header.<br>
-    uint32_t dataSize = *reinterpret_cast<const support::ulittle32_t *>(<br>
-        buf + offsetof(COFF::ImportHeader, SizeOfData));<br>
+    uint32_t dataSize<br>
+        = read32le(buf + offsetof(COFF::ImportHeader, SizeOfData));<br>
        // Check if the total size is valid.<br>
      if (std::size_t(end - buf) != sizeof(COFF::ImportHeader) + dataSize)<br>
        return make_error_code(<u></u>NativeReaderError::unknown_<u></u>file_format);<br>
  -    uint16_t hint = *reinterpret_cast<const support::ulittle16_t *>(<br>
-        buf + offsetof(COFF::ImportHeader, OrdinalHint));<br>
+    uint16_t hint = read16le(buf + offsetof(COFF::ImportHeader, OrdinalHint));<br>
      StringRef symbolName(buf + sizeof(COFF::ImportHeader));<br>
      StringRef dllName(buf + sizeof(COFF::ImportHeader) + symbolName.size() + 1);<br>
        // TypeInfo is a bitfield. The least significant 2 bits are import<br>
      // type, followed by 3 bit import name type.<br>
-    uint16_t typeInfo = *reinterpret_cast<const support::ulittle16_t *>(<br>
-        buf + offsetof(COFF::ImportHeader, TypeInfo));<br>
+    uint16_t typeInfo = read16le(buf + offsetof(COFF::ImportHeader, TypeInfo));<br>
      int type = typeInfo & 0x3;<br>
      int nameType = (typeInfo >> 2) & 0x7;<br>
  <br>
Modified: lld/trunk/lib/ReaderWriter/<u></u>PECOFF/WriterPECOFF.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp?rev=230725&r1=230724&r2=230725&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/PECOFF/<u></u>WriterPECOFF.cpp?rev=230725&<u></u>r1=230724&r2=230725&view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>PECOFF/WriterPECOFF.cpp (original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>PECOFF/WriterPECOFF.cpp Thu Feb 26 21:18:46 2015<br>
@@ -22,6 +22,7 @@<br>
  #include "Atoms.h"<br>
  #include "WriterImportLibrary.h"<br>
  #include "lld/Core/DefinedAtom.h"<br>
+#include "lld/Core/Endian.h"<br>
  #include "lld/Core/File.h"<br>
  #include "lld/Core/Writer.h"<br>
  #include "lld/ReaderWriter/AtomLayout.<u></u>h"<br>
@@ -198,7 +199,7 @@ public:<br>
        // Set the name of the dummy symbol to the first string table entry.<br>
        // It's better than letting dumpbin print out a garabage as a symbol name.<br>
        char *off = _stringTable.data() + 4;<br>
-      *reinterpret_cast<ulittle32_t *>(off) = 4;<br>
+      write32le(off, 4);<br>
      }<br>
      uint32_t offset = _stringTable.size();<br>
      _stringTable.insert(_<u></u>stringTable.end(), sectionName.begin(),<br>
@@ -213,7 +214,7 @@ public:<br>
      if (_stringTable.empty())<br>
        return;<br>
      char *off = _stringTable.data() + sizeof(llvm::object::coff_<u></u>symbol16);<br>
-    *reinterpret_cast<ulittle32_t *>(off) = _stringTable.size();<br>
+    write32le(off, _stringTable.size());<br>
      std::memcpy(buffer, _stringTable.data(), _stringTable.size());<br>
    }<br>
  @@ -1005,17 +1006,17 @@ BaseRelocChunk::<u></u>createBaseRelocBlock(uin<br>
    uint8_t *ptr = &contents[0];<br>
      // The first four bytes is the page RVA.<br>
-  *reinterpret_cast<ulittle32_t *>(ptr) = pageAddr;<br>
+  write32le(ptr, pageAddr);<br>
    ptr += sizeof(ulittle32_t);<br>
      // The second four bytes is the size of the block, including the the page<br>
    // RVA and this size field.<br>
-  *reinterpret_cast<ulittle32_t *>(ptr) = size;<br>
+  write32le(ptr, size);<br>
    ptr += sizeof(ulittle32_t);<br>
      for (const auto &reloc : relocs) {<br>
      assert(reloc.first < _ctx.getPageSize());<br>
-    *reinterpret_cast<ulittle16_t *>(ptr) = (reloc.second << 12) | reloc.first;<br>
+    write16le(ptr, (reloc.second << 12) | reloc.first);<br>
      ptr += sizeof(ulittle16_t);<br>
    }<br>
    return contents;<br>
<br>
<br>
______________________________<u></u>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu" target="_blank">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/<u></u>mailman/listinfo/llvm-commits</a><br>
<br>
<br>
</blockquote>
<br>
<br></div></div><span><font color="#888888">
-- <br>
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by the Linux Foundation<br>
<br>
</font></span></blockquote></div><br></div></div>