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