blob: b13e48df44b4ab24029bda69dc02d4a23533cedf [file] [log] [blame]
//===- MCLinker.tcc -------------------------------------------------------===//
//
// The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
/// addSymbol - add a symbol and resolve it immediately
template<Input::Type FROM>
LDSymbol* MCLinker::addSymbol(const llvm::StringRef& pName,
ResolveInfo::Type pType,
ResolveInfo::Desc pDesc,
ResolveInfo::Binding pBinding,
ResolveInfo::SizeType pSize,
LDSymbol::ValueType pValue,
FragmentRef* pFragmentRef,
ResolveInfo::Visibility pVisibility)
{
llvm::StringRef symbol_name = pName;
if (!getLDInfo().scripts().renameMap().empty() &&
ResolveInfo::Undefined == pDesc) {
// If the renameMap is not empty, some symbols should be renamed.
// --wrap and --portable defines the symbol rename map.
ScriptOptions::SymbolRenameMap::iterator renameSym
= getLDInfo().scripts().renameMap().find(pName);
if (renameSym != getLDInfo().scripts().renameMap().end())
symbol_name = renameSym.getEntry()->value();
}
if (FROM == Input::DynObj)
return addSymbolFromDynObj(symbol_name,
pType,
pDesc,
pBinding,
pSize,
pValue,
pFragmentRef,
pVisibility);
if (FROM == Input::Object)
return addSymbolFromObject(symbol_name,
pType,
pDesc,
pBinding,
pSize,
pValue,
pFragmentRef,
pVisibility);
llvm::report_fatal_error("add a symbol from unknown file type.\n");
return NULL;
}
// defineSymbol - define a new symbol
template<MCLinker::DefinePolicy POLICY, MCLinker::ResolvePolicy RESOLVE>
LDSymbol* MCLinker::defineSymbol(const llvm::StringRef& pName,
bool pIsDyn,
ResolveInfo::Type pType,
ResolveInfo::Desc pDesc,
ResolveInfo::Binding pBinding,
ResolveInfo::SizeType pSize,
LDSymbol::ValueType pValue,
FragmentRef* pFragmentRef,
ResolveInfo::Visibility pVisibility)
{
// These if/return should be optimized by compiler.
// This function is defined for clarity.
if (MCLinker::Force == POLICY && MCLinker::Unresolve == RESOLVE)
return defineSymbolForcefully(pName,
pIsDyn,
pType,
pDesc,
pBinding,
pSize,
pValue,
pFragmentRef,
pVisibility);
if (MCLinker::AsRefered == POLICY && MCLinker::Unresolve == RESOLVE)
return defineSymbolAsRefered(pName,
pIsDyn,
pType,
pDesc,
pBinding,
pSize,
pValue,
pFragmentRef,
pVisibility);
if (MCLinker::Force == POLICY && MCLinker::Resolve == RESOLVE)
return defineAndResolveSymbolForcefully(pName,
pIsDyn,
pType,
pDesc,
pBinding,
pSize,
pValue,
pFragmentRef,
pVisibility);
if (MCLinker::AsRefered == POLICY && MCLinker::Resolve == RESOLVE)
return defineAndResolveSymbolAsRefered(pName,
pIsDyn,
pType,
pDesc,
pBinding,
pSize,
pValue,
pFragmentRef,
pVisibility);
}