[lld] r176298 - [ELF][Hexagon] add quickdata relocations

Shankar Easwaran shankare at codeaurora.org
Thu Feb 28 12:54:04 PST 2013


Author: shankare
Date: Thu Feb 28 14:54:03 2013
New Revision: 176298

URL: http://llvm.org/viewvc/llvm-project?rev=176298&view=rev
Log:
[ELF][Hexagon] add quickdata relocations

Modified:
    lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonRelocationHandler.cpp
    lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonRelocationHandler.h
    lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonSectionChunks.h
    lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.cpp
    lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h
    lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetInfo.h

Modified: lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonRelocationHandler.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonRelocationHandler.cpp?rev=176298&r1=176297&r2=176298&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonRelocationHandler.cpp (original)
+++ lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonRelocationHandler.cpp Thu Feb 28 14:54:03 2013
@@ -107,6 +107,20 @@ int relocHex_N_X(uint8_t *location, uint
   return 0;
 }
 
+// GP REL relocations
+int relocHexGPRELN(uint8_t *location, uint64_t P, uint64_t S, uint64_t A,
+                   uint64_t GP, int nShiftBits) {
+  int32_t result = (int64_t)((S + A - GP) >> nShiftBits);
+  int32_t range = 1L << 16;
+  if (result <= range) {
+    result = lld::scatterBits<uint32_t>(result, FINDV4BITMASK(location));
+    *reinterpret_cast<llvm::support::ulittle32_t *>(location) =
+        result |
+        (uint32_t) * reinterpret_cast<llvm::support::ulittle32_t *>(location);
+    return 0;
+  }
+  return 1;
+}
 } // end anon namespace
 
 ErrorOr<void> HexagonTargetRelocationHandler::applyRelocation(
@@ -157,6 +171,22 @@ ErrorOr<void> HexagonTargetRelocationHan
   case R_HEX_B7_PCREL_X:
     relocHexBNPCRELX(location, relocVAddress, targetVAddress, ref.addend(), 6);
     break;
+  case R_HEX_GPREL16_0:
+    relocHexGPRELN(location, relocVAddress, targetVAddress, ref.addend(),
+                   _targetLayout.getSDataSection()->virtualAddr(), 0);
+    break;
+  case R_HEX_GPREL16_1:
+    relocHexGPRELN(location, relocVAddress, targetVAddress, ref.addend(),
+                   _targetLayout.getSDataSection()->virtualAddr(), 1);
+    break;
+  case R_HEX_GPREL16_2:
+    relocHexGPRELN(location, relocVAddress, targetVAddress, ref.addend(),
+                   _targetLayout.getSDataSection()->virtualAddr(), 2);
+    break;
+  case R_HEX_GPREL16_3:
+    relocHexGPRELN(location, relocVAddress, targetVAddress, ref.addend(),
+                   _targetLayout.getSDataSection()->virtualAddr(), 3);
+    break;
   case R_HEX_16_X:
   case R_HEX_12_X:
   case R_HEX_11_X:

Modified: lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonRelocationHandler.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonRelocationHandler.h?rev=176298&r1=176297&r2=176298&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonRelocationHandler.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonRelocationHandler.h Thu Feb 28 14:54:03 2013
@@ -9,6 +9,7 @@
 #ifndef LLD_READER_WRITER_ELF_HEXAGON_RELOCATION_HANDLER_H
 #define LLD_READER_WRITER_ELF_HEXAGON_RELOCATION_HANDLER_H
 
+#include "HexagonSectionChunks.h"
 #include "HexagonTargetHandler.h"
 #include "lld/ReaderWriter/RelocationHelperFunctions.h"
 
@@ -17,19 +18,23 @@ namespace elf {
 typedef llvm::object::ELFType<llvm::support::little, 4, false> HexagonELFType;
 
 class HexagonTargetInfo;
+class HexagonTargetHandler;
+template <class HexagonELFType> class HexagonTargetLayout;
 
-class HexagonTargetRelocationHandler LLVM_FINAL
-    : public TargetRelocationHandler<HexagonELFType> {
+class HexagonTargetRelocationHandler LLVM_FINAL :
+    public TargetRelocationHandler<HexagonELFType> {
 public:
-  HexagonTargetRelocationHandler(const HexagonTargetInfo &ti) : _targetInfo(ti) 
-  {}
-
-  virtual ErrorOr<void> applyRelocation(ELFWriter &, llvm::FileOutputBuffer &,
-                                        const AtomLayout &,
-                                        const Reference &)const;
-
+  HexagonTargetRelocationHandler(
+      const HexagonTargetInfo &ti,
+      const HexagonTargetLayout<HexagonELFType> &layout)
+      : _targetInfo(ti), _targetLayout(layout) {}
+
+  virtual ErrorOr<void>
+  applyRelocation(ELFWriter &, llvm::FileOutputBuffer &, const AtomLayout &,
+                  const Reference &) const;
 private:
   const HexagonTargetInfo &_targetInfo;
+  const HexagonTargetLayout<HexagonELFType> &_targetLayout;
 };
 } // elf
 } // lld 

Modified: lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonSectionChunks.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonSectionChunks.h?rev=176298&r1=176297&r2=176298&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonSectionChunks.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonSectionChunks.h Thu Feb 28 14:54:03 2013
@@ -6,6 +6,8 @@
 // License. See LICENSE.TXT for details.
 //
 //===----------------------------------------------------------------------===//
+#ifndef LLD_READER_WRITER_ELF_HEXAGON_SECTION_CHUNKS_H
+#define LLD_READER_WRITER_ELF_HEXAGON_SECTION_CHUNKS_H
 
 #include "HexagonTargetHandler.h"
 
@@ -75,3 +77,4 @@ void SDataSection<HexagonELFType>::doPre
 } // elf
 } // lld
 
+#endif // LLD_READER_WRITER_ELF_HEXAGON_SECTION_CHUNKS_H

Modified: lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.cpp?rev=176298&r1=176297&r2=176298&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.cpp (original)
+++ lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.cpp Thu Feb 28 14:54:03 2013
@@ -16,6 +16,6 @@ using namespace elf;
 using namespace llvm::ELF;
 
 HexagonTargetHandler::HexagonTargetHandler(HexagonTargetInfo &targetInfo)
-    : DefaultTargetHandler(targetInfo), _relocationHandler(targetInfo),
-      _targetLayout(targetInfo), _hexagonRuntimeFile(targetInfo) {
-}
+    : DefaultTargetHandler(targetInfo), _targetLayout(targetInfo),
+      _relocationHandler(targetInfo, _targetLayout),
+      _hexagonRuntimeFile(targetInfo) {}

Modified: lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h?rev=176298&r1=176297&r2=176298&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h Thu Feb 28 14:54:03 2013
@@ -156,11 +156,11 @@ public:
     header->e_flags(0x3);
   }
 
-  virtual TargetLayout<HexagonELFType> &targetLayout() {
+  virtual HexagonTargetLayout<HexagonELFType> &targetLayout() {
     return _targetLayout;
   }
 
-  virtual TargetAtomHandler<HexagonELFType> &targetAtomHandler() {
+  virtual HexagonTargetAtomHandler<HexagonELFType> &targetAtomHandler() {
     return _targetAtomHandler;
   }
 
@@ -184,10 +184,10 @@ public:
   }
 
 private:
-  HexagonTargetRelocationHandler _relocationHandler;
   HexagonTargetLayout<HexagonELFType> _targetLayout;
+  HexagonTargetRelocationHandler _relocationHandler;
   HexagonTargetAtomHandler<HexagonELFType> _targetAtomHandler;
-  HexagonRuntimeFile<HexagonELFType> _hexagonRuntimeFile; 
+  HexagonRuntimeFile<HexagonELFType> _hexagonRuntimeFile;
 };
 } // end namespace elf
 } // end namespace lld

Modified: lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetInfo.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetInfo.h?rev=176298&r1=176297&r2=176298&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetInfo.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetInfo.h Thu Feb 28 14:54:03 2013
@@ -20,6 +20,7 @@
 
 namespace lld {
 namespace elf {
+
 class HexagonTargetInfo LLVM_FINAL : public ELFTargetInfo {
 public:
   HexagonTargetInfo(const LinkerOptions &lo) : ELFTargetInfo(lo) {





More information about the llvm-commits mailing list