UnaryOp.cpp revision f33f6de54db174aa679a4b6d1e040d37e95541c0
1f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===- UnaryOp.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//===----------------------------------------------------------------------===//
9f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <mcld/Script/UnaryOp.h>
10f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <mcld/Script/Operand.h>
11f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <mcld/Object/SectionMap.h>
12f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <mcld/LD/LDSection.h>
13f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <mcld/Module.h>
14f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <llvm/Support/Casting.h>
15f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <cassert>
16f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
17f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinesusing namespace mcld;
18f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===----------------------------------------------------------------------===//
19f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// UnaryOp
20f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===----------------------------------------------------------------------===//
21f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<>
22f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesIntOperand* UnaryOp<Operator::UNARY_PLUS>::eval(const Module& pModule,
23f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines                                                const TargetLDBackend& pBackend)
24f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{
25f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  IntOperand* res = result();
26f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  res->setValue(+ m_pOperand->value());
27f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return res;
28f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
29f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
30f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<>
31f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesIntOperand*
32f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesUnaryOp<Operator::UNARY_MINUS>::eval(const Module& pModule,
33f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines                                     const TargetLDBackend& pBackend)
34f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{
35f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  IntOperand* res = result();
36f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  res->setValue(- m_pOperand->value());
37f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return res;
38f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
39f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
40f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<>
41f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesIntOperand*
42f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesUnaryOp<Operator::LOGICAL_NOT>::eval(const Module& pModule,
43f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines                                     const TargetLDBackend& pBackend)
44f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{
45f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  IntOperand* res = result();
46f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  res->setValue(! m_pOperand->value());
47f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return res;
48f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
49f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
50f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<>
51f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesIntOperand*
52f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesUnaryOp<Operator::BITWISE_NOT>::eval(const Module& pModule,
53f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines                                     const TargetLDBackend& pBackend)
54f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{
55f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  IntOperand* res = result();
56f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  res->setValue(~ m_pOperand->value());
57f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return res;
58f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
59f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
60f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<>
61f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesIntOperand* UnaryOp<Operator::ABSOLUTE>::eval(const Module& pModule,
62f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines                                              const TargetLDBackend& pBackend)
63f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{
64f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  // TODO
65f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  assert(0);
66f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return result();
67f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
68f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
69f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<>
70f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesIntOperand* UnaryOp<Operator::ADDR>::eval(const Module& pModule,
71f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines                                          const TargetLDBackend& pBackend)
72f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{
73f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  IntOperand* res = result();
74f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  const LDSection* sect = NULL;
75f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  switch (m_pOperand->type()) {
76f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  case Operand::SECTION:
77f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    sect = pModule.getSection(llvm::cast<SectOperand>(m_pOperand)->name());
78f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    break;
79f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  case Operand::SECTION_DESC:
80f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    sect = llvm::cast<SectDescOperand>(m_pOperand)->outputDesc()->getSection();
81f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    break;
82f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  default:
83f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    assert(0);
84f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    break;
85f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  }
86f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  assert(sect != NULL);
87f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  res->setValue(sect->addr());
88f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return res;
89f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
90f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
91f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<>
92f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesIntOperand* UnaryOp<Operator::ALIGNOF>::eval(const Module& pModule,
93f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines                                             const TargetLDBackend& pBackend)
94f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{
95f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  IntOperand* res = result();
96f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  const LDSection* sect = NULL;
97f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  switch (m_pOperand->type()) {
98f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  case Operand::SECTION:
99f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    sect = pModule.getSection(llvm::cast<SectOperand>(m_pOperand)->name());
100f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    break;
101f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  case Operand::SECTION_DESC:
102f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    sect = llvm::cast<SectDescOperand>(m_pOperand)->outputDesc()->getSection();
103f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    break;
104f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  default:
105f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    assert(0);
106f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    break;
107f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  }
108f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  assert(sect != NULL);
109f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  res->setValue(sect->align());
110f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return res;
111f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
112f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
113f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<>
114f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesIntOperand*
115f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesUnaryOp<Operator::DATA_SEGMENT_END>::eval(const Module& pModule,
116f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines                                          const TargetLDBackend& pBackend)
117f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{
118f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  IntOperand* res = result();
119f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  res->setValue(m_pOperand->value());
120f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return res;
121f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
122f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
123f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<>
124f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesIntOperand* UnaryOp<Operator::DEFINED>::eval(const Module& pModule,
125f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines                                             const TargetLDBackend& pBackend)
126f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{
127f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  // TODO
128f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  assert(0);
129f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return result();
130f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
131f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
132f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<>
133f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesIntOperand* UnaryOp<Operator::LENGTH>::eval(const Module& pModule,
134f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines                                            const TargetLDBackend& pBackend)
135f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{
136f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  // TODO
137f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  assert(0);
138f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return result();
139f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
140f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
141f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<>
142f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesIntOperand* UnaryOp<Operator::LOADADDR>::eval(const Module& pModule,
143f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines                                              const TargetLDBackend& pBackend)
144f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{
145f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  // TODO
146f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  assert(0);
147f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return result();
148f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
149f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
150f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<>
151f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesIntOperand* UnaryOp<Operator::NEXT>::eval(const Module& pModule,
152f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines                                          const TargetLDBackend& pBackend)
153f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{
154f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  // TODO
155f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  assert(0);
156f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return result();
157f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
158f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
159f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<>
160f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesIntOperand* UnaryOp<Operator::ORIGIN>::eval(const Module& pModule,
161f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines                                            const TargetLDBackend& pBackend)
162f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{
163f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  // TODO
164f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  assert(0);
165f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return result();
166f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
167f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
168f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<>
169f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesIntOperand* UnaryOp<Operator::SIZEOF>::eval(const Module& pModule,
170f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines                                            const TargetLDBackend& pBackend)
171f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{
172f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  IntOperand* res = result();
173f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  const LDSection* sect = NULL;
174f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  switch (m_pOperand->type()) {
175f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  case Operand::SECTION:
176f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    sect = pModule.getSection(llvm::cast<SectOperand>(m_pOperand)->name());
177f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    break;
178f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  case Operand::SECTION_DESC:
179f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    sect = llvm::cast<SectDescOperand>(m_pOperand)->outputDesc()->getSection();
180f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    break;
181f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  default:
182f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    assert(0);
183f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    break;
184f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  }
185f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  assert(sect != NULL);
186f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  res->setValue(sect->size());
187f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return res;
188f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
189