<div dir="ltr">We should probably kill range.h by replacing range<> with llvm::iterator_range<>, and move Endian.h to llvm/include/Support. After that only Instrumentation.h and Parallel.h are generic enough. It doesn't worth creating a new directory for 4 files, and it will not worth even less if we clean things up.</div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Feb 26, 2015 at 10:01 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">For example Endian.h that you added is a utility function ,IMO it doesnot belong to Core.<br>
<br>
May be you are right that it could be moved to llvm/Support.<br>
<br>
I have been always tempted to create a lld/Support (or) lld/Utils all the while and house these files atleast temporarily and not overly add files to lld/Core.<span class="HOEnZb"><font color="#888888"><br>
<br>
Shankar Easwaran</font></span><div class="HOEnZb"><div class="h5"><br>
<br>
On 2/26/2015 11:43 PM, Rui Ueyama wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Thinking about the number of files in include/Core that can be moved to the<br>
new directory, I think it's a bit overkill to create a new directory.<br>
<br>
Also the fundamental idea of lld/include/Support itself may be wrong; if we<br>
have very a generic feature, which is so generic that that doesn't depends<br>
on any other part of LLD, it needs to go to LLVM's Support or ADT directory.<br>
<br>
On Thu, Feb 26, 2015 at 9:33 PM, Shankar Easwaran <<a href="mailto:shankare@codeaurora.org" target="_blank">shankare@codeaurora.org</a>><br>
wrote:<br>
<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<br>
directory to house all these utility functions.<br>
<br>
We have a lot of header files in lld/Core and its growing, possibly some<br>
of them need to be moved to Support as that doesnot affect the core<br>
functionality of lld.<br>
<br>
Shankar Easwaran<br>
<br>
<br>
On 2/26/2015 9:18 PM, Rui Ueyama wrote:<br>
<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/" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/include/lld/</a><br>
Core/Endian.h?rev=230725&view=<u></u>auto<br>
==============================<u></u>==============================<br>
==================<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>
+//<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>------------------------------<br>
----------------===//<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/<br>
AArch64RelocationHandler.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/</a><br>
ReaderWriter/ELF/AArch64/<u></u>AArch64RelocationHandler.cpp?<br>
rev=230725&r1=230724&r2=<u></u>230725&view=diff<br>
==============================<u></u>==============================<br>
==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>ELF/AArch64/<u></u>AArch64RelocationHandler.cpp<br>
(original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>ELF/AArch64/<u></u>AArch64RelocationHandler.cpp<br>
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) <<<br>
"\n");<br>
-  *reinterpret_cast<llvm::<u></u>support::ulittle64_t *>(location) =<br>
-      result |<br>
-      (int64_t) * reinterpret_cast<llvm::<u></u>support::little64_t<br>
*>(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,<br>
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<br>
*>(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) <<<br>
"\n");<br>
-  *reinterpret_cast<llvm::<u></u>support::ulittle32_t *>(location) =<br>
-      result |<br>
-      (int32_t) * reinterpret_cast<llvm::<u></u>support::little32_t<br>
*>(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<br>
*>(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<br>
*>(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<br>
*>(location);<br>
+  write32le(location, result | read32le(location));<br>
   }<br>
     static void relocJump26(uint8_t *location, uint64_t P, uint64_t S,<br>
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<br>
*>(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<br>
*>(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<br>
*>(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<br>
*>(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<br>
*>(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<br>
*>(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<br>
*>(location);<br>
+  write32le(location, result | read32le(location));<br>
   }<br>
     static void relocR_AARCH64_ADR_GOT_PAGE(<u></u>uint8_t *location, uint64_t<br>
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<br>
*>(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<br>
*>(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<br>
*>(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<br>
*>(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<br>
*>(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<br>
*>(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<br>
*>(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/" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/</a><br>
ReaderWriter/ELF/ARM/<u></u>ARMRelocationHandler.cpp?rev=<br>
230725&r1=230724&r2=230725&<u></u>view=diff<br>
==============================<u></u>==============================<br>
==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>ELF/ARM/ARMRelocationHandler.<u></u>cpp<br>
(original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>ELF/ARM/ARMRelocationHandler.<u></u>cpp Thu Feb<br>
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 +<br>
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>
{<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 +<br>
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>
{<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<br>
*>(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<br>
*>(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<br>
*>(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/<br>
HexagonRelocationHandler.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/</a><br>
ReaderWriter/ELF/Hexagon/<u></u>HexagonRelocationHandler.cpp?<br>
rev=230725&r1=230724&r2=<u></u>230725&view=diff<br>
==============================<u></u>==============================<br>
==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonRelocationHandler.cpp<br>
(original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonRelocationHandler.cpp<br>
Thu Feb 26 21:18:46 2015<br>
@@ -7,10 +7,11 @@<br>
   //<br>
   //===-------------------------<u></u>------------------------------<br>
---------------===//<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>
           \<br>
-  *reinterpret_cast<llvm::<u></u>support::ulittle32_t *>(location) =<br>
         \<br>
-      result |<br>
        \<br>
-      (uint32_t) * reinterpret_cast<llvm::<u></u>support::ulittle32_t<br>
*>(location);<br>
+  write32le(location, result | read32le(location));<br>
     static int relocBNPCREL(uint8_t *location, uint64_t P, uint64_t S,<br>
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/" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/</a><br>
ReaderWriter/ELF/X86/<u></u>X86RelocationHandler.cpp?rev=<br>
230725&r1=230724&r2=230725&<u></u>view=diff<br>
==============================<u></u>==============================<br>
==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>ELF/X86/X86RelocationHandler.<u></u>cpp<br>
(original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>ELF/X86/X86RelocationHandler.<u></u>cpp Thu Feb<br>
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<br>
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<br>
*>(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,<br>
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<br>
*>(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_<br>
64RelocationHandler.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/</a><br>
ReaderWriter/ELF/X86_64/X86_<u></u>64RelocationHandler.cpp?rev=<br>
230725&r1=230724&r2=230725&<u></u>view=diff<br>
==============================<u></u>==============================<br>
==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>ELF/X86_64/X86_<u></u>64RelocationHandler.cpp<br>
(original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>ELF/X86_64/X86_<u></u>64RelocationHandler.cpp<br>
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<br>
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<br>
*>(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,<br>
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<br>
*>(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<br>
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<br>
*>(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<br>
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<br>
*>(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<br>
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<br>
*>(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,<br>
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<br>
*>(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/" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/</a><br>
ReaderWriter/PECOFF/IdataPass.<u></u>cpp?rev=230725&r1=230724&r2=<br>
230725&view=diff<br>
==============================<u></u>==============================<br>
==================<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<br>
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/" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/</a><br>
ReaderWriter/PECOFF/<u></u>ReaderImportHeader.cpp?rev=<br>
230725&r1=230724&r2=230725&<u></u>view=diff<br>
==============================<u></u>==============================<br>
==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>PECOFF/ReaderImportHeader.cpp (original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>PECOFF/ReaderImportHeader.cpp Thu Feb 26<br>
21:18:46 2015<br>
@@ -119,6 +119,7 @@<br>
   //===-------------------------<u></u>------------------------------<br>
---------------===//<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,<br>
OrdinalHint));<br>
       StringRef symbolName(buf + sizeof(COFF::ImportHeader));<br>
       StringRef dllName(buf + sizeof(COFF::ImportHeader) +<br>
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,<br>
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/" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/</a><br>
ReaderWriter/PECOFF/<u></u>WriterPECOFF.cpp?rev=230725&<br>
r1=230724&r2=230725&view=diff<br>
==============================<u></u>==============================<br>
==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>PECOFF/WriterPECOFF.cpp (original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>PECOFF/WriterPECOFF.cpp Thu Feb 26<br>
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<br>
entry.<br>
         // It's better than letting dumpbin print out a garabage as a<br>
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_<br>
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<br>
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) |<br>
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>
<br>
</blockquote>
--<br>
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted<br>
by the Linux Foundation<br>
<br>
<br>
</blockquote></blockquote>
<br>
<br>
-- <br>
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by the Linux Foundation<br>
<br>
</div></div></blockquote></div><br></div>