ResolveInfo.cpp revision f33f6de54db174aa679a4b6d1e040d37e95541c0
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//===----------------------------------------------------------------------===// 922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/ResolveInfo.h> 10f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines#include <mcld/LD/LDSection.h> 11f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <mcld/LinkerConfig.h> 12f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines#include <mcld/Support/GCFactory.h> 13f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines#include <llvm/Support/ManagedStatic.h> 1422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <cstdlib> 155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <cstring> 165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaousing namespace mcld; 185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// g_NullResolveInfo - a pointer to Null ResolveInfo. 2022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaostatic ResolveInfo* g_NullResolveInfo = NULL; 2122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 2222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// ResolveInfo 2422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoResolveInfo::ResolveInfo() 265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao : m_Size(0), m_BitField(0) { 275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_Ptr.sym_ptr = 0; 285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoResolveInfo::~ResolveInfo() 315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid ResolveInfo::override(const ResolveInfo& pFrom) 355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_Size = pFrom.m_Size; 375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao overrideAttributes(pFrom); 385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao overrideVisibility(pFrom); 395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid ResolveInfo::overrideAttributes(const ResolveInfo& pFrom) 425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_BitField &= ~RESOLVE_MASK; 445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_BitField |= (pFrom.m_BitField & RESOLVE_MASK); 455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// overrideVisibility - override the visibility 485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// always use the most strict visibility 495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid ResolveInfo::overrideVisibility(const ResolveInfo& pFrom) 505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // Reference: Google gold linker: resolve.cc 525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // 535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // The rule for combining visibility is that we always choose the 545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // most constrained visibility. In order of increasing constraint, 555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // visibility goes PROTECTED, HIDDEN, INTERNAL. This is the reverse 565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // of the numeric values, so the effect is that we always want the 575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // smallest non-zero value. 585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // 595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // enum { 605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // STV_DEFAULT = 0, 615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // STV_INTERNAL = 1, 625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // STV_HIDDEN = 2, 635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // STV_PROTECTED = 3 645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // }; 655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Visibility from_vis = pFrom.visibility(); 675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Visibility cur_vis = visibility(); 685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (0 != from_vis ) { 695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (0 == cur_vis) 705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao setVisibility(from_vis); 715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao else if (cur_vis > from_vis) 725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao setVisibility(from_vis); 735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid ResolveInfo::setRegular() 775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_BitField &= (~dynamic_flag); 795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid ResolveInfo::setDynamic() 825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_BitField |= dynamic_flag; 845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid ResolveInfo::setSource(bool pIsDyn) 875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (pIsDyn) 895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_BitField |= dynamic_flag; 905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao else 915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_BitField &= (~dynamic_flag); 925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 94f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinesvoid ResolveInfo::setInDyn() 95f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 96f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines m_BitField |= indyn_flag; 97f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 98f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid ResolveInfo::setType(uint32_t pType) 1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_BitField &= ~TYPE_MASK; 1025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_BitField |= ((pType << TYPE_OFFSET) & TYPE_MASK); 1035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid ResolveInfo::setDesc(uint32_t pDesc) 1065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_BitField &= ~DESC_MASK; 1085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_BitField |= ((pDesc << DESC_OFFSET) & DESC_MASK); 1095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid ResolveInfo::setBinding(uint32_t pBinding) 1125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_BitField &= ~BINDING_MASK; 1145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (pBinding == Local || pBinding == Absolute) 1155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_BitField |= local_flag; 1165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (pBinding == Weak || pBinding == Absolute) 1175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_BitField |= weak_flag; 1185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid ResolveInfo::setReserved(uint32_t pReserved) 1215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_BitField &= ~RESERVED_MASK; 1235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_BitField |= ((pReserved << RESERVED_OFFSET) & RESERVED_MASK); 1245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid ResolveInfo::setOther(uint32_t pOther) 1275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao setVisibility(static_cast<ResolveInfo::Visibility>(pOther & 0x3)); 1295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid ResolveInfo::setVisibility(ResolveInfo::Visibility pVisibility) 1325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_BitField &= ~VISIBILITY_MASK; 1345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_BitField |= pVisibility << VISIBILITY_OFFSET; 1355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid ResolveInfo::setIsSymbol(bool pIsSymbol) 1385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (pIsSymbol) 1405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_BitField |= symbol_flag; 1415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao else 1425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_BitField &= ~symbol_flag; 1435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 14522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool ResolveInfo::isNull() const 14622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 14722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return (this == Null()); 14822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 14922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 1505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool ResolveInfo::isDyn() const 1515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return (dynamic_flag == (m_BitField & DYN_MASK)); 1535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool ResolveInfo::isUndef() const 1565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return (undefine_flag == (m_BitField & DESC_MASK)); 1585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool ResolveInfo::isDefine() const 1615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return (define_flag == (m_BitField & DESC_MASK)); 1635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool ResolveInfo::isCommon() const 1665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return (common_flag == (m_BitField & DESC_MASK)); 1685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool ResolveInfo::isIndirect() const 1715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return (indirect_flag == (m_BitField & DESC_MASK)); 1735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// isGlobal - [L,W] == [0, 0] 1765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool ResolveInfo::isGlobal() const 1775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return (global_flag == (m_BitField & BINDING_MASK)); 1795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// isWeak - [L,W] == [0, 1] 1825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool ResolveInfo::isWeak() const 1835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return (weak_flag == (m_BitField & BINDING_MASK)); 1855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// isLocal - [L,W] == [1, 0] 1885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool ResolveInfo::isLocal() const 1895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return (local_flag == (m_BitField & BINDING_MASK)); 1915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// isAbsolute - [L,W] == [1, 1] 1945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool ResolveInfo::isAbsolute() const 1955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return (absolute_flag == (m_BitField & BINDING_MASK)); 1975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool ResolveInfo::isSymbol() const 2005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 2015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return (symbol_flag == (m_BitField & SYMBOL_MASK)); 2025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 2035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool ResolveInfo::isString() const 2055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 2065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return (string_flag == (m_BitField & SYMBOL_MASK)); 2075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 2085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 209f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinesbool ResolveInfo::isInDyn() const 210f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 211f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return (indyn_flag == (m_BitField & IN_DYN_MASK)); 212f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 213f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 2145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaouint32_t ResolveInfo::type() const 2155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 2165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return (m_BitField & TYPE_MASK) >> TYPE_OFFSET; 2175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 2185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaouint32_t ResolveInfo::desc() const 2205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 2215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return (m_BitField & DESC_MASK) >> DESC_OFFSET; 2225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 2235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaouint32_t ResolveInfo::binding() const 2255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 2265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (m_BitField & LOCAL_MASK) { 2275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (m_BitField & GLOBAL_MASK) { 2285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return ResolveInfo::Absolute; 2295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 2305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return ResolveInfo::Local; 2315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 2325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return m_BitField & GLOBAL_MASK; 2335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 2345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaouint32_t ResolveInfo::reserved() const 2365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 2375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return (m_BitField & RESERVED_MASK) >> RESERVED_OFFSET; 2385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 2395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoResolveInfo::Visibility ResolveInfo::visibility() const 2415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 2425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return static_cast<ResolveInfo::Visibility>((m_BitField & VISIBILITY_MASK) >> VISIBILITY_OFFSET); 2435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 2445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool ResolveInfo::compare(const ResolveInfo::key_type& pKey) 2465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 2475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_t length = nameSize(); 2485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (length != pKey.size()) 2495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return false; 2505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return (0 == std::memcmp(m_Name, pKey.data(), length)); 2515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 2525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 253f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinesbool ResolveInfo::shouldForceLocal(const LinkerConfig& pConfig) 254f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 255f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines // forced local symbol matches all rules: 256f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines // 1. We are not doing incremental linking. 257f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines // 2. The symbol is with Hidden or Internal visibility. 258f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines // 3. The symbol should be global or weak. Otherwise, local symbol is local. 259f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines // 4. The symbol is defined or common 260f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines if (LinkerConfig::Object != pConfig.codeGenType() && 261f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines (visibility() == ResolveInfo::Hidden || 262f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines visibility() == ResolveInfo::Internal) && 263f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines (isGlobal() || isWeak()) && 264f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines (isDefine() || isCommon())) 265f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return true; 266f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return false; 267f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 26822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 26922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// ResolveInfo Factory Methods 27022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 27122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoResolveInfo* ResolveInfo::Create(const ResolveInfo::key_type& pKey) 27222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 273f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines ResolveInfo* info = static_cast<ResolveInfo*>( 27422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao malloc(sizeof(ResolveInfo)+pKey.size()+1)); 275f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines if (NULL == info) 27622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return NULL; 27722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 278f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines new (info) ResolveInfo(); // call constructor at the `result` address. 279f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines std::memcpy(info->m_Name, pKey.data(), pKey.size()); 280f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines info->m_Name[pKey.size()] = '\0'; 281f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines info->m_BitField &= ~ResolveInfo::RESOLVE_MASK; 282f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines info->m_BitField |= (pKey.size() << ResolveInfo::NAME_LENGTH_OFFSET); 283f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return info; 28422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 28522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 28622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaovoid ResolveInfo::Destroy(ResolveInfo*& pInfo) 28722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 28822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (pInfo->isNull()) 28922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return; 29022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 29122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (NULL != pInfo) { 29222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao pInfo->~ResolveInfo(); 29322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao free(pInfo); 29422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 29522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 29622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao pInfo = NULL; 29722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 29822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 29922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoResolveInfo* ResolveInfo::Null() 30022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 30122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (NULL == g_NullResolveInfo) { 30222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao g_NullResolveInfo = static_cast<ResolveInfo*>( 30322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao malloc(sizeof(ResolveInfo) + 1)); 30422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao new (g_NullResolveInfo) ResolveInfo(); 30522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao g_NullResolveInfo->m_Name[0] = '\0'; 30622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao g_NullResolveInfo->m_BitField = 0x0; 3076f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines g_NullResolveInfo->setBinding(Local); 30822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 30922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return g_NullResolveInfo; 31022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 31122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 312f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 313