HexagonRelocator.h revision f7ac0f19a1c8d0ad14bcf6456ce368b830fea886
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>
186f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <mcld/Target/SymbolEntryMap.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:
336f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef SymbolEntryMap<PLTEntryBase> SymPLTMap;
346f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef SymbolEntryMap<HexagonGOTEntry> SymGOTMap;
35f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  typedef SymbolEntryMap<HexagonGOTEntry> SymGOTPLTMap;
36f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
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
43f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *  reserved for this resolved symbol
44f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *
45f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *  In Hexagon, there are three kinds of entries, GOT, PLT, and dynamic
46f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *  relocation.
47f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *
48f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *  GOT may needs a corresponding relocation to relocate itself, so we
49f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *  separate GOT to two situations: GOT and GOTRel. Besides, for the same
50f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *  symbol, there might be two kinds of entries reserved for different location.
51f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *  For example, reference to the same symbol, one may use GOT and the other may
52f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *  use dynamic relocation.
53f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *
54f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *  bit:  3       2      1     0
55f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *   | PLT | GOTRel | GOT | Rel |
56f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *
57f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *  value    Name         - Description
58f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *
59f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *  0000     None         - no reserved entry
60f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *  0001     ReserveRel   - reserve an dynamic relocation entry
61f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *  0010     ReserveGOT   - reserve an GOT entry
62f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *  0011     GOTandRel    - For different relocation, we've reserved GOT and
63f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *                          Rel for different location.
64f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *  0100     GOTRel       - reserve an GOT entry and the corresponding Dyncamic
65f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *                          relocation entry which relocate this GOT entry
66f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *  0101     GOTRelandRel - For different relocation, we've reserved GOTRel
67f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *                          and relocation entry for different location.
68f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *  1000     ReservePLT   - reserve an PLT entry and the corresponding GOT,
69f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *                          Dynamic relocation entries
70f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *  1001     PLTandRel    - For different relocation, we've reserved PLT and
71f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *                          Rel for different location.
72f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   */
73f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  enum ReservedEntryType {
74f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    None         = 0,
75f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    ReserveRel   = 1,
76f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    ReserveGOT   = 2,
77f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    GOTandRel    = 3,
78f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    GOTRel       = 4,
79f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    GOTRelandRel = 5,
80f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    ReservePLT   = 8,
81f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    PLTandRel    = 9
82f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  };
83f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
84f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  HexagonRelocator(HexagonLDBackend& pParent, const LinkerConfig& pConfig);
856f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  ~HexagonRelocator();
866f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
876f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  Result applyRelocation(Relocation& pRelocation);
886f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
89f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// scanRelocation - determine the empty entries are needed or not and create
90f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// the empty entries if needed.
91f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// For Hexagon, following entries are check to create:
92f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// - GOT entry (for .got and .got.plt sections)
93f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// - PLT entry (for .plt section)
94f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// - dynamin relocation entries (for .rel.plt and .rel.dyn sections)
95f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  void scanRelocation(Relocation& pReloc,
96f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                      IRBuilder& pBuilder,
97f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                      Module& pModule,
98f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                      LDSection& pSection);
99f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
100f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  // Handle partial linking
101f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  void partialScanRelocation(Relocation& pReloc,
102f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                             Module& pModule,
103f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                             const LDSection& pSection);
104f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
1056f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  HexagonLDBackend& getTarget()
1066f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { return m_Target; }
1076f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1086f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  const HexagonLDBackend& getTarget() const
1096f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { return m_Target; }
1106f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1116f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  const char* getName(Relocation::Type pType) const;
1126f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1136f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  Size getSize(Relocation::Type pType) const;
1146f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1156f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  const SymPLTMap& getSymPLTMap() const { return m_SymPLTMap; }
1166f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  SymPLTMap&       getSymPLTMap()       { return m_SymPLTMap; }
1176f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1186f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  const SymGOTMap& getSymGOTMap() const { return m_SymGOTMap; }
1196f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  SymGOTMap&       getSymGOTMap()       { return m_SymGOTMap; }
1206f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
121f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  const SymGOTPLTMap& getSymGOTPLTMap() const { return m_SymGOTPLTMap; }
122f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  SymGOTPLTMap&       getSymGOTPLTMap()       { return m_SymGOTPLTMap; }
123f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
124f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesprotected:
125f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// addCopyReloc - add a copy relocation into .rela.dyn for pSym
126f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// @param pSym - A resolved copy symbol that defined in BSS section
127f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  void addCopyReloc(ResolveInfo& pSym, HexagonLDBackend& pTarget);
128f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
129f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// defineSymbolforCopyReloc - allocate a space in BSS section and
130f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// and force define the copy of pSym to BSS section
131f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// @return the output LDSymbol of the copy symbol
132f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  LDSymbol& defineSymbolforCopyReloc(IRBuilder& pLinker,
133f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                                     const ResolveInfo& pSym,
134f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                                     HexagonLDBackend& pTarget);
135f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
1366f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesprivate:
137f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  virtual void scanLocalReloc(Relocation& pReloc,
138f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                              IRBuilder& pBuilder,
139f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                              Module& pModule,
140f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                              LDSection& pSection);
141f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
142f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  virtual void scanGlobalReloc(Relocation& pReloc,
143f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                               IRBuilder& pBuilder,
144f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                               Module& pModule,
145f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                               LDSection& pSection);
146f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
1476f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  HexagonLDBackend& m_Target;
1486f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  SymPLTMap m_SymPLTMap;
1496f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  SymGOTMap m_SymGOTMap;
150f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  SymGOTPLTMap m_SymGOTPLTMap;
1516f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines};
1526f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1536f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} // namespace of mcld
1546f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1556f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#endif
1566f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
157