1f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===- Operand.cpp --------------------------------------------------------===// 2f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// 3f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// The MCLinker Project 4f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// 5f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// This file is distributed under the University of Illinois Open Source 6f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// License. See LICENSE.TXT for details. 7f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// 8f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===----------------------------------------------------------------------===// 937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/Operand.h" 1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines 1137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Fragment/Fragment.h" 1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/LDSection.h" 1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/SectionData.h" 1437b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/GCFactory.h" 1537b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/raw_ostream.h" 1637b74a387bb3993387029859c2d9d051c41c724eStephen Hines 17f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <llvm/Support/ManagedStatic.h> 18f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 1937b74a387bb3993387029859c2d9d051c41c724eStephen Hinesnamespace mcld { 20f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 21f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===----------------------------------------------------------------------===// 22f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// Operand 23f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===----------------------------------------------------------------------===// 2437b74a387bb3993387029859c2d9d051c41c724eStephen HinesOperand::Operand(Type pType) : ExprToken(ExprToken::OPERAND), m_Type(pType) { 25f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 26f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 2737b74a387bb3993387029859c2d9d051c41c724eStephen HinesOperand::~Operand() { 28f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 29f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 30f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===----------------------------------------------------------------------===// 31f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// SymOperand 32f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===----------------------------------------------------------------------===// 33f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestypedef GCFactory<SymOperand, MCLD_SYMBOLS_PER_INPUT> SymOperandFactory; 34f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinesstatic llvm::ManagedStatic<SymOperandFactory> g_SymOperandFactory; 35f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 3637b74a387bb3993387029859c2d9d051c41c724eStephen HinesSymOperand::SymOperand() : Operand(Operand::SYMBOL), m_Value(0) { 37f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 38f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 39f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesSymOperand::SymOperand(const std::string& pName) 4037b74a387bb3993387029859c2d9d051c41c724eStephen Hines : Operand(Operand::SYMBOL), m_Name(pName), m_Value(0) { 41f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 42f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 4337b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid SymOperand::dump() const { 44f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines mcld::outs() << m_Name; 45f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 46f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 4737b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool SymOperand::isDot() const { 48f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines assert(!m_Name.empty()); 49f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return m_Name.size() == 1 && m_Name[0] == '.'; 50f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 51f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 5237b74a387bb3993387029859c2d9d051c41c724eStephen HinesSymOperand* SymOperand::create(const std::string& pName) { 53f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines SymOperand* result = g_SymOperandFactory->allocate(); 54f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines new (result) SymOperand(pName); 55f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return result; 56f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 57f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 5837b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid SymOperand::destroy(SymOperand*& pOperand) { 59f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines g_SymOperandFactory->destroy(pOperand); 60f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines g_SymOperandFactory->deallocate(pOperand); 61f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines pOperand = NULL; 62f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 63f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 6437b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid SymOperand::clear() { 65f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines g_SymOperandFactory->clear(); 66f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 67f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 68f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===----------------------------------------------------------------------===// 69f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// IntOperand 70f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===----------------------------------------------------------------------===// 71f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestypedef GCFactory<IntOperand, MCLD_SYMBOLS_PER_INPUT> IntOperandFactory; 72f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinesstatic llvm::ManagedStatic<IntOperandFactory> g_IntOperandFactory; 73f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 7437b74a387bb3993387029859c2d9d051c41c724eStephen HinesIntOperand::IntOperand() : Operand(Operand::INTEGER), m_Value(0) { 75f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 76f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 77f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesIntOperand::IntOperand(uint64_t pValue) 7837b74a387bb3993387029859c2d9d051c41c724eStephen Hines : Operand(Operand::INTEGER), m_Value(pValue) { 79f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 80f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 8137b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid IntOperand::dump() const { 82f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines mcld::outs() << m_Value; 83f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 84f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 8537b74a387bb3993387029859c2d9d051c41c724eStephen HinesIntOperand* IntOperand::create(uint64_t pValue) { 86f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines IntOperand* result = g_IntOperandFactory->allocate(); 87f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines new (result) IntOperand(pValue); 88f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return result; 89f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 90f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 9137b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid IntOperand::destroy(IntOperand*& pOperand) { 92f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines g_IntOperandFactory->destroy(pOperand); 93f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines g_IntOperandFactory->deallocate(pOperand); 94f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines pOperand = NULL; 95f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 96f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 9737b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid IntOperand::clear() { 98f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines g_IntOperandFactory->clear(); 99f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 100f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 101f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===----------------------------------------------------------------------===// 102f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// SectOperand 103f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===----------------------------------------------------------------------===// 104f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestypedef GCFactory<SectOperand, MCLD_SECTIONS_PER_INPUT> SectOperandFactory; 105f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinesstatic llvm::ManagedStatic<SectOperandFactory> g_SectOperandFactory; 10637b74a387bb3993387029859c2d9d051c41c724eStephen HinesSectOperand::SectOperand() : Operand(Operand::SECTION) { 107f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 108f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 109f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesSectOperand::SectOperand(const std::string& pName) 11037b74a387bb3993387029859c2d9d051c41c724eStephen Hines : Operand(Operand::SECTION), m_Name(pName) { 111f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 112f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 11337b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid SectOperand::dump() const { 114f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines mcld::outs() << m_Name; 115f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 116f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 11737b74a387bb3993387029859c2d9d051c41c724eStephen HinesSectOperand* SectOperand::create(const std::string& pName) { 118f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines SectOperand* result = g_SectOperandFactory->allocate(); 119f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines new (result) SectOperand(pName); 120f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return result; 121f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 122f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 12337b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid SectOperand::destroy(SectOperand*& pOperand) { 124f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines g_SectOperandFactory->destroy(pOperand); 125f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines g_SectOperandFactory->deallocate(pOperand); 126f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines pOperand = NULL; 127f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 128f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 12937b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid SectOperand::clear() { 130f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines g_SectOperandFactory->clear(); 131f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 132f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 133f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===----------------------------------------------------------------------===// 134f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// SectDescOperand 135f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===----------------------------------------------------------------------===// 13637b74a387bb3993387029859c2d9d051c41c724eStephen Hinestypedef GCFactory<SectDescOperand, MCLD_SECTIONS_PER_INPUT> 13737b74a387bb3993387029859c2d9d051c41c724eStephen Hines SectDescOperandFactory; 138f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinesstatic llvm::ManagedStatic<SectDescOperandFactory> g_SectDescOperandFactory; 139f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesSectDescOperand::SectDescOperand() 14037b74a387bb3993387029859c2d9d051c41c724eStephen Hines : Operand(Operand::SECTION_DESC), m_pOutputDesc(NULL) { 141f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 142f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 143f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesSectDescOperand::SectDescOperand(const SectionMap::Output* pOutputDesc) 14437b74a387bb3993387029859c2d9d051c41c724eStephen Hines : Operand(Operand::SECTION_DESC), m_pOutputDesc(pOutputDesc) { 145f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 146f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 14737b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid SectDescOperand::dump() const { 148f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines assert(m_pOutputDesc != NULL); 149f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines mcld::outs() << m_pOutputDesc->getSection()->name(); 150f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 151f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 15237b74a387bb3993387029859c2d9d051c41c724eStephen HinesSectDescOperand* SectDescOperand::create( 15337b74a387bb3993387029859c2d9d051c41c724eStephen Hines const SectionMap::Output* pOutputDesc) { 154f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines SectDescOperand* result = g_SectDescOperandFactory->allocate(); 155f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines new (result) SectDescOperand(pOutputDesc); 156f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return result; 157f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 158f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 15937b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid SectDescOperand::destroy(SectDescOperand*& pOperand) { 160f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines g_SectDescOperandFactory->destroy(pOperand); 161f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines g_SectDescOperandFactory->deallocate(pOperand); 162f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines pOperand = NULL; 163f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 164f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 16537b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid SectDescOperand::clear() { 166f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines g_SectDescOperandFactory->clear(); 167f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 168f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 169f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===----------------------------------------------------------------------===// 170f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// FragOperand 171f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===----------------------------------------------------------------------===// 172f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestypedef GCFactory<FragOperand, MCLD_SYMBOLS_PER_INPUT> FragOperandFactory; 173f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinesstatic llvm::ManagedStatic<FragOperandFactory> g_FragOperandFactory; 174f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 17537b74a387bb3993387029859c2d9d051c41c724eStephen HinesFragOperand::FragOperand() : Operand(Operand::FRAGMENT), m_pFragment(NULL) { 176f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 177f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 178f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesFragOperand::FragOperand(Fragment& pFragment) 17937b74a387bb3993387029859c2d9d051c41c724eStephen Hines : Operand(Operand::FRAGMENT), m_pFragment(&pFragment) { 180f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 181f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 18237b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid FragOperand::dump() const { 183f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines mcld::outs() << "fragment"; 184f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 185f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 18637b74a387bb3993387029859c2d9d051c41c724eStephen Hinesuint64_t FragOperand::value() const { 187f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return m_pFragment->getOffset() + 188f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines m_pFragment->getParent()->getSection().addr(); 189f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 190f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 19137b74a387bb3993387029859c2d9d051c41c724eStephen HinesFragOperand* FragOperand::create(Fragment& pFragment) { 192f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines FragOperand* result = g_FragOperandFactory->allocate(); 193f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines new (result) FragOperand(pFragment); 194f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return result; 195f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 196f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 19737b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid FragOperand::destroy(FragOperand*& pOperand) { 198f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines g_FragOperandFactory->destroy(pOperand); 199f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines g_FragOperandFactory->deallocate(pOperand); 200f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines pOperand = NULL; 201f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 202f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 20337b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid FragOperand::clear() { 204f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines g_FragOperandFactory->clear(); 205f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 20637b74a387bb3993387029859c2d9d051c41c724eStephen Hines 20737b74a387bb3993387029859c2d9d051c41c724eStephen Hines} // namespace mcld 208