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//===----------------------------------------------------------------------===//
9551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#ifndef TARGET_HEXAGON_HEXAGONRELOCATOR_H
10551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#define TARGET_HEXAGON_HEXAGONRELOCATOR_H
116f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
126f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <mcld/LD/Relocator.h>
136f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <mcld/Target/GOT.h>
146f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <mcld/Target/PLT.h>
1587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <mcld/Target/KeyEntryMap.h>
166f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include "HexagonLDBackend.h"
176f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
186f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesnamespace mcld {
196f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
206f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass ResolveInfo;
21f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesclass LinkerConfig;
226f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
236f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines/** \class HexagonRelocator
246f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines *  \brief HexagonRelocator creates and destroys the Hexagon relocations.
256f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines *
266f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines */
276f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass HexagonRelocator : public Relocator
286f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{
296f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinespublic:
3087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  typedef KeyEntryMap<ResolveInfo, PLTEntryBase> SymPLTMap;
3187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  typedef KeyEntryMap<ResolveInfo, HexagonGOTEntry> SymGOTMap;
3287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  typedef KeyEntryMap<ResolveInfo, HexagonGOTEntry> SymGOTPLTMap;
3387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  typedef KeyEntryMap<Relocation, Relocation> RelRelMap;
346f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
356f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinespublic:
36f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /** \enum ReservedEntryType
37f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *  \brief The reserved entry type of reserved space in ResolveInfo.
38f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *
39f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *  This is used for sacnRelocation to record what kinds of entries are
4087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines   *  reserved for this resolved symbol. In Hexagon, there are three kinds
4187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines   *  of entries, GOT, PLT, and dynamic relocation.
42f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *
4387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines   *  bit:  3     2     1     0
4487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines   *   |    | PLT | GOT | Rel |
45f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *
46f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *  value    Name         - Description
47f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *
48f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *  0000     None         - no reserved entry
49f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *  0001     ReserveRel   - reserve an dynamic relocation entry
50f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *  0010     ReserveGOT   - reserve an GOT entry
5187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines   *  0100     ReservePLT   - reserve an PLT entry and the corresponding GOT,
5287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines   *
53f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   */
54f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  enum ReservedEntryType {
55f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    None         = 0,
56f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    ReserveRel   = 1,
57f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    ReserveGOT   = 2,
5887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    ReservePLT   = 4,
5987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  };
6087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
6187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /** \enum EntryValue
6287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines   *  \brief The value of the entries. The symbol value will be decided at after
6387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines   *  layout, so we mark the entry during scanRelocation and fill up the actual
6487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines   *  value when applying relocations.
6587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines   */
6687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  enum EntryValue {
6787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    Default = 0,
6887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    SymVal  = 1
69f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  };
70f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
71f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  HexagonRelocator(HexagonLDBackend& pParent, const LinkerConfig& pConfig);
726f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  ~HexagonRelocator();
736f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
746f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  Result applyRelocation(Relocation& pRelocation);
756f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
76f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// scanRelocation - determine the empty entries are needed or not and create
77f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// the empty entries if needed.
78f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// For Hexagon, following entries are check to create:
79f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// - GOT entry (for .got and .got.plt sections)
80f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// - PLT entry (for .plt section)
81f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// - dynamin relocation entries (for .rel.plt and .rel.dyn sections)
82f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  void scanRelocation(Relocation& pReloc,
83f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                      IRBuilder& pBuilder,
84f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                      Module& pModule,
8587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                      LDSection& pSection,
8687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                      Input& pInput);
87f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
88f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  // Handle partial linking
89f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  void partialScanRelocation(Relocation& pReloc,
90f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                             Module& pModule,
91f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                             const LDSection& pSection);
92f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
936f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  HexagonLDBackend& getTarget()
946f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { return m_Target; }
956f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
966f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  const HexagonLDBackend& getTarget() const
976f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { return m_Target; }
986f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
996f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  const char* getName(Relocation::Type pType) const;
1006f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1016f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  Size getSize(Relocation::Type pType) const;
1026f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1036f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  const SymPLTMap& getSymPLTMap() const { return m_SymPLTMap; }
1046f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  SymPLTMap&       getSymPLTMap()       { return m_SymPLTMap; }
1056f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1066f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  const SymGOTMap& getSymGOTMap() const { return m_SymGOTMap; }
1076f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  SymGOTMap&       getSymGOTMap()       { return m_SymGOTMap; }
1086f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
109f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  const SymGOTPLTMap& getSymGOTPLTMap() const { return m_SymGOTPLTMap; }
110f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  SymGOTPLTMap&       getSymGOTPLTMap()       { return m_SymGOTPLTMap; }
111f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
11287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  const RelRelMap& getRelRelMap() const { return m_RelRelMap; }
11387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  RelRelMap&       getRelRelMap()       { return m_RelRelMap; }
11487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
115f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesprotected:
116f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// addCopyReloc - add a copy relocation into .rela.dyn for pSym
117f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// @param pSym - A resolved copy symbol that defined in BSS section
118f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  void addCopyReloc(ResolveInfo& pSym, HexagonLDBackend& pTarget);
119f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
120f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// defineSymbolforCopyReloc - allocate a space in BSS section and
121f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// and force define the copy of pSym to BSS section
122f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// @return the output LDSymbol of the copy symbol
123f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  LDSymbol& defineSymbolforCopyReloc(IRBuilder& pLinker,
124f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                                     const ResolveInfo& pSym,
125f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                                     HexagonLDBackend& pTarget);
126f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
1276f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesprivate:
128f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  virtual void scanLocalReloc(Relocation& pReloc,
129f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                              IRBuilder& pBuilder,
130f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                              Module& pModule,
131f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                              LDSection& pSection);
132f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
133f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  virtual void scanGlobalReloc(Relocation& pReloc,
134f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                               IRBuilder& pBuilder,
135f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                               Module& pModule,
136f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                               LDSection& pSection);
137f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
1386f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  HexagonLDBackend& m_Target;
1396f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  SymPLTMap m_SymPLTMap;
1406f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  SymGOTMap m_SymGOTMap;
141f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  SymGOTPLTMap m_SymGOTPLTMap;
14287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  RelRelMap m_RelRelMap;
1436f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines};
1446f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1456f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} // namespace of mcld
1466f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1476f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#endif
1486f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
149