1 //===- Resolver.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_SYMBOL_RESOLVER_H 10 #define MCLD_SYMBOL_RESOLVER_H 11 #ifdef ENABLE_UNITTEST 12 #include <gtest.h> 13 #endif 14 #include <string> 15 #include <utility> 16 17 namespace mcld 18 { 19 20 class ResolveInfo; 21 class StrSymPool; 22 23 /** \class Resolver 24 * \brief Resolver binds a symbol reference from one file to a symbol 25 * definition of another file. 26 * 27 * Resolver seals up the algorithm of symbol resolution. The resolution of 28 * two symbols depends on their type, binding and whether it is belonging to 29 * a shared object. 30 */ 31 class Resolver 32 { 33 public: 34 enum Action { 35 Success, 36 Warning, 37 Abort, 38 LastAction 39 }; 40 41 /** \class Resolver::Result 42 * \brief the result of symbol resolution 43 * - info, the pointer to overrided info 44 * - existent, if true, the info is existent 45 * - overriden, if true, the info is being overriden. 46 */ 47 struct Result { 48 ResolveInfo* info; 49 bool existent; 50 bool overriden; 51 }; 52 53 public: 54 Resolver(); 55 56 Resolver(const Resolver& pCopy); 57 58 virtual ~Resolver(); 59 60 /// shouldOverride - Can resolver override the symbol pOld by the symbol pNew? 61 /// @return the action should be taken. 62 /// @param pOld the symbol which may be overridden. 63 /// @param pNew the symbol which is used to replace pOld 64 virtual unsigned int resolve(ResolveInfo & __restrict__ pOld, 65 const ResolveInfo & __restrict__ pNew, 66 bool &pOverride) = 0; 67 68 /// resolveAgain - Can override by derived classes. 69 /// @return the pointer to resolved ResolveInfo 70 /// @return is the symbol existent? resolveAgain(StrSymPool & pStrSymPool,unsigned int pAction,ResolveInfo & __restrict__ pOld,const ResolveInfo & __restrict__ pNew,Result & pResult)71 virtual void resolveAgain(StrSymPool& pStrSymPool, 72 unsigned int pAction, 73 ResolveInfo& __restrict__ pOld, 74 const ResolveInfo& __restrict__ pNew, 75 Result& pResult) { 76 pResult.info = NULL; 77 pResult.existent = false; 78 pResult.overriden = false; 79 } 80 mesg()81 const std::string& mesg() const 82 { return m_Mesg; } 83 84 void clearMesg(); 85 clone()86 Resolver* clone() const { 87 return doClone(); 88 } 89 90 protected: 91 std::string m_Mesg; 92 93 private: 94 virtual Resolver* doClone() const = 0; 95 }; 96 97 } // namespace of mcld 98 99 #endif 100