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