//===- RPNExpr.cpp --------------------------------------------------------===//
//
//                     The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include <mcld/Script/RpnExpr.h>
#include <mcld/Script/ExprToken.h>
#include <mcld/Script/Operand.h>
#include <mcld/Script/Operator.h>
#include <mcld/Support/GCFactory.h>
#include <mcld/Support/raw_ostream.h>
#include <llvm/Support/ManagedStatic.h>
#include <llvm/Support/Casting.h>

using namespace mcld;

typedef GCFactory<RpnExpr, MCLD_SYMBOLS_PER_INPUT> ExprFactory;
static llvm::ManagedStatic<ExprFactory> g_ExprFactory;

//===----------------------------------------------------------------------===//
// RpnExpr
//===----------------------------------------------------------------------===//
RpnExpr::RpnExpr()
{
}

RpnExpr::~RpnExpr()
{
}

bool RpnExpr::hasDot() const
{
  for (const_iterator it = begin(), ie = end(); it != ie; ++it) {
    if ((*it)->kind() == ExprToken::OPERAND &&
        llvm::cast<Operand>(*it)->isDot())
      return true;
  }
  return false;
}

void RpnExpr::dump() const
{
  for (const_iterator it = begin(), ie = end(); it != ie; ++it) {
    (*it)->dump();
    mcld::outs() << " ";
  }
}

void RpnExpr::push_back(ExprToken* pToken)
{
  m_TokenQueue.push_back(pToken);
}

RpnExpr* RpnExpr::create()
{
  RpnExpr* result = g_ExprFactory->allocate();
  new (result) RpnExpr();
  return result;
}

void RpnExpr::destroy(RpnExpr*& pRpnExpr)
{
  g_ExprFactory->destroy(pRpnExpr);
  g_ExprFactory->deallocate(pRpnExpr);
  pRpnExpr = NULL;
}

void RpnExpr::clear()
{
  g_ExprFactory->clear();
}

RpnExpr::iterator RpnExpr::insert(iterator pPosition, ExprToken* pToken)
{
  return m_TokenQueue.insert(pPosition, pToken);
}

void RpnExpr::erase(iterator pPosition)
{
  m_TokenQueue.erase(pPosition);
}

// buildHelperExpr - build the helper expr:
//                   ADDR ( `output_sect' ) + SIZEOF ( `output_sect' )
RpnExpr* RpnExpr::buildHelperExpr(SectionMap::iterator pIter)
{
  RpnExpr* expr = RpnExpr::create();
  expr->push_back(SectDescOperand::create(*pIter));
  expr->push_back(&Operator::create<Operator::ADDR>());
  expr->push_back(SectDescOperand::create(*pIter));
  expr->push_back(&Operator::create<Operator::SIZEOF>());
  expr->push_back(&Operator::create<Operator::ADD>());
  return expr;
}

// buildHelperExpr - build the helper expr: `fragment'
RpnExpr* RpnExpr::buildHelperExpr(Fragment& pFrag)
{
  RpnExpr* expr = RpnExpr::create();
  expr->push_back(FragOperand::create(pFrag));
  return expr;
}
