• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_SYMBOL_RESOLVER_H
10 #define MCLD_SYMBOL_RESOLVER_H
11 #ifdef ENABLE_UNITTEST
12 #include <gtest.h>
13 #endif
14 #include <string>
15 #include <utility>
16 
17 namespace mcld
18 {
19 
20 class ResolveInfo;
21 class StrSymPool;
22 
23 /** \class Resolver
24  *  \brief Resolver binds a symbol reference from one file to a symbol
25  *   definition of another file.
26  *
27  *  Resolver seals up the algorithm of symbol resolution. The resolution of
28  *  two symbols depends on their type, binding and whether it is belonging to
29  *  a shared object.
30  */
31 class Resolver
32 {
33 public:
34   enum Action {
35     Success,
36     Warning,
37     Abort,
38     LastAction
39   };
40 
41   /** \class Resolver::Result
42    *  \brief the result of symbol resolution
43    *   - info, the pointer to overrided info
44    *   - existent, if true, the info is existent
45    *   - overriden, if true, the info is being overriden.
46    */
47   struct Result {
48     ResolveInfo* info;
49     bool existent;
50     bool overriden;
51   };
52 
53 public:
54   Resolver();
55 
56   Resolver(const Resolver& pCopy);
57 
58   virtual ~Resolver();
59 
60   /// shouldOverride - Can resolver override the symbol pOld by the symbol pNew?
61   /// @return the action should be taken.
62   /// @param pOld the symbol which may be overridden.
63   /// @param pNew the symbol which is used to replace pOld
64   virtual unsigned int resolve(ResolveInfo & __restrict__ pOld,
65                                const ResolveInfo & __restrict__ pNew,
66                                bool &pOverride) = 0;
67 
68   /// resolveAgain - Can override by derived classes.
69   /// @return the pointer to resolved ResolveInfo
70   /// @return is the symbol existent?
resolveAgain(StrSymPool & pStrSymPool,unsigned int pAction,ResolveInfo & __restrict__ pOld,const ResolveInfo & __restrict__ pNew,Result & pResult)71   virtual void resolveAgain(StrSymPool& pStrSymPool,
72                               unsigned int pAction,
73                               ResolveInfo& __restrict__ pOld,
74                               const ResolveInfo& __restrict__ pNew,
75                               Result& pResult) {
76     pResult.info = NULL;
77     pResult.existent = false;
78     pResult.overriden = false;
79   }
80 
mesg()81   const std::string& mesg() const
82   { return m_Mesg; }
83 
84   void clearMesg();
85 
clone()86   Resolver* clone() const {
87     return doClone();
88   }
89 
90 protected:
91   std::string m_Mesg;
92 
93 private:
94   virtual Resolver* doClone() const = 0;
95 };
96 
97 } // namespace of mcld
98 
99 #endif
100