//===- 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> 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; } } // namespace mcld