//===- Resolver.h ---------------------------------------------------------===// // // The MCLinker Project // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef MCLD_SYMBOL_RESOLVER_H #define MCLD_SYMBOL_RESOLVER_H #ifdef ENABLE_UNITTEST #include <gtest.h> #endif #include <string> #include <utility> namespace mcld { class ResolveInfo; class NamePool; /** \class Resolver * \brief Resolver binds a symbol reference from one file to a symbol * definition of another file. * * Resolver seals up the algorithm of symbol resolution. The resolution of * two symbols depends on their type, binding and whether it is belonging to * a shared object. */ class Resolver { public: enum Action { Success, Warning, Abort, LastAction }; /** \class Resolver::Result * \brief the result of symbol resolution * - info, the pointer to overrided info * - existent, if true, the info is existent * - overriden, if true, the info is being overriden. */ struct Result { ResolveInfo* info; bool existent; bool overriden; }; public: virtual ~Resolver(); /// shouldOverride - Can resolver override the symbol pOld by the symbol pNew? /// @return the action should be taken. /// @param pOld the symbol which may be overridden. /// @param pNew the symbol which is used to replace pOld virtual bool resolve(ResolveInfo & __restrict__ pOld, const ResolveInfo & __restrict__ pNew, bool &pOverride) const = 0; /// resolveAgain - Can override by derived classes. /// @return the pointer to resolved ResolveInfo /// @return is the symbol existent? virtual void resolveAgain(NamePool& pNamePool, unsigned int pAction, ResolveInfo& __restrict__ pOld, const ResolveInfo& __restrict__ pNew, Result& pResult) const { pResult.info = NULL; pResult.existent = false; pResult.overriden = false; } }; } // namespace of mcld #endif