StaticResolver.h revision 87f34658dec9097d987d254a990ea7f311bfc95f
1//===- StaticResolver.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_STATICRESOLVER_H
10#define MCLD_LD_STATICRESOLVER_H
11#ifdef ENABLE_UNITTEST
12#include <gtest.h>
13#endif
14#include <string>
15#include <mcld/LD/Resolver.h>
16#include <mcld/LD/ResolveInfo.h>
17
18namespace mcld
19{
20
21class NamePool;
22
23/** \class StaticResolver
24 */
25class StaticResolver : public Resolver
26{
27public:
28  /** \enum LinkAction
29   *  LinkAction follows BFD:linker.c (binary file descriptor).
30   *  List all actions to take in the state table
31   */
32  enum LinkAction
33  {
34    FAIL,         /* abort.  */
35    NOACT,        /* no action.  */
36    UND,          /* override by symbol undefined symbol.  */
37    WEAK,         /* override by symbol weak undefined.  */
38    DEF,          /* override by symbol defined.  */
39    DEFW,         /* override by symbol weak defined.  */
40    DEFD,         /* override by symbol dynamic defined.  */
41    DEFWD,        /* override by symbol dynamic weak defined.  */
42    MDEFD,        /* mark symbol dynamic defined.  */
43    MDEFWD,       /* mark symbol dynamic weak defined.  */
44    DUND,         /* override dynamic defined symbol by undefined one.  */
45    DUNDW,        /* oevrride dynamic defined symbol by weak undefined one.  */
46    COM,          /* override by symbol common.  */
47    CREF,         /* Possibly warn about common reference to defined symbol.  */
48    CDEF,         /* redefine existing common symbol.  */
49    BIG,          /* override by symbol common using largest size.  */
50    MBIG,         /* mark common symbol by larger size.  */
51    IND,          /* override by indirect symbol.  */
52    CIND,         /* mark indirect symbol from existing common symbol.  */
53    MDEF,         /* multiple definition error.  */
54    MIND,         /* multiple indirect symbols.  */
55    REFC          /* Mark indirect symbol referenced and then CYCLE.  */
56  };
57
58private:
59  // These are the values generated by the bit codes.
60  /** Encoding:
61   *  D -> define
62   *  U -> undefine
63   *  d -> dynamic
64   *  w -> weak
65   *  C -> common
66   *  I -> indirect
67   */
68  enum
69  {
70    U    = ResolveInfo::global_flag | ResolveInfo::regular_flag | ResolveInfo::undefine_flag,
71    w_U  = ResolveInfo::weak_flag   | ResolveInfo::regular_flag | ResolveInfo::undefine_flag,
72    d_U  = ResolveInfo::global_flag | ResolveInfo::dynamic_flag | ResolveInfo::undefine_flag,
73    wd_U = ResolveInfo::weak_flag   | ResolveInfo::dynamic_flag | ResolveInfo::undefine_flag,
74    D    = ResolveInfo::global_flag | ResolveInfo::regular_flag | ResolveInfo::define_flag,
75    w_D  = ResolveInfo::weak_flag   | ResolveInfo::regular_flag | ResolveInfo::define_flag,
76    d_D  = ResolveInfo::global_flag | ResolveInfo::dynamic_flag | ResolveInfo::define_flag,
77    wd_D = ResolveInfo::weak_flag   | ResolveInfo::dynamic_flag | ResolveInfo::define_flag,
78    C    = ResolveInfo::global_flag | ResolveInfo::regular_flag | ResolveInfo::common_flag,
79    w_C  = ResolveInfo::weak_flag   | ResolveInfo::regular_flag | ResolveInfo::common_flag,
80    d_C  = ResolveInfo::global_flag | ResolveInfo::dynamic_flag | ResolveInfo::common_flag,
81    wd_C = ResolveInfo::weak_flag   | ResolveInfo::dynamic_flag | ResolveInfo::common_flag,
82    I    = ResolveInfo::global_flag | ResolveInfo::regular_flag | ResolveInfo::indirect_flag,
83    w_I  = ResolveInfo::weak_flag   | ResolveInfo::regular_flag | ResolveInfo::indirect_flag,
84    d_I  = ResolveInfo::global_flag | ResolveInfo::dynamic_flag | ResolveInfo::indirect_flag,
85    wd_I = ResolveInfo::weak_flag   | ResolveInfo::dynamic_flag | ResolveInfo::indirect_flag
86  };
87
88  enum ORDINATE
89  {
90    U_ORD,
91    w_U_ORD,
92    d_U_ORD,
93    wd_U_ORD,
94    D_ORD,
95    w_D_ORD,
96    d_D_ORD,
97    wd_D_ORD,
98    C_ORD,
99    w_C_ORD,
100    Cs_ORD,
101    Is_ORD,
102    LAST_ORD
103  };
104
105public:
106  virtual ~StaticResolver();
107
108  /// shouldOverride - Can resolver override the symbol pOld by the symbol pNew?
109  /// @return successfully resolved, return true; otherwise, return false.
110  /// @param pOld the symbol which may be overridden.
111  /// @param pNew the symbol which is used to replace pOld
112  virtual bool resolve(ResolveInfo & __restrict__ pOld,
113                       const ResolveInfo & __restrict__ pNew,
114                       bool &pOverride, LDSymbol::ValueType pValue) const;
115
116private:
117  inline unsigned int getOrdinate(const ResolveInfo& pInfo) const {
118    if (pInfo.isAbsolute() && pInfo.isDyn())
119      return d_D_ORD;
120    if (pInfo.isAbsolute())
121      return D_ORD;
122    if (pInfo.isCommon() && pInfo.isDyn())
123      return Cs_ORD;
124    if (pInfo.isCommon() && pInfo.isDefine())
125      return C_ORD;
126    if (pInfo.isCommon() && pInfo.isWeak())
127      return w_C_ORD;
128    if (pInfo.isIndirect())
129      return Is_ORD;
130    return pInfo.info();
131  }
132};
133
134} // namespace of mcld
135
136#endif
137
138