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_LD_RESOLVER_H_
10 #define MCLD_LD_RESOLVER_H_
11 #include "mcld/LD/LDSymbol.h"
12 
13 #include <string>
14 #include <utility>
15 
16 namespace mcld {
17 
18 class NamePool;
19 class ResolveInfo;
20 
21 /** \class Resolver
22  *  \brief Resolver binds a symbol reference from one file to a symbol
23  *   definition of another file.
24  *
25  *  Resolver seals up the algorithm of symbol resolution. The resolution of
26  *  two symbols depends on their type, binding and whether it is belonging to
27  *  a shared object.
28  */
29 class Resolver {
30  public:
31   enum Action { Success, Warning, Abort, LastAction };
32 
33   /** \class Resolver::Result
34    *  \brief the result of symbol resolution
35    *   - info, the pointer to overrided info
36    *   - existent, if true, the info is existent
37    *   - overriden, if true, the info is being overriden.
38    */
39   struct Result {
40     ResolveInfo* info;
41     bool existent;
42     bool overriden;
43   };
44 
45  public:
46   virtual ~Resolver();
47 
48   /// shouldOverride - Can resolver override the symbol pOld by the symbol pNew?
49   /// @return the action should be taken.
50   /// @param pOld the symbol which may be overridden.
51   /// @param pNew the symbol which is used to replace pOld
52   virtual bool resolve(ResolveInfo& __restrict__ pOld,
53                        const ResolveInfo& __restrict__ pNew,
54                        bool& pOverride,
55                        LDSymbol::ValueType pValue) const = 0;
56 
57   /// resolveAgain - Can override by derived classes.
58   /// @return the pointer to resolved ResolveInfo
59   /// @return is the symbol existent?
resolveAgain(NamePool & pNamePool,unsigned int pAction,ResolveInfo & __restrict__ pOld,const ResolveInfo & __restrict__ pNew,Result & pResult)60   virtual void resolveAgain(NamePool& pNamePool,
61                             unsigned int pAction,
62                             ResolveInfo& __restrict__ pOld,
63                             const ResolveInfo& __restrict__ pNew,
64                             Result& pResult) const {
65     pResult.info = NULL;
66     pResult.existent = false;
67     pResult.overriden = false;
68   }
69 };
70 
71 }  // namespace mcld
72 
73 #endif  // MCLD_LD_RESOLVER_H_
74