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