<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Sun, Oct 5, 2014 at 2:30 PM, Saleem Abdulrasool <span dir="ltr"><<a href="mailto:compnerd@compnerd.org" target="_blank">compnerd@compnerd.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: compnerd<br>
Date: Sun Oct  5 16:30:29 2014<br>
New Revision: 219088<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=219088&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=219088&view=rev</a><br>
Log:<br>
PE/COFF: remove another use of PECOFFLinkingContext::is64bit<br>
<br>
In order to support more than x86/x86_64, we need to change the behaviour to use<br>
the actual machine type rather than checking the bitness and assuming that we<br>
are on X86.  This replaces the use of is64bit in applyAllRelocations with a<br>
check on the machine type.  This will enable adding support for handling ARM<br>
relocations.<br>
<br>
Rename the existing applyRelocation methods to be similarly named and to make it<br>
clear the types of relocations they will process.<br>
<br>
Modified:<br>
    lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp?rev=219088&r1=219087&r2=219088&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp?rev=219088&r1=219087&r2=219088&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp (original)<br>
+++ lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp Sun Oct  5 16:30:29 2014<br>
@@ -216,14 +216,18 @@ public:<br>
   void appendAtom(const DefinedAtom *atom);<br>
   void buildAtomRvaMap(std::map<const Atom *, uint64_t> &atomRva) const;<br>
<br>
-  void applyRelocations32(uint8_t *buffer,<br>
-                          std::map<const Atom *, uint64_t> &atomRva,<br>
-                          std::vector<uint64_t> &sectionRva,<br>
-                          uint64_t imageBaseAddress);<br>
-  void applyRelocations64(uint8_t *buffer,<br>
-                          std::map<const Atom *, uint64_t> &atomRva,<br>
-                          std::vector<uint64_t> &sectionRva,<br>
-                          uint64_t imageBaseAddress);<br>
+  void applyRelocationsARM(uint8_t *buffer,<br>
+                           std::map<const Atom *, uint64_t> &atomRva,<br>
+                           std::vector<uint64_t> &sectionRva,<br>
+                           uint64_t imageBaseAddress);<br>
+  void applyRelocationsX86_32(uint8_t *buffer,<br>
+                              std::map<const Atom *, uint64_t> &atomRva,<br>
+                              std::vector<uint64_t> &sectionRva,<br>
+                              uint64_t imageBaseAddress);<br>
+  void applyRelocationsX86_64(uint8_t *buffer,<br>
+                              std::map<const Atom *, uint64_t> &atomRva,<br>
+                              std::vector<uint64_t> &sectionRva,<br>
+                              uint64_t imageBaseAddress);</blockquote><div><br></div><div>I prefer x64 over x86_64 in PE/COFF tree because that seems the official terminology used by Microsoft to refer the x86-64 architecture. Also s/x86_32/x86/.</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"> </blockquote><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
   void printAtomAddresses(uint64_t baseAddr) const;<br>
   void addBaseRelocations(std::vector<uint64_t> &relocSites) const;<br>
@@ -501,10 +505,16 @@ static uint32_t getSectionStartAddr(uint<br>
   llvm_unreachable("Section missing");<br>
 }<br>
<br>
-void AtomChunk::applyRelocations32(uint8_t *buffer,<br>
-                                   std::map<const Atom *, uint64_t> &atomRva,<br>
-                                   std::vector<uint64_t> &sectionRva,<br>
-                                   uint64_t imageBaseAddress) {<br>
+void AtomChunk::applyRelocationsARM(uint8_t *buffer,<br>
+                                    std::map<const Atom *, uint64_t> &atomRva,<br>
+                                    std::vector<uint64_t> &sectionRva,<br>
+                                    uint64_t imageBaseAddress) {<br>
+}<br>
+<br>
+void AtomChunk::applyRelocationsX86_32(uint8_t *buffer,<br>
+                                       std::map<const Atom *, uint64_t> &atomRva,<br>
+                                       std::vector<uint64_t> &sectionRva,<br>
+                                       uint64_t imageBaseAddress) {<br>
   buffer += _fileOffset;<br>
   for (const auto *layout : _atomLayouts) {<br>
     const DefinedAtom *atom = cast<DefinedAtom>(layout->_atom);<br>
@@ -554,10 +564,10 @@ void AtomChunk::applyRelocations32(uint8<br>
   }<br>
 }<br>
<br>
-void AtomChunk::applyRelocations64(uint8_t *buffer,<br>
-                                   std::map<const Atom *, uint64_t> &atomRva,<br>
-                                   std::vector<uint64_t> &sectionRva,<br>
-                                   uint64_t imageBase) {<br>
+void AtomChunk::applyRelocationsX86_64(uint8_t *buffer,<br>
+                                       std::map<const Atom *, uint64_t> &atomRva,<br>
+                                       std::vector<uint64_t> &sectionRva,<br>
+                                       uint64_t imageBase) {<br>
   buffer += _fileOffset;<br>
   for (const auto *layout : _atomLayouts) {<br>
     const DefinedAtom *atom = cast<DefinedAtom>(layout->_atom);<br>
@@ -1100,10 +1110,17 @@ void PECOFFWriter::applyAllRelocations(u<br>
   uint64_t base = _ctx.getBaseAddress();<br>
   for (auto &cp : _chunks) {<br>
     if (AtomChunk *chunk = dyn_cast<AtomChunk>(&*cp)) {<br>
-      if (_ctx.is64Bit()) {<br>
-        chunk->applyRelocations64(bufferStart, _atomRva, sectionRva, base);<br>
-      } else {<br>
-        chunk->applyRelocations32(bufferStart, _atomRva, sectionRva, base);<br>
+      switch (_ctx.getMachineType()) {<br>
+      default: llvm_unreachable("unsupported machine type");<br>
+      case llvm::COFF::IMAGE_FILE_MACHINE_ARMNT:<br>
+        chunk->applyRelocationsARM(bufferStart, _atomRva, sectionRva, base);<br>
+        break;<br>
+      case llvm::COFF::IMAGE_FILE_MACHINE_I386:<br>
+        chunk->applyRelocationsX86_32(bufferStart, _atomRva, sectionRva, base);<br>
+        break;<br>
+      case llvm::COFF::IMAGE_FILE_MACHINE_AMD64:<br>
+        chunk->applyRelocationsX86_64(bufferStart, _atomRva, sectionRva, base);<br>
+        break;<br>
       }<br>
     }<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></div>