Relocator.h revision f7ac0f19a1c8d0ad14bcf6456ce368b830fea886
1d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao//===- Relocator.h --------------------------------------------------------===//
2d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao//
3d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao//                     The MCLinker Project
4d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao//
5d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao// This file is distributed under the University of Illinois Open Source
6d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao// License. See LICENSE.TXT for details.
7d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao//
8d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao//===----------------------------------------------------------------------===//
9d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#ifndef MCLD_RELOCATOR_H
10d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#define MCLD_RELOCATOR_H
11d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#ifdef ENABLE_UNITTEST
12d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#include <gtest.h>
13d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#endif
14d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
15d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#include <mcld/Fragment/Relocation.h>
16d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
17d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaonamespace mcld
18d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao{
19d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
20d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaoclass FragmentLinker;
21d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaoclass TargetLDBackend;
22f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesclass IRBuilder;
23f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesclass Module;
24f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesclass Input;
25d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
26d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao/** \class Relocator
27d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao *  \brief Relocator provides the interface of performing relocations
28d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao */
29d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaoclass Relocator
30d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao{
31d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaopublic:
326f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef Relocation::Type    Type;
33d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  typedef Relocation::Address Address;
346f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef Relocation::DWord   DWord;
356f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef Relocation::SWord   SWord;
366f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef Relocation::Size    Size;
37d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
38d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaopublic:
39d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  enum Result {
40d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao    OK,
41d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao    BadReloc,
42d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao    Overflow,
43d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao    Unsupport,
44d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao    Unknown
45d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  };
46d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
47d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaopublic:
48f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  Relocator(const LinkerConfig& pConfig)
49f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    : m_Config(pConfig)
50f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  {}
51f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
526f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual ~Relocator() = 0;
53d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
54d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  /// apply - general apply function
55d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  virtual Result applyRelocation(Relocation& pRelocation) = 0;
56d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
57f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// scanRelocation - When read in relocations, backend can do any modification
58f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// to relocation and generate empty entries, such as GOT, dynamic relocation
59f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// entries and other target dependent entries. These entries are generated
60f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// for layout to adjust the ouput offset.
61f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// @param pReloc - a read in relocation entry
62f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// @param pInputSym - the input LDSymbol of relocation target symbol
63f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// @param pSection - the section of relocation applying target
64f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  virtual void scanRelocation(Relocation& pReloc,
65f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                              IRBuilder& pBuilder,
66f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                              Module& pModule,
67f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                              LDSection& pSection) = 0;
68f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
69f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// initializeScan - do initialization before scan relocations in pInput
70f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// @return - return true for initialization success
71f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  virtual bool initializeScan(Input& pInput)
72f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  { return true; }
73f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
74f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// finalizeScan - do finalization after scan relocations in pInput
75f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// @return - return true for finalization success
76f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  virtual bool finalizeScan(Input& pInput)
77f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  { return true; }
78f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
79f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// initializeApply - do initialization before apply relocations in pInput
80f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// @return - return true for initialization success
81f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  virtual bool initializeApply(Input& pInput)
82f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  { return true; }
83f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
84f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// finalizeApply - do finalization after apply relocations in pInput
85f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// @return - return true for finalization success
86f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  virtual bool finalizeApply(Input& pInput)
87f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  { return true; }
88f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
89f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// partialScanRelocation - When doing partial linking, backend can do any
90f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// modification to relocation to fix the relocation offset after section
91f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// merge
92f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// @param pReloc - a read in relocation entry
93f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// @param pInputSym - the input LDSymbol of relocation target symbol
94f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// @param pSection - the section of relocation applying target
95f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  virtual void partialScanRelocation(Relocation& pReloc,
96f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                                     Module& pModule,
97f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                                     const LDSection& pSection);
98f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
99d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  // ------ observers -----//
100d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  virtual TargetLDBackend& getTarget() = 0;
101d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
102d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  virtual const TargetLDBackend& getTarget() const = 0;
103d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
1046f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// getName - get the name of a relocation
105d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  virtual const char* getName(Type pType) const = 0;
106d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
1076f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// getSize - get the size of a relocation in bit
1086f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual Size getSize(Type pType) const = 0;
109f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
110f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesprotected:
111f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  const LinkerConfig& config() const { return m_Config; }
112f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
113f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesprivate:
114f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  const LinkerConfig& m_Config;
115d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao};
116d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
117d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao} // namespace of mcld
118d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
119d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#endif
120d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
121