blob: 35ff7e7d0ab36463c6c230932ff5113917ad17a0 [file] [log] [blame]
//===- StaticResolver.h ---------------------------------------------------===//
//
// The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef MCLD_LD_STATICRESOLVER_H_
#define MCLD_LD_STATICRESOLVER_H_
#include "mcld/LD/ResolveInfo.h"
#include "mcld/LD/Resolver.h"
#include <string>
namespace mcld {
class NamePool;
/** \class StaticResolver
*/
class StaticResolver : public Resolver {
public:
/** \enum LinkAction
* LinkAction follows BFD:linker.c (binary file descriptor).
* List all actions to take in the state table
*/
enum LinkAction {
FAIL, // abort.
NOACT, // no action.
UND, // override by symbol undefined symbol.
WEAK, // override by symbol weak undefined.
DEF, // override by symbol defined.
DEFW, // override by symbol weak defined.
DEFD, // override by symbol dynamic defined.
DEFWD, // override by symbol dynamic weak defined.
MDEFD, // mark symbol dynamic defined.
MDEFWD, // mark symbol dynamic weak defined.
DUND, // override dynamic defined symbol by undefined one.
DUNDW, // oevrride dynamic defined symbol by weak undefined one.
COM, // override by symbol common.
CREF, // Possibly warn about common reference to defined symbol.
CDEF, // redefine existing common symbol.
BIG, // override by symbol common using largest size.
MBIG, // mark common symbol by larger size.
IND, // override by indirect symbol.
CIND, // mark indirect symbol from existing common symbol.
MDEF, // multiple definition error.
MIND, // multiple indirect symbols.
REFC // Mark indirect symbol referenced and then CYCLE.
};
private:
// These are the values generated by the bit codes.
/** Encoding:
* D -> define
* U -> undefine
* d -> dynamic
* w -> weak
* C -> common
* I -> indirect
*/
enum {
U = ResolveInfo::global_flag | ResolveInfo::regular_flag | ResolveInfo::undefine_flag, // NOLINT
w_U = ResolveInfo::weak_flag | ResolveInfo::regular_flag | ResolveInfo::undefine_flag, // NOLINT
d_U = ResolveInfo::global_flag | ResolveInfo::dynamic_flag | ResolveInfo::undefine_flag, // NOLINT
wd_U = ResolveInfo::weak_flag | ResolveInfo::dynamic_flag | ResolveInfo::undefine_flag, // NOLINT
D = ResolveInfo::global_flag | ResolveInfo::regular_flag | ResolveInfo::define_flag, // NOLINT
w_D = ResolveInfo::weak_flag | ResolveInfo::regular_flag | ResolveInfo::define_flag, // NOLINT
d_D = ResolveInfo::global_flag | ResolveInfo::dynamic_flag | ResolveInfo::define_flag, // NOLINT
wd_D = ResolveInfo::weak_flag | ResolveInfo::dynamic_flag | ResolveInfo::define_flag, // NOLINT
C = ResolveInfo::global_flag | ResolveInfo::regular_flag | ResolveInfo::common_flag, // NOLINT
w_C = ResolveInfo::weak_flag | ResolveInfo::regular_flag | ResolveInfo::common_flag, // NOLINT
d_C = ResolveInfo::global_flag | ResolveInfo::dynamic_flag | ResolveInfo::common_flag, // NOLINT
wd_C = ResolveInfo::weak_flag | ResolveInfo::dynamic_flag | ResolveInfo::common_flag, // NOLINT
I = ResolveInfo::global_flag | ResolveInfo::regular_flag | ResolveInfo::indirect_flag, // NOLINT
w_I = ResolveInfo::weak_flag | ResolveInfo::regular_flag | ResolveInfo::indirect_flag, // NOLINT
d_I = ResolveInfo::global_flag | ResolveInfo::dynamic_flag | ResolveInfo::indirect_flag, // NOLINT
wd_I = ResolveInfo::weak_flag | ResolveInfo::dynamic_flag | ResolveInfo::indirect_flag // NOLINT
};
enum ORDINATE {
U_ORD,
w_U_ORD,
d_U_ORD,
wd_U_ORD,
D_ORD,
w_D_ORD,
d_D_ORD,
wd_D_ORD,
C_ORD,
w_C_ORD,
Cs_ORD,
Is_ORD,
LAST_ORD
};
public:
virtual ~StaticResolver();
/// shouldOverride - Can resolver override the symbol pOld by the symbol pNew?
/// @return successfully resolved, return true; otherwise, return false.
/// @param pOld the symbol which may be overridden.
/// @param pNew the symbol which is used to replace pOld
virtual bool resolve(ResolveInfo& __restrict__ pOld,
const ResolveInfo& __restrict__ pNew,
bool& pOverride,
LDSymbol::ValueType pValue) const;
private:
inline unsigned int getOrdinate(const ResolveInfo& pInfo) const {
if (pInfo.isAbsolute() && pInfo.isDyn())
return d_D_ORD;
if (pInfo.isAbsolute())
return D_ORD;
if (pInfo.isCommon() && pInfo.isDyn())
return Cs_ORD;
if (pInfo.isCommon() && pInfo.isDefine())
return C_ORD;
if (pInfo.isCommon() && pInfo.isWeak())
return w_C_ORD;
if (pInfo.isIndirect())
return Is_ORD;
return pInfo.info();
}
};
} // namespace mcld
#endif // MCLD_LD_STATICRESOLVER_H_