blob: a9a4cae8b301997c95e45b2d4ead4d6fc3d8e58f [file] [log] [blame]
//===- 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;
}