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 20 namespace mcld { 21 22 typedef GCFactory<RpnExpr, MCLD_SYMBOLS_PER_INPUT> ExprFactory; 23 static llvm::ManagedStatic<ExprFactory> g_ExprFactory; 24 25 //===----------------------------------------------------------------------===// 26 // RpnExpr 27 //===----------------------------------------------------------------------===// RpnExpr()28RpnExpr::RpnExpr() { 29 } 30 ~RpnExpr()31RpnExpr::~RpnExpr() { 32 } 33 hasDot() const34bool 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 dump() const43void RpnExpr::dump() const { 44 for (const_iterator it = begin(), ie = end(); it != ie; ++it) { 45 (*it)->dump(); 46 mcld::outs() << " "; 47 } 48 } 49 push_back(ExprToken * pToken)50void RpnExpr::push_back(ExprToken* pToken) { 51 m_TokenQueue.push_back(pToken); 52 } 53 create()54RpnExpr* RpnExpr::create() { 55 RpnExpr* result = g_ExprFactory->allocate(); 56 new (result) RpnExpr(); 57 return result; 58 } 59 destroy(RpnExpr * & pRpnExpr)60void RpnExpr::destroy(RpnExpr*& pRpnExpr) { 61 g_ExprFactory->destroy(pRpnExpr); 62 g_ExprFactory->deallocate(pRpnExpr); 63 pRpnExpr = NULL; 64 } 65 clear()66void RpnExpr::clear() { 67 g_ExprFactory->clear(); 68 } 69 insert(iterator pPosition,ExprToken * pToken)70RpnExpr::iterator RpnExpr::insert(iterator pPosition, ExprToken* pToken) { 71 return m_TokenQueue.insert(pPosition, pToken); 72 } 73 erase(iterator pPosition)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' ) buildHelperExpr(SectionMap::iterator pIter)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' buildHelperExpr(Fragment & pFrag)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