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