HexagonRelocator.h revision 87f34658dec9097d987d254a990ea7f311bfc95f
16f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===-  HexagonRelocator.h ------------------------------------------------===//
26f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//
36f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//                     The MCLinker Project
46f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//
56f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// This file is distributed under the University of Illinois Open Source
66f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// License. See LICENSE.TXT for details.
76f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//
86f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===//
96f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#ifndef HEXAGON_RELOCATION_FACTORY_H
106f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#define HEXAGON_RELOCATION_FACTORY_H
116f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#ifdef ENABLE_UNITTEST
126f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <gtest.h>
136f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#endif
146f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
156f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <mcld/LD/Relocator.h>
166f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <mcld/Target/GOT.h>
176f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <mcld/Target/PLT.h>
1887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <mcld/Target/KeyEntryMap.h>
196f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include "HexagonLDBackend.h"
206f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
216f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesnamespace mcld {
226f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
236f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass ResolveInfo;
24f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesclass LinkerConfig;
256f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
266f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines/** \class HexagonRelocator
276f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines *  \brief HexagonRelocator creates and destroys the Hexagon relocations.
286f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines *
296f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines */
306f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass HexagonRelocator : public Relocator
316f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{
326f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinespublic:
3387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  typedef KeyEntryMap<ResolveInfo, PLTEntryBase> SymPLTMap;
3487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  typedef KeyEntryMap<ResolveInfo, HexagonGOTEntry> SymGOTMap;
3587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  typedef KeyEntryMap<ResolveInfo, HexagonGOTEntry> SymGOTPLTMap;
3687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  typedef KeyEntryMap<Relocation, Relocation> RelRelMap;
376f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
386f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinespublic:
39f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /** \enum ReservedEntryType
40f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *  \brief The reserved entry type of reserved space in ResolveInfo.
41f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *
42f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *  This is used for sacnRelocation to record what kinds of entries are
4387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines   *  reserved for this resolved symbol. In Hexagon, there are three kinds
4487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines   *  of entries, GOT, PLT, and dynamic relocation.
45f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *
4687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines   *  bit:  3     2     1     0
4787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines   *   |    | PLT | GOT | Rel |
48f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *
49f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *  value    Name         - Description
50f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *
51f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *  0000     None         - no reserved entry
52f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *  0001     ReserveRel   - reserve an dynamic relocation entry
53f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *  0010     ReserveGOT   - reserve an GOT entry
5487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines   *  0100     ReservePLT   - reserve an PLT entry and the corresponding GOT,
5587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines   *
56f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   */
57f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  enum ReservedEntryType {
58f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    None         = 0,
59f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    ReserveRel   = 1,
60f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    ReserveGOT   = 2,
6187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    ReservePLT   = 4,
6287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  };
6387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
6487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /** \enum EntryValue
6587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines   *  \brief The value of the entries. The symbol value will be decided at after
6687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines   *  layout, so we mark the entry during scanRelocation and fill up the actual
6787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines   *  value when applying relocations.
6887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines   */
6987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  enum EntryValue {
7087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    Default = 0,
7187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    SymVal  = 1
72f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  };
73f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
74f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  HexagonRelocator(HexagonLDBackend& pParent, const LinkerConfig& pConfig);
756f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  ~HexagonRelocator();
766f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
776f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  Result applyRelocation(Relocation& pRelocation);
786f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
79f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// scanRelocation - determine the empty entries are needed or not and create
80f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// the empty entries if needed.
81f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// For Hexagon, following entries are check to create:
82f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// - GOT entry (for .got and .got.plt sections)
83f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// - PLT entry (for .plt section)
84f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// - dynamin relocation entries (for .rel.plt and .rel.dyn sections)
85f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  void scanRelocation(Relocation& pReloc,
86f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                      IRBuilder& pBuilder,
87f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                      Module& pModule,
8887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                      LDSection& pSection,
8987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                      Input& pInput);
90f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
91f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  // Handle partial linking
92f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  void partialScanRelocation(Relocation& pReloc,
93f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                             Module& pModule,
94f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                             const LDSection& pSection);
95f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
966f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  HexagonLDBackend& getTarget()
976f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { return m_Target; }
986f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
996f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  const HexagonLDBackend& getTarget() const
1006f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { return m_Target; }
1016f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1026f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  const char* getName(Relocation::Type pType) const;
1036f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1046f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  Size getSize(Relocation::Type pType) const;
1056f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1066f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  const SymPLTMap& getSymPLTMap() const { return m_SymPLTMap; }
1076f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  SymPLTMap&       getSymPLTMap()       { return m_SymPLTMap; }
1086f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1096f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  const SymGOTMap& getSymGOTMap() const { return m_SymGOTMap; }
1106f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  SymGOTMap&       getSymGOTMap()       { return m_SymGOTMap; }
1116f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
112f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  const SymGOTPLTMap& getSymGOTPLTMap() const { return m_SymGOTPLTMap; }
113f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  SymGOTPLTMap&       getSymGOTPLTMap()       { return m_SymGOTPLTMap; }
114f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
11587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  const RelRelMap& getRelRelMap() const { return m_RelRelMap; }
11687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  RelRelMap&       getRelRelMap()       { return m_RelRelMap; }
11787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
118f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesprotected:
119f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// addCopyReloc - add a copy relocation into .rela.dyn for pSym
120f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// @param pSym - A resolved copy symbol that defined in BSS section
121f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  void addCopyReloc(ResolveInfo& pSym, HexagonLDBackend& pTarget);
122f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
123f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// defineSymbolforCopyReloc - allocate a space in BSS section and
124f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// and force define the copy of pSym to BSS section
125f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// @return the output LDSymbol of the copy symbol
126f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  LDSymbol& defineSymbolforCopyReloc(IRBuilder& pLinker,
127f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                                     const ResolveInfo& pSym,
128f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                                     HexagonLDBackend& pTarget);
129f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
1306f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesprivate:
131f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  virtual void scanLocalReloc(Relocation& pReloc,
132f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                              IRBuilder& pBuilder,
133f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                              Module& pModule,
134f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                              LDSection& pSection);
135f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
136f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  virtual void scanGlobalReloc(Relocation& pReloc,
137f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                               IRBuilder& pBuilder,
138f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                               Module& pModule,
139f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                               LDSection& pSection);
140f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
1416f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  HexagonLDBackend& m_Target;
1426f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  SymPLTMap m_SymPLTMap;
1436f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  SymGOTMap m_SymGOTMap;
144f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  SymGOTPLTMap m_SymGOTPLTMap;
14587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  RelRelMap m_RelRelMap;
1466f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines};
1476f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1486f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} // namespace of mcld
1496f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1506f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#endif
1516f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
152