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