74 lines
2.2 KiB
C++
74 lines
2.2 KiB
C++
//===- Resolver.h ---------------------------------------------------------===//
|
|
//
|
|
// The MCLinker Project
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
#ifndef MCLD_LD_RESOLVER_H_
|
|
#define MCLD_LD_RESOLVER_H_
|
|
#include "mcld/LD/LDSymbol.h"
|
|
|
|
#include <string>
|
|
#include <utility>
|
|
|
|
namespace mcld {
|
|
|
|
class NamePool;
|
|
class ResolveInfo;
|
|
|
|
/** \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,
|
|
LDSymbol::ValueType pValue) 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 mcld
|
|
|
|
#endif // MCLD_LD_RESOLVER_H_
|