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 21affc150dc44fab1911775a49636d0ce85333b634Zonr Changclass NamePool; 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, 78affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 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 virtual ~StaticResolver(); 1075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// shouldOverride - Can resolver override the symbol pOld by the symbol pNew? 109affc150dc44fab1911775a49636d0ce85333b634Zonr Chang /// @return successfully resolved, return true; otherwise, return false. 1105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// @param pOld the symbol which may be overridden. 1115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// @param pNew the symbol which is used to replace pOld 112affc150dc44fab1911775a49636d0ce85333b634Zonr Chang virtual bool resolve(ResolveInfo & __restrict__ pOld, 113affc150dc44fab1911775a49636d0ce85333b634Zonr Chang const ResolveInfo & __restrict__ pNew, 114affc150dc44fab1911775a49636d0ce85333b634Zonr Chang bool &pOverride) const; 1155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate: 1175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao inline unsigned int getOrdinate(const ResolveInfo& pInfo) const { 1185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (pInfo.isAbsolute() && pInfo.isDyn()) 1195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return d_D_ORD; 1205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (pInfo.isAbsolute()) 1215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return D_ORD; 1225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (pInfo.isCommon() && pInfo.isDyn()) 1235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return Cs_ORD; 1245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (pInfo.isCommon() && pInfo.isDefine()) 1255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return C_ORD; 1265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (pInfo.isCommon() && pInfo.isWeak()) 1275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return w_C_ORD; 1285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (pInfo.isIndirect()) 1295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return Is_ORD; 1305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return pInfo.info(); 1315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 1325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 1335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of mcld 1355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif 137affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 138