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