1d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao//===- MipsRelocator.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 MIPS_RELOCATION_FACTORY_H
105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#define MIPS_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/Support/GCFactory.h>
175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include "MipsLDBackend.h"
185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaonamespace mcld {
205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
21d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao/** \class MipsRelocator
22d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao *  \brief MipsRelocator creates and destroys the Mips relocations.
235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */
24d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaoclass MipsRelocator : public Relocator
255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic:
27f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  enum ReservedEntryType {
28f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    None          = 0,  // no reserved entry
29f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    ReserveRel    = 1,  // reserve a dynamic relocation entry
30f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    ReserveGot    = 2,  // reserve a GOT entry
31f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    ReserveGpDisp = 8   // reserve _gp_disp symbol
32f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  };
3322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
3422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaopublic:
35f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  MipsRelocator(MipsGNULDBackend& pParent, const LinkerConfig& pConfig);
36f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
37f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// scanRelocation - determine the empty entries are needed or not and
38f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// create the empty entries if needed.
39f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// For Mips, the GOT, GP, and dynamic relocation entries are check to create.
40f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  void scanRelocation(Relocation& pReloc,
41f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                      IRBuilder& pBuilder,
42f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                      Module& pModule,
43f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                      LDSection& pSection);
44f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
45f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// initializeScan - do initialization before scan relocations in pInput
46f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// @return - return true for initialization success
47f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  bool initializeScan(Input& pInput);
48f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
49f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// finalizeScan - do finalization after scan relocations in pInput
50f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// @return - return true for finalization success
51f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  bool finalizeScan(Input& pInput);
52f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
53f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// initializeApply - do initialization before apply relocations in pInput
54f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// @return - return true for initialization success
55f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  bool initializeApply(Input& pInput);
56f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
57f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// finalizeApply - do finalization after apply relocations in pInput
58f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// @return - return true for finalization success
59f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  bool finalizeApply(Input& pInput);
605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
6122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Result applyRelocation(Relocation& pRelocation);
625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
63f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  const Input& getApplyingInput() const
64f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  { return *m_pApplyingInput; }
65f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  MipsGNULDBackend& getTarget()
675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { return m_Target; }
685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  const MipsGNULDBackend& getTarget() const
705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { return m_Target; }
715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // Get last calculated AHL.
735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  int32_t getAHL() const
745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { return m_AHL; }
755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // Set last calculated AHL.
775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  void setAHL(int32_t pAHL)
785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { m_AHL = pAHL; }
795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
8067e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  const char* getName(Relocation::Type pType) const;
8167e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao
826f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  Size getSize(Relocation::Type pType) const;
836f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
84f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesprivate:
85f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  void scanLocalReloc(Relocation& pReloc,
86f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                      IRBuilder& pBuilder,
87f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                      const LDSection& pSection);
88f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
89f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  void scanGlobalReloc(Relocation& pReloc,
90f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                       IRBuilder& pBuilder,
91f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                       const LDSection& pSection);
9222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate:
945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  MipsGNULDBackend& m_Target;
95f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  Input* m_pApplyingInput;
965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  int32_t m_AHL;
975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao};
985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of mcld
1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif
102