15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- Resolver.h ---------------------------------------------------------===// 25460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 35460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// The MCLinker Project 45460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 55460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// This file is distributed under the University of Illinois Open Source 65460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// License. See LICENSE.TXT for details. 75460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 85460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===// 937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#ifndef MCLD_LD_RESOLVER_H_ 1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#define MCLD_LD_RESOLVER_H_ 1137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/LDSymbol.h" 1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines 135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <string> 145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <utility> 155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1637b74a387bb3993387029859c2d9d051c41c724eStephen Hinesnamespace mcld { 175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 18affc150dc44fab1911775a49636d0ce85333b634Zonr Changclass NamePool; 1937b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass ResolveInfo; 205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/** \class Resolver 225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * \brief Resolver binds a symbol reference from one file to a symbol 235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * definition of another file. 245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * 255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * Resolver seals up the algorithm of symbol resolution. The resolution of 265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * two symbols depends on their type, binding and whether it is belonging to 275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * a shared object. 285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */ 2937b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass Resolver { 3037b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 3137b74a387bb3993387029859c2d9d051c41c724eStephen Hines enum Action { Success, Warning, Abort, LastAction }; 325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /** \class Resolver::Result 345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * \brief the result of symbol resolution 355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * - info, the pointer to overrided info 365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * - existent, if true, the info is existent 375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * - overriden, if true, the info is being overriden. 385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */ 395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao struct Result { 405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ResolveInfo* info; 415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool existent; 425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool overriden; 435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao }; 445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 4537b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao virtual ~Resolver(); 475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// shouldOverride - Can resolver override the symbol pOld by the symbol pNew? 495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// @return the action should be taken. 505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// @param pOld the symbol which may be overridden. 515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// @param pNew the symbol which is used to replace pOld 5237b74a387bb3993387029859c2d9d051c41c724eStephen Hines virtual bool resolve(ResolveInfo& __restrict__ pOld, 5337b74a387bb3993387029859c2d9d051c41c724eStephen Hines const ResolveInfo& __restrict__ pNew, 5437b74a387bb3993387029859c2d9d051c41c724eStephen Hines bool& pOverride, 5537b74a387bb3993387029859c2d9d051c41c724eStephen Hines LDSymbol::ValueType pValue) const = 0; 565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// resolveAgain - Can override by derived classes. 585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// @return the pointer to resolved ResolveInfo 595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// @return is the symbol existent? 60affc150dc44fab1911775a49636d0ce85333b634Zonr Chang virtual void resolveAgain(NamePool& pNamePool, 6137b74a387bb3993387029859c2d9d051c41c724eStephen Hines unsigned int pAction, 6237b74a387bb3993387029859c2d9d051c41c724eStephen Hines ResolveInfo& __restrict__ pOld, 6337b74a387bb3993387029859c2d9d051c41c724eStephen Hines const ResolveInfo& __restrict__ pNew, 6437b74a387bb3993387029859c2d9d051c41c724eStephen Hines Result& pResult) const { 655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao pResult.info = NULL; 665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao pResult.existent = false; 675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao pResult.overriden = false; 685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 7137b74a387bb3993387029859c2d9d051c41c724eStephen Hines} // namespace mcld 72affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 7337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#endif // MCLD_LD_RESOLVER_H_ 74