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