StaticResolver.h revision 5460a1f25d9ddecb5c70667267d66d51af177a99
15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- StaticResolver.h ---------------------------------------------------===//
25460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
35460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//                     The MCLinker Project
45460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
55460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// This file is distributed under the University of Illinois Open Source
65460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// License. See LICENSE.TXT for details.
75460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
85460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===//
95460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifndef MCLD_STATIC_SYMBOL_RESOLVER_H
105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#define MCLD_STATIC_SYMBOL_RESOLVER_H
115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifdef ENABLE_UNITTEST
125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <gtest.h>
135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif
145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <string>
155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/Resolver.h>
165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/ResolveInfo.h>
175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace mcld
195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass StrSymPool;
225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/** \class StaticResolver
245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */
255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass StaticResolver : public Resolver
265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic:
285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /** \enum LinkAction
295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao   *  LinkAction follows BFD:linker.c (binary file descriptor).
305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao   *  List all actions to take in the state table
315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao   */
325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  enum LinkAction
335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  {
345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    FAIL,         /* abort.  */
355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    NOACT,        /* no action.  */
365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    UND,          /* override by symbol undefined symbol.  */
375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    WEAK,         /* override by symbol weak undefined.  */
385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    DEF,          /* override by symbol defined.  */
395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    DEFW,         /* override by symbol weak defined.  */
405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    DEFD,         /* override by symbol dynamic defined.  */
415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    DEFWD,        /* override by symbol dynamic weak defined.  */
425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    MDEFD,        /* mark symbol dynamic defined.  */
435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    MDEFWD,       /* mark symbol dynamic weak defined.  */
445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    DUND,         /* override dynamic defined symbol by undefined one.  */
455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    DUNDW,        /* oevrride dynamic defined symbol by weak undefined one.  */
465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    COM,          /* override by symbol common.  */
475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    CREF,         /* Possibly warn about common reference to defined symbol.  */
485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    CDEF,         /* redefine existing common symbol.  */
495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    BIG,          /* override by symbol common using largest size.  */
505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    MBIG,         /* mark common symbol by larger size.  */
515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    IND,          /* override by indirect symbol.  */
525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    CIND,         /* mark indirect symbol from existing common symbol.  */
535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    MDEF,         /* multiple definition error.  */
545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    MIND,         /* multiple indirect symbols.  */
555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    REFC          /* Mark indirect symbol referenced and then CYCLE.  */
565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  };
575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate:
595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // These are the values generated by the bit codes.
605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /** Encoding:
615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao   *  D -> define
625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao   *  U -> undefine
635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao   *  d -> dynamic
645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao   *  w -> weak
655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao   *  C -> common
665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao   *  I -> indirect
675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao   */
685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  enum
695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  {
705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    U    = ResolveInfo::global_flag | ResolveInfo::regular_flag | ResolveInfo::undefine_flag,
715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    w_U  = ResolveInfo::weak_flag   | ResolveInfo::regular_flag | ResolveInfo::undefine_flag,
725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    d_U  = ResolveInfo::global_flag | ResolveInfo::dynamic_flag | ResolveInfo::undefine_flag,
735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    wd_U = ResolveInfo::weak_flag   | ResolveInfo::dynamic_flag | ResolveInfo::undefine_flag,
745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    D    = ResolveInfo::global_flag | ResolveInfo::regular_flag | ResolveInfo::define_flag,
755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    w_D  = ResolveInfo::weak_flag   | ResolveInfo::regular_flag | ResolveInfo::define_flag,
765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    d_D  = ResolveInfo::global_flag | ResolveInfo::dynamic_flag | ResolveInfo::define_flag,
775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    wd_D = ResolveInfo::weak_flag   | ResolveInfo::dynamic_flag | ResolveInfo::define_flag,
785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    C    = ResolveInfo::global_flag | ResolveInfo::regular_flag | ResolveInfo::common_flag,
795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    w_C  = ResolveInfo::weak_flag   | ResolveInfo::regular_flag | ResolveInfo::common_flag,
805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    d_C  = ResolveInfo::global_flag | ResolveInfo::dynamic_flag | ResolveInfo::common_flag,
815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    wd_C = ResolveInfo::weak_flag   | ResolveInfo::dynamic_flag | ResolveInfo::common_flag,
825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    I    = ResolveInfo::global_flag | ResolveInfo::regular_flag | ResolveInfo::indirect_flag,
835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    w_I  = ResolveInfo::weak_flag   | ResolveInfo::regular_flag | ResolveInfo::indirect_flag,
845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    d_I  = ResolveInfo::global_flag | ResolveInfo::dynamic_flag | ResolveInfo::indirect_flag,
855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    wd_I = ResolveInfo::weak_flag   | ResolveInfo::dynamic_flag | ResolveInfo::indirect_flag
865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  };
875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  enum ORDINATE
895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  {
905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    U_ORD,
915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    w_U_ORD,
925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    d_U_ORD,
935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    wd_U_ORD,
945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    D_ORD,
955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    w_D_ORD,
965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    d_D_ORD,
975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    wd_D_ORD,
985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    C_ORD,
995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    w_C_ORD,
1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    Cs_ORD,
1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    Is_ORD,
1025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    LAST_ORD
1035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  };
1045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic:
1065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  StaticResolver();
1075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  StaticResolver(const StaticResolver& pCopy);
1095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  virtual ~StaticResolver();
1115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// shouldOverride - Can resolver override the symbol pOld by the symbol pNew?
1135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// @return the action should be taken.
1145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// @param pOld the symbol which may be overridden.
1155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// @param pNew the symbol which is used to replace pOld
1165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  virtual unsigned int resolve(ResolveInfo & __restrict__ pOld,
1175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                               const ResolveInfo & __restrict__ pNew,
1185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                               bool &pOverride);
1195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  StaticResolver* doClone() const {
1215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    return new StaticResolver(*this);
1225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
1235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate:
1255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  inline unsigned int getOrdinate(const ResolveInfo& pInfo) const {
1265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    if (pInfo.isAbsolute() && pInfo.isDyn())
1275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      return d_D_ORD;
1285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    if (pInfo.isAbsolute())
1295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      return D_ORD;
1305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    if (pInfo.isCommon() && pInfo.isDyn())
1315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      return Cs_ORD;
1325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    if (pInfo.isCommon() && pInfo.isDefine())
1335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      return C_ORD;
1345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    if (pInfo.isCommon() && pInfo.isWeak())
1355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      return w_C_ORD;
1365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    if (pInfo.isIndirect())
1375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      return Is_ORD;
1385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    return pInfo.info();
1395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
1405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao};
1415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of mcld
1435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif
1455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
146