• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
20 using namespace mcld;
21 
22 typedef GCFactory<LDSymbol, MCLD_SYMBOLS_PER_INPUT> LDSymbolFactory;
23 
24 static llvm::ManagedStatic<LDSymbol> g_NullSymbol;
25 static llvm::ManagedStatic<NullFragment> g_NullSymbolFragment;
26 static llvm::ManagedStatic<LDSymbolFactory> g_LDSymbolFactory;
27 
28 //===----------------------------------------------------------------------===//
29 // LDSymbol
30 //===----------------------------------------------------------------------===//
LDSymbol()31 LDSymbol::LDSymbol()
32   : m_pResolveInfo(NULL), m_pFragRef(NULL), m_Value(0) {
33 }
34 
~LDSymbol()35 LDSymbol::~LDSymbol()
36 {
37 }
38 
LDSymbol(const LDSymbol & pCopy)39 LDSymbol::LDSymbol(const LDSymbol& pCopy)
40   : m_pResolveInfo(pCopy.m_pResolveInfo),
41     m_pFragRef(pCopy.m_pFragRef),
42     m_Value(pCopy.m_Value) {
43 }
44 
operator =(const LDSymbol & pCopy)45 LDSymbol& 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 
Create(ResolveInfo & pResolveInfo)53 LDSymbol* LDSymbol::Create(ResolveInfo& pResolveInfo)
54 {
55   LDSymbol* result = g_LDSymbolFactory->allocate();
56   new (result) LDSymbol();
57   result->setResolveInfo(pResolveInfo);
58   return result;
59 }
60 
Destroy(LDSymbol * & pSymbol)61 void LDSymbol::Destroy(LDSymbol*& pSymbol)
62 {
63   pSymbol->~LDSymbol();
64   g_LDSymbolFactory->deallocate(pSymbol);
65   pSymbol = NULL;
66 }
67 
Clear()68 void LDSymbol::Clear()
69 {
70   g_LDSymbolFactory->clear();
71 }
72 
Null()73 LDSymbol* 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 
setFragmentRef(FragmentRef * pFragmentRef)84 void LDSymbol::setFragmentRef(FragmentRef* pFragmentRef)
85 {
86   m_pFragRef = pFragmentRef;
87 }
88 
setResolveInfo(const ResolveInfo & pInfo)89 void LDSymbol::setResolveInfo(const ResolveInfo& pInfo)
90 {
91   m_pResolveInfo = const_cast<ResolveInfo*>(&pInfo);
92 }
93 
isNull() const94 bool LDSymbol::isNull() const
95 {
96   return (this == Null());
97 }
98 
hasFragRef() const99 bool LDSymbol::hasFragRef() const
100 {
101   return !m_pFragRef->isNull();
102 }
103 
104