1d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao//===-  ARMRelocator.h ----------------------------------------------------===//
25460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
35460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//                     The MCLinker Project
45460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
55460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// This file is distributed under the University of Illinois Open Source
65460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// License. See LICENSE.TXT for details.
75460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
85460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===//
95460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifndef ARM_RELOCATION_FACTORY_H
105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#define ARM_RELOCATION_FACTORY_H
115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifdef ENABLE_UNITTEST
125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <gtest.h>
135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif
145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
15d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#include <mcld/LD/Relocator.h>
165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/Target/GOT.h>
1722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Target/SymbolEntryMap.h>
185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include "ARMLDBackend.h"
195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaonamespace mcld {
215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
22d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao/** \class ARMRelocator
23d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao *  \brief ARMRelocator creates and destroys the ARM relocations.
245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *
255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */
26d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaoclass ARMRelocator : public Relocator
275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic:
29d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  typedef SymbolEntryMap<ARMGOTEntry> SymGOTMap;
30d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  typedef SymbolEntryMap<ARMPLT1> SymPLTMap;
3122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
32f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /** \enum ReservedEntryType
33f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *  \brief The reserved entry type of reserved space in ResolveInfo.
34f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *
35f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *  This is used for sacnRelocation to record what kinds of entries are
36f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *  reserved for this resolved symbol
37f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *
38f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *  In ARM, there are three kinds of entries, GOT, PLT, and dynamic reloction.
39f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *  GOT may needs a corresponding relocation to relocate itself, so we
40f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *  separate GOT to two situations: GOT and GOTRel. Besides, for the same
41f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *  symbol, there might be two kinds of entries reserved for different location.
42f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *  For example, reference to the same symbol, one may use GOT and the other may
43f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *  use dynamic relocation.
44f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *
45f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *  bit:  3       2      1     0
46f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *   | PLT | GOTRel | GOT | Rel |
47f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *
48f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *  value    Name         - Description
49f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *
50f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *  0000     None         - no reserved entry
51f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *  0001     ReserveRel   - reserve an dynamic relocation entry
52f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *  0010     ReserveGOT   - reserve an GOT entry
53f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *  0011     GOTandRel    - For different relocation, we've reserved GOT and
54f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *                          Rel for different location.
55f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *  0100     GOTRel       - reserve an GOT entry and the corresponding Dyncamic
56f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *                          relocation entry which relocate this GOT entry
57f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *  0101     GOTRelandRel - For different relocation, we've reserved GOTRel
58f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *                          and relocation entry for different location.
59f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *  1000     ReservePLT   - reserve an PLT entry and the corresponding GOT,
60f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *                          Dynamic relocation entries
61f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *  1001     PLTandRel    - For different relocation, we've reserved PLT and
62f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   *                          Rel for different location.
63f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines   */
64f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  enum ReservedEntryType {
65f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    None         = 0,
66f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    ReserveRel   = 1,
67f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    ReserveGOT   = 2,
68f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    GOTandRel    = 3,
69f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    GOTRel       = 4,
70f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    GOTRelandRel = 5,
71f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    ReservePLT   = 8,
72f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    PLTandRel    = 9
73f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  };
74f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
7522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaopublic:
76f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  ARMRelocator(ARMGNULDBackend& pParent, const LinkerConfig& pConfig);
77d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  ~ARMRelocator();
785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
7922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Result applyRelocation(Relocation& pRelocation);
805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ARMGNULDBackend& getTarget()
825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { return m_Target; }
835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  const ARMGNULDBackend& getTarget() const
855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { return m_Target; }
865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
8767e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  const char* getName(Relocation::Type pType) const;
8867e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao
896f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  Size getSize(Relocation::Type pType) const;
906f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
9122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const SymGOTMap& getSymGOTMap() const { return m_SymGOTMap; }
9222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  SymGOTMap&       getSymGOTMap()       { return m_SymGOTMap; }
9322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
9422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const SymPLTMap& getSymPLTMap() const { return m_SymPLTMap; }
9522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  SymPLTMap&       getSymPLTMap()       { return m_SymPLTMap; }
9622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
9722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const SymGOTMap& getSymGOTPLTMap() const { return m_SymGOTPLTMap; }
9822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  SymGOTMap&       getSymGOTPLTMap()       { return m_SymGOTPLTMap; }
9922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
100f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// scanRelocation - determine the empty entries are needed or not and create
101f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// the empty entries if needed.
102f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// For ARM, following entries are check to create:
103f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// - GOT entry (for .got section)
104f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// - PLT entry (for .plt section)
105f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// - dynamin relocation entries (for .rel.plt and .rel.dyn sections)
106f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  void scanRelocation(Relocation& pReloc,
107f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                      IRBuilder& pBuilder,
108f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                      Module& pModule,
109f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                      LDSection& pSection);
110f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
111f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesprivate:
112f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  void scanLocalReloc(Relocation& pReloc, const LDSection& pSection);
113f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
114f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  void scanGlobalReloc(Relocation& pReloc,
115f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                       IRBuilder& pBuilder,
116f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                       const LDSection& pSection);
117f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
118f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  void checkValidReloc(Relocation& pReloc) const;
119f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
120f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// addCopyReloc - add a copy relocation into .rel.dyn for pSym
121f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// @param pSym - A resolved copy symbol that defined in BSS section
122f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  void addCopyReloc(ResolveInfo& pSym);
123f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
124f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// defineSymbolforCopyReloc - allocate a space in BSS section and
125f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// and force define the copy of pSym to BSS section
126f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// @return the output LDSymbol of the copy symbol
127f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  LDSymbol& defineSymbolforCopyReloc(IRBuilder& pLinker,
128f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                                     const ResolveInfo& pSym);
129f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
1305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate:
1315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ARMGNULDBackend& m_Target;
13222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  SymGOTMap m_SymGOTMap;
13322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  SymPLTMap m_SymPLTMap;
13422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  SymGOTMap m_SymGOTPLTMap;
1355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao};
1365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of mcld
1385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif
140affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
141