You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
98 lines
2.6 KiB
98 lines
2.6 KiB
//===- 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
|