Resolver.h revision affc150dc44fab1911775a49636d0ce85333b634
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 17namespace mcld 18{ 19 20class ResolveInfo; 21class NamePool; 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 */ 31class Resolver 32{ 33public: 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 53public: 54 virtual ~Resolver(); 55 56 /// shouldOverride - Can resolver override the symbol pOld by the symbol pNew? 57 /// @return the action should be taken. 58 /// @param pOld the symbol which may be overridden. 59 /// @param pNew the symbol which is used to replace pOld 60 virtual bool resolve(ResolveInfo & __restrict__ pOld, 61 const ResolveInfo & __restrict__ pNew, 62 bool &pOverride) const = 0; 63 64 /// resolveAgain - Can override by derived classes. 65 /// @return the pointer to resolved ResolveInfo 66 /// @return is the symbol existent? 67 virtual void resolveAgain(NamePool& pNamePool, 68 unsigned int pAction, 69 ResolveInfo& __restrict__ pOld, 70 const ResolveInfo& __restrict__ pNew, 71 Result& pResult) const { 72 pResult.info = NULL; 73 pResult.existent = false; 74 pResult.overriden = false; 75 } 76 77}; 78 79} // namespace of mcld 80 81#endif 82 83