StaticResolver.h revision 5460a1f25d9ddecb5c70667267d66d51af177a99
1e4db79de127cfe961195f52907af8451026eaa20Chris Craik//===- StaticResolver.h ---------------------------------------------------===//
2e4db79de127cfe961195f52907af8451026eaa20Chris Craik//
3e4db79de127cfe961195f52907af8451026eaa20Chris Craik//                     The MCLinker Project
4e4db79de127cfe961195f52907af8451026eaa20Chris Craik//
5e4db79de127cfe961195f52907af8451026eaa20Chris Craik// This file is distributed under the University of Illinois Open Source
6e4db79de127cfe961195f52907af8451026eaa20Chris Craik// License. See LICENSE.TXT for details.
7e4db79de127cfe961195f52907af8451026eaa20Chris Craik//
8e4db79de127cfe961195f52907af8451026eaa20Chris Craik//===----------------------------------------------------------------------===//
9e4db79de127cfe961195f52907af8451026eaa20Chris Craik#ifndef MCLD_STATIC_SYMBOL_RESOLVER_H
10e4db79de127cfe961195f52907af8451026eaa20Chris Craik#define MCLD_STATIC_SYMBOL_RESOLVER_H
11e4db79de127cfe961195f52907af8451026eaa20Chris Craik#ifdef ENABLE_UNITTEST
12e4db79de127cfe961195f52907af8451026eaa20Chris Craik#include <gtest.h>
13e4db79de127cfe961195f52907af8451026eaa20Chris Craik#endif
14e4db79de127cfe961195f52907af8451026eaa20Chris Craik#include <string>
15e4db79de127cfe961195f52907af8451026eaa20Chris Craik#include <mcld/LD/Resolver.h>
16e4db79de127cfe961195f52907af8451026eaa20Chris Craik#include <mcld/LD/ResolveInfo.h>
17e4db79de127cfe961195f52907af8451026eaa20Chris Craik
18e4db79de127cfe961195f52907af8451026eaa20Chris Craiknamespace mcld
19e4db79de127cfe961195f52907af8451026eaa20Chris Craik{
20e4db79de127cfe961195f52907af8451026eaa20Chris Craik
21e4db79de127cfe961195f52907af8451026eaa20Chris Craikclass StrSymPool;
22e4db79de127cfe961195f52907af8451026eaa20Chris Craik
23e4db79de127cfe961195f52907af8451026eaa20Chris Craik/** \class StaticResolver
24e4db79de127cfe961195f52907af8451026eaa20Chris Craik */
25e4db79de127cfe961195f52907af8451026eaa20Chris Craikclass StaticResolver : public Resolver
26e4db79de127cfe961195f52907af8451026eaa20Chris Craik{
27e4db79de127cfe961195f52907af8451026eaa20Chris Craikpublic:
28e4db79de127cfe961195f52907af8451026eaa20Chris Craik  /** \enum LinkAction
29e4db79de127cfe961195f52907af8451026eaa20Chris Craik   *  LinkAction follows BFD:linker.c (binary file descriptor).
30e4db79de127cfe961195f52907af8451026eaa20Chris Craik   *  List all actions to take in the state table
31e4db79de127cfe961195f52907af8451026eaa20Chris Craik   */
32e4db79de127cfe961195f52907af8451026eaa20Chris Craik  enum LinkAction
33e4db79de127cfe961195f52907af8451026eaa20Chris Craik  {
34e4db79de127cfe961195f52907af8451026eaa20Chris Craik    FAIL,         /* abort.  */
35eecff56fed5dd5206acfbc5007b4912081b36d3bFlorin Malita    NOACT,        /* no action.  */
36e4db79de127cfe961195f52907af8451026eaa20Chris Craik    UND,          /* override by symbol undefined symbol.  */
37e4db79de127cfe961195f52907af8451026eaa20Chris Craik    WEAK,         /* override by symbol weak undefined.  */
38e4db79de127cfe961195f52907af8451026eaa20Chris Craik    DEF,          /* override by symbol defined.  */
39e4db79de127cfe961195f52907af8451026eaa20Chris Craik    DEFW,         /* override by symbol weak defined.  */
40e4db79de127cfe961195f52907af8451026eaa20Chris Craik    DEFD,         /* override by symbol dynamic defined.  */
41e4db79de127cfe961195f52907af8451026eaa20Chris Craik    DEFWD,        /* override by symbol dynamic weak defined.  */
42e4db79de127cfe961195f52907af8451026eaa20Chris Craik    MDEFD,        /* mark symbol dynamic defined.  */
43e4db79de127cfe961195f52907af8451026eaa20Chris Craik    MDEFWD,       /* mark symbol dynamic weak defined.  */
44e4db79de127cfe961195f52907af8451026eaa20Chris Craik    DUND,         /* override dynamic defined symbol by undefined one.  */
45e4db79de127cfe961195f52907af8451026eaa20Chris Craik    DUNDW,        /* oevrride dynamic defined symbol by weak undefined one.  */
46eecff56fed5dd5206acfbc5007b4912081b36d3bFlorin Malita    COM,          /* override by symbol common.  */
47e4db79de127cfe961195f52907af8451026eaa20Chris Craik    CREF,         /* Possibly warn about common reference to defined symbol.  */
48e4db79de127cfe961195f52907af8451026eaa20Chris Craik    CDEF,         /* redefine existing common symbol.  */
49e4db79de127cfe961195f52907af8451026eaa20Chris Craik    BIG,          /* override by symbol common using largest size.  */
50e4db79de127cfe961195f52907af8451026eaa20Chris Craik    MBIG,         /* mark common symbol by larger size.  */
51e4db79de127cfe961195f52907af8451026eaa20Chris Craik    IND,          /* override by indirect symbol.  */
52e4db79de127cfe961195f52907af8451026eaa20Chris Craik    CIND,         /* mark indirect symbol from existing common symbol.  */
53e4db79de127cfe961195f52907af8451026eaa20Chris Craik    MDEF,         /* multiple definition error.  */
54e5b50197e870aa6d22c3893f5d25f4279f06e5c3Chris Craik    MIND,         /* multiple indirect symbols.  */
55e5b50197e870aa6d22c3893f5d25f4279f06e5c3Chris Craik    REFC          /* Mark indirect symbol referenced and then CYCLE.  */
56e5b50197e870aa6d22c3893f5d25f4279f06e5c3Chris Craik  };
57e5b50197e870aa6d22c3893f5d25f4279f06e5c3Chris Craik
58e4db79de127cfe961195f52907af8451026eaa20Chris Craikprivate:
59e4db79de127cfe961195f52907af8451026eaa20Chris Craik  // These are the values generated by the bit codes.
60e4db79de127cfe961195f52907af8451026eaa20Chris Craik  /** Encoding:
61e4db79de127cfe961195f52907af8451026eaa20Chris Craik   *  D -> define
62e4db79de127cfe961195f52907af8451026eaa20Chris Craik   *  U -> undefine
63e4db79de127cfe961195f52907af8451026eaa20Chris Craik   *  d -> dynamic
64e4db79de127cfe961195f52907af8451026eaa20Chris Craik   *  w -> weak
65e4db79de127cfe961195f52907af8451026eaa20Chris Craik   *  C -> common
66e4db79de127cfe961195f52907af8451026eaa20Chris Craik   *  I -> indirect
67e4db79de127cfe961195f52907af8451026eaa20Chris Craik   */
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  StaticResolver();
107
108  StaticResolver(const StaticResolver& pCopy);
109
110  virtual ~StaticResolver();
111
112  /// shouldOverride - Can resolver override the symbol pOld by the symbol pNew?
113  /// @return the action should be taken.
114  /// @param pOld the symbol which may be overridden.
115  /// @param pNew the symbol which is used to replace pOld
116  virtual unsigned int resolve(ResolveInfo & __restrict__ pOld,
117                               const ResolveInfo & __restrict__ pNew,
118                               bool &pOverride);
119
120  StaticResolver* doClone() const {
121    return new StaticResolver(*this);
122  }
123
124private:
125  inline unsigned int getOrdinate(const ResolveInfo& pInfo) const {
126    if (pInfo.isAbsolute() && pInfo.isDyn())
127      return d_D_ORD;
128    if (pInfo.isAbsolute())
129      return D_ORD;
130    if (pInfo.isCommon() && pInfo.isDyn())
131      return Cs_ORD;
132    if (pInfo.isCommon() && pInfo.isDefine())
133      return C_ORD;
134    if (pInfo.isCommon() && pInfo.isWeak())
135      return w_C_ORD;
136    if (pInfo.isIndirect())
137      return Is_ORD;
138    return pInfo.info();
139  }
140};
141
142} // namespace of mcld
143
144#endif
145
146