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