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 <string>
12 #include <utility>
13 #include <mcld/LD/LDSymbol.h>
14 
15 namespace mcld
16 {
17 
18 class ResolveInfo;
19 class NamePool;
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 {
31 public:
32   enum Action {
33     Success,
34     Warning,
35     Abort,
36     LastAction
37   };
38 
39   /** \class Resolver::Result
40    *  \brief the result of symbol resolution
41    *   - info, the pointer to overrided info
42    *   - existent, if true, the info is existent
43    *   - overriden, if true, the info is being overriden.
44    */
45   struct Result {
46     ResolveInfo* info;
47     bool existent;
48     bool overriden;
49   };
50 
51 public:
52   virtual ~Resolver();
53 
54   /// shouldOverride - Can resolver override the symbol pOld by the symbol pNew?
55   /// @return the action should be taken.
56   /// @param pOld the symbol which may be overridden.
57   /// @param pNew the symbol which is used to replace pOld
58   virtual bool resolve(ResolveInfo & __restrict__ pOld,
59                        const ResolveInfo & __restrict__ pNew,
60                        bool &pOverride, LDSymbol::ValueType pValue) const = 0;
61 
62   /// resolveAgain - Can override by derived classes.
63   /// @return the pointer to resolved ResolveInfo
64   /// @return is the symbol existent?
resolveAgain(NamePool & pNamePool,unsigned int pAction,ResolveInfo & __restrict__ pOld,const ResolveInfo & __restrict__ pNew,Result & pResult)65   virtual void resolveAgain(NamePool& pNamePool,
66                               unsigned int pAction,
67                               ResolveInfo& __restrict__ pOld,
68                               const ResolveInfo& __restrict__ pNew,
69                               Result& pResult) const {
70     pResult.info = NULL;
71     pResult.existent = false;
72     pResult.overriden = false;
73   }
74 
75 };
76 
77 } // namespace of mcld
78 
79 #endif
80 
81