1 //===- Relocation.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_LD_RELOCATION_FACTORY_H 10 #define MCLD_LD_RELOCATION_FACTORY_H 11 #ifdef ENABLE_UNITTEST 12 #include <gtest.h> 13 #endif 14 #include <mcld/Support/GCFactory.h> 15 #include <mcld/LD/Relocation.h> 16 17 namespace mcld 18 { 19 20 class LDSymbol; 21 class ResolveInfo; 22 class FragmentRef; 23 class Layout; 24 class GOT; 25 class TargetLDBackend; 26 class MCLDInfo; 27 28 /** \class RelocationFactory 29 * \brief RelocationFactory provides the interface for generating target 30 * relocation 31 * 32 */ 33 class RelocationFactory : public GCFactory<Relocation, 0> 34 { 35 public: 36 typedef Relocation::Type Type; 37 typedef Relocation::Address Address; 38 typedef Relocation::DWord DWord; 39 40 enum Result { 41 OK, 42 BadReloc, 43 Overflow, 44 Unsupport, 45 Unknown 46 }; 47 48 public: 49 explicit RelocationFactory(size_t pNum); 50 51 virtual ~RelocationFactory(); 52 53 /// apply - general apply function 54 virtual Result applyRelocation(Relocation& pRelocation, 55 const MCLDInfo& pLDInfo) = 0; 56 57 // ----- production ----- // 58 /// produce - produce a relocation entry 59 /// @param pType - the type of the relocation entry 60 /// @param pFragRef - the place to apply the relocation 61 /// @param pAddend - the addend of the relocation entry 62 Relocation* produce(Type pType, 63 FragmentRef& pFragRef, 64 Address pAddend = 0); 65 66 /// produceEmptyEntry - produce an empty relocation which 67 /// occupied memory space but all contents set to zero. 68 Relocation* produceEmptyEntry(); 69 70 void destroy(Relocation* pRelocation); 71 72 void setLayout(const Layout& pLayout); 73 74 // ------ observers -----// 75 const Layout& getLayout() const; 76 77 virtual TargetLDBackend& getTarget() = 0; 78 79 virtual const TargetLDBackend& getTarget() const = 0; 80 81 virtual const char* getName(Type pType) const = 0; 82 83 private: 84 const Layout* m_pLayout; 85 86 }; 87 88 } // namespace of mcld 89 90 #endif 91 92