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//===----------------------------------------------------------------------===//
937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/UnaryOp.h"
1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines
1137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/LDSection.h"
1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Object/SectionMap.h"
1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/Operand.h"
1437b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Module.h"
1537b74a387bb3993387029859c2d9d051c41c724eStephen Hines
16f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <llvm/Support/Casting.h>
1737b74a387bb3993387029859c2d9d051c41c724eStephen Hines
18f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <cassert>
19f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
2037b74a387bb3993387029859c2d9d051c41c724eStephen Hinesnamespace mcld {
2137b74a387bb3993387029859c2d9d051c41c724eStephen Hines
22f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===----------------------------------------------------------------------===//
23f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// UnaryOp
24f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===----------------------------------------------------------------------===//
2537b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
2637b74a387bb3993387029859c2d9d051c41c724eStephen HinesIntOperand* UnaryOp<Operator::UNARY_PLUS>::eval(
2737b74a387bb3993387029859c2d9d051c41c724eStephen Hines    const Module& pModule,
2837b74a387bb3993387029859c2d9d051c41c724eStephen Hines    const TargetLDBackend& pBackend) {
29f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  IntOperand* res = result();
3037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  res->setValue(+m_pOperand->value());
31f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return res;
32f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
33f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
3437b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
3537b74a387bb3993387029859c2d9d051c41c724eStephen HinesIntOperand* UnaryOp<Operator::UNARY_MINUS>::eval(
3637b74a387bb3993387029859c2d9d051c41c724eStephen Hines    const Module& pModule,
3737b74a387bb3993387029859c2d9d051c41c724eStephen Hines    const TargetLDBackend& pBackend) {
38f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  IntOperand* res = result();
3937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  res->setValue(-m_pOperand->value());
40f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return res;
41f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
42f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
4337b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
4437b74a387bb3993387029859c2d9d051c41c724eStephen HinesIntOperand* UnaryOp<Operator::LOGICAL_NOT>::eval(
4537b74a387bb3993387029859c2d9d051c41c724eStephen Hines    const Module& pModule,
4637b74a387bb3993387029859c2d9d051c41c724eStephen Hines    const TargetLDBackend& pBackend) {
47f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  IntOperand* res = result();
4837b74a387bb3993387029859c2d9d051c41c724eStephen Hines  res->setValue(!m_pOperand->value());
49f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return res;
50f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
51f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
5237b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
5337b74a387bb3993387029859c2d9d051c41c724eStephen HinesIntOperand* UnaryOp<Operator::BITWISE_NOT>::eval(
5437b74a387bb3993387029859c2d9d051c41c724eStephen Hines    const Module& pModule,
5537b74a387bb3993387029859c2d9d051c41c724eStephen Hines    const TargetLDBackend& pBackend) {
56f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  IntOperand* res = result();
5737b74a387bb3993387029859c2d9d051c41c724eStephen Hines  res->setValue(~m_pOperand->value());
58f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return res;
59f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
60f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
6137b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
62f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesIntOperand* UnaryOp<Operator::ABSOLUTE>::eval(const Module& pModule,
6337b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                              const TargetLDBackend& pBackend) {
64f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  // TODO
65f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  assert(0);
66f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return result();
67f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
68f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
6937b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
70f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesIntOperand* UnaryOp<Operator::ADDR>::eval(const Module& pModule,
7137b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                          const TargetLDBackend& pBackend) {
72f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  IntOperand* res = result();
73f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  const LDSection* sect = NULL;
74f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  switch (m_pOperand->type()) {
7537b74a387bb3993387029859c2d9d051c41c724eStephen Hines    case Operand::SECTION:
7637b74a387bb3993387029859c2d9d051c41c724eStephen Hines      sect = pModule.getSection(llvm::cast<SectOperand>(m_pOperand)->name());
7737b74a387bb3993387029859c2d9d051c41c724eStephen Hines      break;
7837b74a387bb3993387029859c2d9d051c41c724eStephen Hines    case Operand::SECTION_DESC:
7937b74a387bb3993387029859c2d9d051c41c724eStephen Hines      sect =
8037b74a387bb3993387029859c2d9d051c41c724eStephen Hines          llvm::cast<SectDescOperand>(m_pOperand)->outputDesc()->getSection();
8137b74a387bb3993387029859c2d9d051c41c724eStephen Hines      break;
8237b74a387bb3993387029859c2d9d051c41c724eStephen Hines    default:
8337b74a387bb3993387029859c2d9d051c41c724eStephen Hines      assert(0);
8437b74a387bb3993387029859c2d9d051c41c724eStephen Hines      break;
85f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  }
86f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  assert(sect != NULL);
87f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  res->setValue(sect->addr());
88f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return res;
89f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
90f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
9137b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
92f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesIntOperand* UnaryOp<Operator::ALIGNOF>::eval(const Module& pModule,
9337b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                             const TargetLDBackend& pBackend) {
94f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  IntOperand* res = result();
95f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  const LDSection* sect = NULL;
96f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  switch (m_pOperand->type()) {
9737b74a387bb3993387029859c2d9d051c41c724eStephen Hines    case Operand::SECTION:
9837b74a387bb3993387029859c2d9d051c41c724eStephen Hines      sect = pModule.getSection(llvm::cast<SectOperand>(m_pOperand)->name());
9937b74a387bb3993387029859c2d9d051c41c724eStephen Hines      break;
10037b74a387bb3993387029859c2d9d051c41c724eStephen Hines    case Operand::SECTION_DESC:
10137b74a387bb3993387029859c2d9d051c41c724eStephen Hines      sect =
10237b74a387bb3993387029859c2d9d051c41c724eStephen Hines          llvm::cast<SectDescOperand>(m_pOperand)->outputDesc()->getSection();
10337b74a387bb3993387029859c2d9d051c41c724eStephen Hines      break;
10437b74a387bb3993387029859c2d9d051c41c724eStephen Hines    default:
10537b74a387bb3993387029859c2d9d051c41c724eStephen Hines      assert(0);
10637b74a387bb3993387029859c2d9d051c41c724eStephen Hines      break;
107f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  }
108f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  assert(sect != NULL);
109f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  res->setValue(sect->align());
110f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return res;
111f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
112f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
11337b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
11437b74a387bb3993387029859c2d9d051c41c724eStephen HinesIntOperand* UnaryOp<Operator::DATA_SEGMENT_END>::eval(
11537b74a387bb3993387029859c2d9d051c41c724eStephen Hines    const Module& pModule,
11637b74a387bb3993387029859c2d9d051c41c724eStephen Hines    const TargetLDBackend& pBackend) {
117f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  IntOperand* res = result();
118f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  res->setValue(m_pOperand->value());
119f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return res;
120f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
121f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
12237b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
123f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesIntOperand* UnaryOp<Operator::DEFINED>::eval(const Module& pModule,
12437b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                             const TargetLDBackend& pBackend) {
125f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  // TODO
126f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  assert(0);
127f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return result();
128f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
129f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
13037b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
131f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesIntOperand* UnaryOp<Operator::LENGTH>::eval(const Module& pModule,
13237b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                            const TargetLDBackend& pBackend) {
133f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  // TODO
134f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  assert(0);
135f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return result();
136f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
137f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
13837b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
139f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesIntOperand* UnaryOp<Operator::LOADADDR>::eval(const Module& pModule,
14037b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                              const TargetLDBackend& pBackend) {
141f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  // TODO
142f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  assert(0);
143f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return result();
144f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
145f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
14637b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
147f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesIntOperand* UnaryOp<Operator::NEXT>::eval(const Module& pModule,
14837b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                          const TargetLDBackend& pBackend) {
149f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  // TODO
150f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  assert(0);
151f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return result();
152f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
153f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
15437b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
155f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesIntOperand* UnaryOp<Operator::ORIGIN>::eval(const Module& pModule,
15637b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                            const TargetLDBackend& pBackend) {
157f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  // TODO
158f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  assert(0);
159f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return result();
160f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
161f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
16237b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
163f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesIntOperand* UnaryOp<Operator::SIZEOF>::eval(const Module& pModule,
16437b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                            const TargetLDBackend& pBackend) {
165f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  IntOperand* res = result();
166f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  const LDSection* sect = NULL;
167f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  switch (m_pOperand->type()) {
16837b74a387bb3993387029859c2d9d051c41c724eStephen Hines    case Operand::SECTION:
16937b74a387bb3993387029859c2d9d051c41c724eStephen Hines      sect = pModule.getSection(llvm::cast<SectOperand>(m_pOperand)->name());
17037b74a387bb3993387029859c2d9d051c41c724eStephen Hines      break;
17137b74a387bb3993387029859c2d9d051c41c724eStephen Hines    case Operand::SECTION_DESC:
17237b74a387bb3993387029859c2d9d051c41c724eStephen Hines      sect =
17337b74a387bb3993387029859c2d9d051c41c724eStephen Hines          llvm::cast<SectDescOperand>(m_pOperand)->outputDesc()->getSection();
17437b74a387bb3993387029859c2d9d051c41c724eStephen Hines      break;
17537b74a387bb3993387029859c2d9d051c41c724eStephen Hines    default:
17637b74a387bb3993387029859c2d9d051c41c724eStephen Hines      assert(0);
17737b74a387bb3993387029859c2d9d051c41c724eStephen Hines      break;
178f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  }
179f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  assert(sect != NULL);
180f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  res->setValue(sect->size());
181f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return res;
182f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
18337b74a387bb3993387029859c2d9d051c41c724eStephen Hines
18437b74a387bb3993387029859c2d9d051c41c724eStephen Hines}  // namespace mcld
185