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