1//===- LDSymbol.cpp -------------------------------------------------------===//
2//
3//                     The MCLinker Project
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9#include <mcld/LD/LDSymbol.h>
10
11#include <mcld/Config/Config.h>
12#include <mcld/Fragment/FragmentRef.h>
13#include <mcld/Fragment/NullFragment.h>
14#include <mcld/Support/GCFactory.h>
15
16#include <cstring>
17
18#include <llvm/Support/ManagedStatic.h>
19
20using namespace mcld;
21
22typedef GCFactory<LDSymbol, MCLD_SYMBOLS_PER_INPUT> LDSymbolFactory;
23
24static llvm::ManagedStatic<LDSymbol> g_NullSymbol;
25static llvm::ManagedStatic<NullFragment> g_NullSymbolFragment;
26static llvm::ManagedStatic<LDSymbolFactory> g_LDSymbolFactory;
27
28//===----------------------------------------------------------------------===//
29// LDSymbol
30//===----------------------------------------------------------------------===//
31LDSymbol::LDSymbol()
32  : m_pResolveInfo(NULL), m_pFragRef(NULL), m_Value(0) {
33}
34
35LDSymbol::~LDSymbol()
36{
37}
38
39LDSymbol::LDSymbol(const LDSymbol& pCopy)
40  : m_pResolveInfo(pCopy.m_pResolveInfo),
41    m_pFragRef(pCopy.m_pFragRef),
42    m_Value(pCopy.m_Value) {
43}
44
45LDSymbol& LDSymbol::operator=(const LDSymbol& pCopy)
46{
47  m_pResolveInfo = pCopy.m_pResolveInfo;
48  m_pFragRef = pCopy.m_pFragRef;
49  m_Value = pCopy.m_Value;
50  return (*this);
51}
52
53LDSymbol* LDSymbol::Create(ResolveInfo& pResolveInfo)
54{
55  LDSymbol* result = g_LDSymbolFactory->allocate();
56  new (result) LDSymbol();
57  result->setResolveInfo(pResolveInfo);
58  return result;
59}
60
61void LDSymbol::Destroy(LDSymbol*& pSymbol)
62{
63  pSymbol->~LDSymbol();
64  g_LDSymbolFactory->deallocate(pSymbol);
65  pSymbol = NULL;
66}
67
68void LDSymbol::Clear()
69{
70  g_LDSymbolFactory->clear();
71}
72
73LDSymbol* LDSymbol::Null()
74{
75  // lazy initialization
76  if (NULL == g_NullSymbol->resolveInfo()) {
77    g_NullSymbol->setResolveInfo(*ResolveInfo::Null());
78    g_NullSymbol->setFragmentRef(FragmentRef::Create(*g_NullSymbolFragment, 0));
79    ResolveInfo::Null()->setSymPtr(&*g_NullSymbol);
80  }
81  return &*g_NullSymbol;
82}
83
84void LDSymbol::setFragmentRef(FragmentRef* pFragmentRef)
85{
86  m_pFragRef = pFragmentRef;
87}
88
89void LDSymbol::setResolveInfo(const ResolveInfo& pInfo)
90{
91  m_pResolveInfo = const_cast<ResolveInfo*>(&pInfo);
92}
93
94bool LDSymbol::isNull() const
95{
96  return (this == Null());
97}
98
99bool LDSymbol::hasFragRef() const
100{
101  return !m_pFragRef->isNull();
102}
103
104