15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- LDSymbol.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/LDSymbol.h" 10cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 1137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Config/Config.h" 1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Fragment/FragmentRef.h" 1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Fragment/NullFragment.h" 1437b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/GCFactory.h" 155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <llvm/Support/ManagedStatic.h> 1722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 1837b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include <cstring> 1937b74a387bb3993387029859c2d9d051c41c724eStephen Hines 2037b74a387bb3993387029859c2d9d051c41c724eStephen Hinesnamespace mcld { 215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaotypedef GCFactory<LDSymbol, MCLD_SYMBOLS_PER_INPUT> LDSymbolFactory; 2322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 246f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesstatic llvm::ManagedStatic<LDSymbol> g_NullSymbol; 256f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesstatic llvm::ManagedStatic<NullFragment> g_NullSymbolFragment; 2622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaostatic llvm::ManagedStatic<LDSymbolFactory> g_LDSymbolFactory; 2722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 2822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 2922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// LDSymbol 3022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 3137b74a387bb3993387029859c2d9d051c41c724eStephen HinesLDSymbol::LDSymbol() : m_pResolveInfo(NULL), m_pFragRef(NULL), m_Value(0) { 325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 3437b74a387bb3993387029859c2d9d051c41c724eStephen HinesLDSymbol::~LDSymbol() { 355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoLDSymbol::LDSymbol(const LDSymbol& pCopy) 3837b74a387bb3993387029859c2d9d051c41c724eStephen Hines : m_pResolveInfo(pCopy.m_pResolveInfo), 3937b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_pFragRef(pCopy.m_pFragRef), 4037b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_Value(pCopy.m_Value) { 415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 4337b74a387bb3993387029859c2d9d051c41c724eStephen HinesLDSymbol& LDSymbol::operator=(const LDSymbol& pCopy) { 445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_pResolveInfo = pCopy.m_pResolveInfo; 455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_pFragRef = pCopy.m_pFragRef; 465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_Value = pCopy.m_Value; 475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return (*this); 485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 5037b74a387bb3993387029859c2d9d051c41c724eStephen HinesLDSymbol* LDSymbol::Create(ResolveInfo& pResolveInfo) { 5122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao LDSymbol* result = g_LDSymbolFactory->allocate(); 5222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao new (result) LDSymbol(); 5322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao result->setResolveInfo(pResolveInfo); 5422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return result; 5522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 5622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 5737b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid LDSymbol::Destroy(LDSymbol*& pSymbol) { 5822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao pSymbol->~LDSymbol(); 5922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao g_LDSymbolFactory->deallocate(pSymbol); 6022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao pSymbol = NULL; 6122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 6222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 6337b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid LDSymbol::Clear() { 6422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao g_LDSymbolFactory->clear(); 6522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 6622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 6737b74a387bb3993387029859c2d9d051c41c724eStephen HinesLDSymbol* LDSymbol::Null() { 686f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines // lazy initialization 6937b74a387bb3993387029859c2d9d051c41c724eStephen Hines if (g_NullSymbol->resolveInfo() == NULL) { 7022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao g_NullSymbol->setResolveInfo(*ResolveInfo::Null()); 716f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines g_NullSymbol->setFragmentRef(FragmentRef::Create(*g_NullSymbolFragment, 0)); 726f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines ResolveInfo::Null()->setSymPtr(&*g_NullSymbol); 7322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 746f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines return &*g_NullSymbol; 7522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 7622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 7737b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid LDSymbol::setFragmentRef(FragmentRef* pFragmentRef) { 785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_pFragRef = pFragmentRef; 795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 8137b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid LDSymbol::setResolveInfo(const ResolveInfo& pInfo) { 825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_pResolveInfo = const_cast<ResolveInfo*>(&pInfo); 835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 8537b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool LDSymbol::isNull() const { 8622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return (this == Null()); 8722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 8822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 8937b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool LDSymbol::hasFragRef() const { 9022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return !m_pFragRef->isNull(); 9122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 9222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 9337b74a387bb3993387029859c2d9d051c41c724eStephen Hines} // namespace mcld 94