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
12d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#include <mcld/Fragment/Relocation.h>
13d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
14d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaonamespace mcld
15d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao{
16d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
17d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaoclass FragmentLinker;
18d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaoclass TargetLDBackend;
19f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesclass IRBuilder;
20f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesclass Module;
21f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesclass Input;
22d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
23d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao/** \class Relocator
24d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao *  \brief Relocator provides the interface of performing relocations
25d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao */
26d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaoclass Relocator
27d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao{
28d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaopublic:
296f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef Relocation::Type    Type;
30d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  typedef Relocation::Address Address;
316f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef Relocation::DWord   DWord;
326f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef Relocation::SWord   SWord;
336f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef Relocation::Size    Size;
34d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
35d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaopublic:
36d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  enum Result {
37d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao    OK,
38d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao    BadReloc,
39d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao    Overflow,
40d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao    Unsupport,
41d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao    Unknown
42d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  };
43d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
44d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaopublic:
45f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  Relocator(const LinkerConfig& pConfig)
46f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    : m_Config(pConfig)
47f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  {}
48f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
496f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual ~Relocator() = 0;
50d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
51d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  /// apply - general apply function
52d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  virtual Result applyRelocation(Relocation& pRelocation) = 0;
53d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
54f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// scanRelocation - When read in relocations, backend can do any modification
55f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// to relocation and generate empty entries, such as GOT, dynamic relocation
56f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// entries and other target dependent entries. These entries are generated
57f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// for layout to adjust the ouput offset.
58f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// @param pReloc - a read in relocation entry
59f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// @param pInputSym - the input LDSymbol of relocation target symbol
60f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// @param pSection - the section of relocation applying target
6187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// @param pInput - the input file of relocation
62f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  virtual void scanRelocation(Relocation& pReloc,
63f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                              IRBuilder& pBuilder,
64f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                              Module& pModule,
6587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                              LDSection& pSection,
6687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                              Input& pInput) = 0;
6787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
6887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// issueUndefRefError - Provides a basic version for undefined reference dump.
6987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// It will handle the filename and function name automatically.
7087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// @param pReloc - a read in relocation entry
7187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// @param pSection - the section of relocation applying target
7287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// @ param pInput - the input file of relocation
7387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  virtual void issueUndefRef(Relocation& pReloc,
7487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                             LDSection& pSection,
7587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                             Input& pInput);
76f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
77f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// initializeScan - do initialization before scan relocations in pInput
78f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// @return - return true for initialization success
79f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  virtual bool initializeScan(Input& pInput)
80f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  { return true; }
81f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
82f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// finalizeScan - do finalization after scan relocations in pInput
83f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// @return - return true for finalization success
84f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  virtual bool finalizeScan(Input& pInput)
85f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  { return true; }
86f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
87f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// initializeApply - do initialization before apply relocations in pInput
88f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// @return - return true for initialization success
89f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  virtual bool initializeApply(Input& pInput)
90f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  { return true; }
91f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
92f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// finalizeApply - do finalization after apply relocations in pInput
93f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// @return - return true for finalization success
94f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  virtual bool finalizeApply(Input& pInput)
95f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  { return true; }
96f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
97f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// partialScanRelocation - When doing partial linking, backend can do any
98f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// modification to relocation to fix the relocation offset after section
99f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// merge
100f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// @param pReloc - a read in relocation entry
101f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// @param pInputSym - the input LDSymbol of relocation target symbol
102f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// @param pSection - the section of relocation applying target
103f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  virtual void partialScanRelocation(Relocation& pReloc,
104f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                                     Module& pModule,
105f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                                     const LDSection& pSection);
106f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
107d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  // ------ observers -----//
108d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  virtual TargetLDBackend& getTarget() = 0;
109d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
110d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  virtual const TargetLDBackend& getTarget() const = 0;
111d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
1126f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// getName - get the name of a relocation
113d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  virtual const char* getName(Type pType) const = 0;
114d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
1156f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// getSize - get the size of a relocation in bit
1166f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual Size getSize(Type pType) const = 0;
117f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
118a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines  /// mayHaveFunctionPointerAccess - check if the given reloc would possibly
119a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines  /// access a function pointer.
120a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines  /// Note: Each target relocator should override this function, or be
121a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines  /// conservative and return true to avoid getting folded.
122a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines  virtual bool mayHaveFunctionPointerAccess(const Relocation& pReloc) const
123a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines  { return true; }
124a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines
125f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesprotected:
126f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  const LinkerConfig& config() const { return m_Config; }
127f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
128f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesprivate:
129f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  const LinkerConfig& m_Config;
130d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao};
131d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
132d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao} // namespace of mcld
133d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
134d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#endif
135d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
136