RpnExpr.cpp revision 37b74a387bb3993387029859c2d9d051c41c724e
1//===- RPNExpr.cpp --------------------------------------------------------===// 2// 3// The MCLinker Project 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9#include "mcld/Script/RpnExpr.h" 10 11#include "mcld/Script/ExprToken.h" 12#include "mcld/Script/Operand.h" 13#include "mcld/Script/Operator.h" 14#include "mcld/Support/GCFactory.h" 15#include "mcld/Support/raw_ostream.h" 16 17#include <llvm/Support/ManagedStatic.h> 18#include <llvm/Support/Casting.h> 19 20namespace mcld { 21 22typedef GCFactory<RpnExpr, MCLD_SYMBOLS_PER_INPUT> ExprFactory; 23static llvm::ManagedStatic<ExprFactory> g_ExprFactory; 24 25//===----------------------------------------------------------------------===// 26// RpnExpr 27//===----------------------------------------------------------------------===// 28RpnExpr::RpnExpr() { 29} 30 31RpnExpr::~RpnExpr() { 32} 33 34bool RpnExpr::hasDot() const { 35 for (const_iterator it = begin(), ie = end(); it != ie; ++it) { 36 if ((*it)->kind() == ExprToken::OPERAND && 37 llvm::cast<Operand>(*it)->isDot()) 38 return true; 39 } 40 return false; 41} 42 43void RpnExpr::dump() const { 44 for (const_iterator it = begin(), ie = end(); it != ie; ++it) { 45 (*it)->dump(); 46 mcld::outs() << " "; 47 } 48} 49 50void RpnExpr::push_back(ExprToken* pToken) { 51 m_TokenQueue.push_back(pToken); 52} 53 54RpnExpr* RpnExpr::create() { 55 RpnExpr* result = g_ExprFactory->allocate(); 56 new (result) RpnExpr(); 57 return result; 58} 59 60void RpnExpr::destroy(RpnExpr*& pRpnExpr) { 61 g_ExprFactory->destroy(pRpnExpr); 62 g_ExprFactory->deallocate(pRpnExpr); 63 pRpnExpr = NULL; 64} 65 66void RpnExpr::clear() { 67 g_ExprFactory->clear(); 68} 69 70RpnExpr::iterator RpnExpr::insert(iterator pPosition, ExprToken* pToken) { 71 return m_TokenQueue.insert(pPosition, pToken); 72} 73 74void RpnExpr::erase(iterator pPosition) { 75 m_TokenQueue.erase(pPosition); 76} 77 78// buildHelperExpr - build the helper expr: 79// ADDR ( `output_sect' ) + SIZEOF ( `output_sect' ) 80RpnExpr* RpnExpr::buildHelperExpr(SectionMap::iterator pIter) { 81 RpnExpr* expr = RpnExpr::create(); 82 expr->push_back(SectDescOperand::create(*pIter)); 83 expr->push_back(&Operator::create<Operator::ADDR>()); 84 expr->push_back(SectDescOperand::create(*pIter)); 85 expr->push_back(&Operator::create<Operator::SIZEOF>()); 86 expr->push_back(&Operator::create<Operator::ADD>()); 87 return expr; 88} 89 90// buildHelperExpr - build the helper expr: `fragment' 91RpnExpr* RpnExpr::buildHelperExpr(Fragment& pFrag) { 92 RpnExpr* expr = RpnExpr::create(); 93 expr->push_back(FragOperand::create(pFrag)); 94 return expr; 95} 96 97} // namespace mcld 98