15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- ResolveInfo.cpp ----------------------------------------------------===// 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//===----------------------------------------------------------------------===// 937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/ResolveInfo.h" 1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines 1137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LinkerConfig.h" 1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/LDSection.h" 1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/GCFactory.h" 1437b74a387bb3993387029859c2d9d051c41c724eStephen Hines 15f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines#include <llvm/Support/ManagedStatic.h> 1637b74a387bb3993387029859c2d9d051c41c724eStephen Hines 1722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <cstdlib> 185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <cstring> 195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2037b74a387bb3993387029859c2d9d051c41c724eStephen Hinesnamespace mcld { 215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// g_NullResolveInfo - a pointer to Null ResolveInfo. 2322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaostatic ResolveInfo* g_NullResolveInfo = NULL; 2422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 2522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// ResolveInfo 2722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 2837b74a387bb3993387029859c2d9d051c41c724eStephen HinesResolveInfo::ResolveInfo() : m_Size(0), m_BitField(0) { 295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_Ptr.sym_ptr = 0; 305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 3237b74a387bb3993387029859c2d9d051c41c724eStephen HinesResolveInfo::~ResolveInfo() { 335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 3537b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid ResolveInfo::override(const ResolveInfo& pFrom) { 365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_Size = pFrom.m_Size; 375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao overrideAttributes(pFrom); 385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao overrideVisibility(pFrom); 395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 4137b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid ResolveInfo::overrideAttributes(const ResolveInfo& pFrom) { 4237b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_BitField &= ~RESOLVE_MASK | VISIBILITY_MASK; 4337b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_BitField |= (pFrom.m_BitField & (RESOLVE_MASK & ~VISIBILITY_MASK)); 445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// overrideVisibility - override the visibility 475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// always use the most strict visibility 4837b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid ResolveInfo::overrideVisibility(const ResolveInfo& pFrom) { 495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // The rule for combining visibility is that we always choose the 505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // most constrained visibility. In order of increasing constraint, 515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // visibility goes PROTECTED, HIDDEN, INTERNAL. This is the reverse 525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // of the numeric values, so the effect is that we always want the 535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // smallest non-zero value. 545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // 555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // enum { 565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // STV_DEFAULT = 0, 575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // STV_INTERNAL = 1, 585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // STV_HIDDEN = 2, 595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // STV_PROTECTED = 3 605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // }; 615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Visibility from_vis = pFrom.visibility(); 635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Visibility cur_vis = visibility(); 6437b74a387bb3993387029859c2d9d051c41c724eStephen Hines if (from_vis != 0) { 6537b74a387bb3993387029859c2d9d051c41c724eStephen Hines if (cur_vis == 0) 665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao setVisibility(from_vis); 675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao else if (cur_vis > from_vis) 685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao setVisibility(from_vis); 695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 7237b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid ResolveInfo::setRegular() { 735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_BitField &= (~dynamic_flag); 745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 7637b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid ResolveInfo::setDynamic() { 775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_BitField |= dynamic_flag; 785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 8037b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid ResolveInfo::setSource(bool pIsDyn) { 815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (pIsDyn) 825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_BitField |= dynamic_flag; 835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao else 845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_BitField &= (~dynamic_flag); 855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 8737b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid ResolveInfo::setInDyn() { 88f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines m_BitField |= indyn_flag; 89f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 90f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 9137b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid ResolveInfo::setType(uint32_t pType) { 925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_BitField &= ~TYPE_MASK; 935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_BitField |= ((pType << TYPE_OFFSET) & TYPE_MASK); 945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 9637b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid ResolveInfo::setDesc(uint32_t pDesc) { 975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_BitField &= ~DESC_MASK; 985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_BitField |= ((pDesc << DESC_OFFSET) & DESC_MASK); 995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 10137b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid ResolveInfo::setBinding(uint32_t pBinding) { 1025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_BitField &= ~BINDING_MASK; 1035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (pBinding == Local || pBinding == Absolute) 1045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_BitField |= local_flag; 1055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (pBinding == Weak || pBinding == Absolute) 1065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_BitField |= weak_flag; 1075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 10937b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid ResolveInfo::setReserved(uint32_t pReserved) { 1105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_BitField &= ~RESERVED_MASK; 1115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_BitField |= ((pReserved << RESERVED_OFFSET) & RESERVED_MASK); 1125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 11437b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid ResolveInfo::setOther(uint32_t pOther) { 1155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao setVisibility(static_cast<ResolveInfo::Visibility>(pOther & 0x3)); 1165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 11837b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid ResolveInfo::setVisibility(ResolveInfo::Visibility pVisibility) { 1195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_BitField &= ~VISIBILITY_MASK; 1205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_BitField |= pVisibility << VISIBILITY_OFFSET; 1215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 12337b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid ResolveInfo::setIsSymbol(bool pIsSymbol) { 1245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (pIsSymbol) 1255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_BitField |= symbol_flag; 1265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao else 1275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_BitField &= ~symbol_flag; 1285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 13037b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool ResolveInfo::isNull() const { 13122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return (this == Null()); 13222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 13322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 13437b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool ResolveInfo::isDyn() const { 1355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return (dynamic_flag == (m_BitField & DYN_MASK)); 1365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 13837b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool ResolveInfo::isUndef() const { 1395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return (undefine_flag == (m_BitField & DESC_MASK)); 1405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 14237b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool ResolveInfo::isDefine() const { 1435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return (define_flag == (m_BitField & DESC_MASK)); 1445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 14637b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool ResolveInfo::isCommon() const { 1475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return (common_flag == (m_BitField & DESC_MASK)); 1485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 15037b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool ResolveInfo::isIndirect() const { 1515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return (indirect_flag == (m_BitField & DESC_MASK)); 1525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// isGlobal - [L,W] == [0, 0] 15537b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool ResolveInfo::isGlobal() const { 1565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return (global_flag == (m_BitField & BINDING_MASK)); 1575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// isWeak - [L,W] == [0, 1] 16037b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool ResolveInfo::isWeak() const { 1615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return (weak_flag == (m_BitField & BINDING_MASK)); 1625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// isLocal - [L,W] == [1, 0] 16537b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool ResolveInfo::isLocal() const { 1665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return (local_flag == (m_BitField & BINDING_MASK)); 1675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// isAbsolute - [L,W] == [1, 1] 17037b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool ResolveInfo::isAbsolute() const { 1715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return (absolute_flag == (m_BitField & BINDING_MASK)); 1725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 17437b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool ResolveInfo::isSymbol() const { 1755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return (symbol_flag == (m_BitField & SYMBOL_MASK)); 1765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 17837b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool ResolveInfo::isString() const { 1795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return (string_flag == (m_BitField & SYMBOL_MASK)); 1805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 18237b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool ResolveInfo::isInDyn() const { 183f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return (indyn_flag == (m_BitField & IN_DYN_MASK)); 184f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 185f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 18637b74a387bb3993387029859c2d9d051c41c724eStephen Hinesuint32_t ResolveInfo::type() const { 1875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return (m_BitField & TYPE_MASK) >> TYPE_OFFSET; 1885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 19037b74a387bb3993387029859c2d9d051c41c724eStephen Hinesuint32_t ResolveInfo::desc() const { 1915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return (m_BitField & DESC_MASK) >> DESC_OFFSET; 1925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 19437b74a387bb3993387029859c2d9d051c41c724eStephen Hinesuint32_t ResolveInfo::binding() const { 1955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (m_BitField & LOCAL_MASK) { 1965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (m_BitField & GLOBAL_MASK) { 1975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return ResolveInfo::Absolute; 1985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 1995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return ResolveInfo::Local; 2005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 2015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return m_BitField & GLOBAL_MASK; 2025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 2035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 20437b74a387bb3993387029859c2d9d051c41c724eStephen Hinesuint32_t ResolveInfo::reserved() const { 2055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return (m_BitField & RESERVED_MASK) >> RESERVED_OFFSET; 2065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 2075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 20837b74a387bb3993387029859c2d9d051c41c724eStephen HinesResolveInfo::Visibility ResolveInfo::visibility() const { 20937b74a387bb3993387029859c2d9d051c41c724eStephen Hines return static_cast<ResolveInfo::Visibility>((m_BitField & VISIBILITY_MASK) >> 21037b74a387bb3993387029859c2d9d051c41c724eStephen Hines VISIBILITY_OFFSET); 2115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 2125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 21337b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool ResolveInfo::compare(const ResolveInfo::key_type& pKey) { 2145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_t length = nameSize(); 2155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (length != pKey.size()) 2165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return false; 21737b74a387bb3993387029859c2d9d051c41c724eStephen Hines return (std::memcmp(m_Name, pKey.data(), length) == 0); 2185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 2195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 22037b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool ResolveInfo::shouldForceLocal(const LinkerConfig& pConfig) { 221f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines // forced local symbol matches all rules: 222f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines // 1. We are not doing incremental linking. 223f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines // 2. The symbol is with Hidden or Internal visibility. 224f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines // 3. The symbol should be global or weak. Otherwise, local symbol is local. 225f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines // 4. The symbol is defined or common 226f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines if (LinkerConfig::Object != pConfig.codeGenType() && 227f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines (visibility() == ResolveInfo::Hidden || 228f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines visibility() == ResolveInfo::Internal) && 22937b74a387bb3993387029859c2d9d051c41c724eStephen Hines (isGlobal() || isWeak()) && (isDefine() || isCommon())) 230f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return true; 231f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return false; 232f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 23322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 23422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// ResolveInfo Factory Methods 23522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 23637b74a387bb3993387029859c2d9d051c41c724eStephen HinesResolveInfo* ResolveInfo::Create(const ResolveInfo::key_type& pKey) { 23737b74a387bb3993387029859c2d9d051c41c724eStephen Hines ResolveInfo* info = 23837b74a387bb3993387029859c2d9d051c41c724eStephen Hines static_cast<ResolveInfo*>(malloc(sizeof(ResolveInfo) + pKey.size() + 1)); 23937b74a387bb3993387029859c2d9d051c41c724eStephen Hines if (info == NULL) 24022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return NULL; 24122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 24237b74a387bb3993387029859c2d9d051c41c724eStephen Hines new (info) ResolveInfo(); // call constructor at the `result` address. 243f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines std::memcpy(info->m_Name, pKey.data(), pKey.size()); 244f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines info->m_Name[pKey.size()] = '\0'; 245f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines info->m_BitField &= ~ResolveInfo::RESOLVE_MASK; 246f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines info->m_BitField |= (pKey.size() << ResolveInfo::NAME_LENGTH_OFFSET); 247f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return info; 24822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 24922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 25037b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid ResolveInfo::Destroy(ResolveInfo*& pInfo) { 25122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (pInfo->isNull()) 25222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return; 25322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 25437b74a387bb3993387029859c2d9d051c41c724eStephen Hines if (pInfo != NULL) { 25522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao pInfo->~ResolveInfo(); 25622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao free(pInfo); 25722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 25822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 25922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao pInfo = NULL; 26022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 26122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 26237b74a387bb3993387029859c2d9d051c41c724eStephen HinesResolveInfo* ResolveInfo::Null() { 26337b74a387bb3993387029859c2d9d051c41c724eStephen Hines if (g_NullResolveInfo == NULL) { 26437b74a387bb3993387029859c2d9d051c41c724eStephen Hines g_NullResolveInfo = 26537b74a387bb3993387029859c2d9d051c41c724eStephen Hines static_cast<ResolveInfo*>(malloc(sizeof(ResolveInfo) + 1)); 26622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao new (g_NullResolveInfo) ResolveInfo(); 26722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao g_NullResolveInfo->m_Name[0] = '\0'; 26822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao g_NullResolveInfo->m_BitField = 0x0; 2696f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines g_NullResolveInfo->setBinding(Local); 27022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 27122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return g_NullResolveInfo; 27222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 27322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 27437b74a387bb3993387029859c2d9d051c41c724eStephen Hines} // namespace mcld 275