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