Home | History | Annotate | Download | only in Hexagon
      1 //===-  HexagonRelocator.h ------------------------------------------------===//
      2 //
      3 //                     The MCLinker Project
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 #ifndef HEXAGON_RELOCATION_FACTORY_H
     10 #define HEXAGON_RELOCATION_FACTORY_H
     11 #ifdef ENABLE_UNITTEST
     12 #include <gtest.h>
     13 #endif
     14 
     15 #include <mcld/LD/Relocator.h>
     16 #include <mcld/Target/GOT.h>
     17 #include <mcld/Target/PLT.h>
     18 #include <mcld/Target/SymbolEntryMap.h>
     19 #include "HexagonLDBackend.h"
     20 
     21 namespace mcld {
     22 
     23 class ResolveInfo;
     24 class LinkerConfig;
     25 
     26 /** \class HexagonRelocator
     27  *  \brief HexagonRelocator creates and destroys the Hexagon relocations.
     28  *
     29  */
     30 class HexagonRelocator : public Relocator
     31 {
     32 public:
     33   typedef SymbolEntryMap<PLTEntryBase> SymPLTMap;
     34   typedef SymbolEntryMap<HexagonGOTEntry> SymGOTMap;
     35   typedef SymbolEntryMap<HexagonGOTEntry> SymGOTPLTMap;
     36 
     37 
     38 public:
     39   /** \enum ReservedEntryType
     40    *  \brief The reserved entry type of reserved space in ResolveInfo.
     41    *
     42    *  This is used for sacnRelocation to record what kinds of entries are
     43    *  reserved for this resolved symbol
     44    *
     45    *  In Hexagon, there are three kinds of entries, GOT, PLT, and dynamic
     46    *  relocation.
     47    *
     48    *  GOT may needs a corresponding relocation to relocate itself, so we
     49    *  separate GOT to two situations: GOT and GOTRel. Besides, for the same
     50    *  symbol, there might be two kinds of entries reserved for different location.
     51    *  For example, reference to the same symbol, one may use GOT and the other may
     52    *  use dynamic relocation.
     53    *
     54    *  bit:  3       2      1     0
     55    *   | PLT | GOTRel | GOT | Rel |
     56    *
     57    *  value    Name         - Description
     58    *
     59    *  0000     None         - no reserved entry
     60    *  0001     ReserveRel   - reserve an dynamic relocation entry
     61    *  0010     ReserveGOT   - reserve an GOT entry
     62    *  0011     GOTandRel    - For different relocation, we've reserved GOT and
     63    *                          Rel for different location.
     64    *  0100     GOTRel       - reserve an GOT entry and the corresponding Dyncamic
     65    *                          relocation entry which relocate this GOT entry
     66    *  0101     GOTRelandRel - For different relocation, we've reserved GOTRel
     67    *                          and relocation entry for different location.
     68    *  1000     ReservePLT   - reserve an PLT entry and the corresponding GOT,
     69    *                          Dynamic relocation entries
     70    *  1001     PLTandRel    - For different relocation, we've reserved PLT and
     71    *                          Rel for different location.
     72    */
     73   enum ReservedEntryType {
     74     None         = 0,
     75     ReserveRel   = 1,
     76     ReserveGOT   = 2,
     77     GOTandRel    = 3,
     78     GOTRel       = 4,
     79     GOTRelandRel = 5,
     80     ReservePLT   = 8,
     81     PLTandRel    = 9
     82   };
     83 
     84   HexagonRelocator(HexagonLDBackend& pParent, const LinkerConfig& pConfig);
     85   ~HexagonRelocator();
     86 
     87   Result applyRelocation(Relocation& pRelocation);
     88 
     89   /// scanRelocation - determine the empty entries are needed or not and create
     90   /// the empty entries if needed.
     91   /// For Hexagon, following entries are check to create:
     92   /// - GOT entry (for .got and .got.plt sections)
     93   /// - PLT entry (for .plt section)
     94   /// - dynamin relocation entries (for .rel.plt and .rel.dyn sections)
     95   void scanRelocation(Relocation& pReloc,
     96                       IRBuilder& pBuilder,
     97                       Module& pModule,
     98                       LDSection& pSection);
     99 
    100   // Handle partial linking
    101   void partialScanRelocation(Relocation& pReloc,
    102                              Module& pModule,
    103                              const LDSection& pSection);
    104 
    105   HexagonLDBackend& getTarget()
    106   { return m_Target; }
    107 
    108   const HexagonLDBackend& getTarget() const
    109   { return m_Target; }
    110 
    111   const char* getName(Relocation::Type pType) const;
    112 
    113   Size getSize(Relocation::Type pType) const;
    114 
    115   const SymPLTMap& getSymPLTMap() const { return m_SymPLTMap; }
    116   SymPLTMap&       getSymPLTMap()       { return m_SymPLTMap; }
    117 
    118   const SymGOTMap& getSymGOTMap() const { return m_SymGOTMap; }
    119   SymGOTMap&       getSymGOTMap()       { return m_SymGOTMap; }
    120 
    121   const SymGOTPLTMap& getSymGOTPLTMap() const { return m_SymGOTPLTMap; }
    122   SymGOTPLTMap&       getSymGOTPLTMap()       { return m_SymGOTPLTMap; }
    123 
    124 protected:
    125   /// addCopyReloc - add a copy relocation into .rela.dyn for pSym
    126   /// @param pSym - A resolved copy symbol that defined in BSS section
    127   void addCopyReloc(ResolveInfo& pSym, HexagonLDBackend& pTarget);
    128 
    129   /// defineSymbolforCopyReloc - allocate a space in BSS section and
    130   /// and force define the copy of pSym to BSS section
    131   /// @return the output LDSymbol of the copy symbol
    132   LDSymbol& defineSymbolforCopyReloc(IRBuilder& pLinker,
    133                                      const ResolveInfo& pSym,
    134                                      HexagonLDBackend& pTarget);
    135 
    136 private:
    137   virtual void scanLocalReloc(Relocation& pReloc,
    138                               IRBuilder& pBuilder,
    139                               Module& pModule,
    140                               LDSection& pSection);
    141 
    142   virtual void scanGlobalReloc(Relocation& pReloc,
    143                                IRBuilder& pBuilder,
    144                                Module& pModule,
    145                                LDSection& pSection);
    146 
    147   HexagonLDBackend& m_Target;
    148   SymPLTMap m_SymPLTMap;
    149   SymGOTMap m_SymGOTMap;
    150   SymGOTPLTMap m_SymGOTPLTMap;
    151 };
    152 
    153 } // namespace of mcld
    154 
    155 #endif
    156 
    157