//===- MCLDInfo.cpp -------------------------------------------------------===//
//
//                     The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include <mcld/Config/Config.h>
#include <mcld/MC/MCLDInfo.h>
#include <mcld/MC/InputFactory.h>
#include <mcld/MC/AttributeFactory.h>
#include <mcld/MC/ContextFactory.h>
#include <mcld/LD/NamePool.h>
#include <mcld/LD/StaticResolver.h>
#include <mcld/Support/FileSystem.h>
#include <string>

using namespace mcld;

//==========================
// MCLDInfo
MCLDInfo::MCLDInfo(const std::string& pTripleString,
                   size_t pAttrNum,
                   size_t pInputNum)
  : m_Options(),
    m_Scripts(),
    m_pBitcode(NULL),
    m_Triple(pTripleString)
{
  m_pAttrFactory = new AttributeFactory(pAttrNum);
  m_pCntxtFactory = new ContextFactory(pInputNum);
  m_pInputFactory = new InputFactory(pInputNum, *m_pAttrFactory);
  m_pInputTree = new InputTree(*m_pInputFactory);
  m_pOutput = new mcld::Output();
  m_pResolver = new StaticResolver();
  m_pNamePool = new NamePool(*m_pResolver, 1024);
}

MCLDInfo::~MCLDInfo()
{
  delete m_pOutput;
  delete m_pAttrFactory;
  delete m_pCntxtFactory;
  delete m_pInputFactory;
  delete m_pInputTree;
  delete m_pResolver;
  delete m_pNamePool;
}

void MCLDInfo::setBitcode(const Input& pInput)
{
  m_pBitcode = const_cast<Input*>(&pInput);
}

Input& MCLDInfo::bitcode()
{
  assert((0 != m_pBitcode) && "default bitcode is not set");
  return *m_pBitcode;
}

const Input& MCLDInfo::bitcode() const
{
  assert((0 != m_pBitcode) && "default bitcode is not set");
  return *m_pBitcode;
}

const char* MCLDInfo::version()
{
  return MCLD_VERSION;
}