1 //===-- MipsMCExpr.cpp - Mips specific MC expression classes --------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #define DEBUG_TYPE "mipsmcexpr" 11 #include "MipsMCExpr.h" 12 #include "llvm/MC/MCAssembler.h" 13 #include "llvm/MC/MCContext.h" 14 #include "llvm/MC/MCAsmInfo.h" 15 16 using namespace llvm; 17 18 const MipsMCExpr* 19 MipsMCExpr::Create(VariantKind Kind, const MCExpr *Expr, 20 MCContext &Ctx) { 21 return new (Ctx) MipsMCExpr(Kind, Expr); 22 } 23 24 void MipsMCExpr::PrintImpl(raw_ostream &OS) const { 25 switch (Kind) { 26 default: llvm_unreachable("Invalid kind!"); 27 case VK_Mips_ABS_LO: OS << "%lo"; break; 28 case VK_Mips_ABS_HI: OS << "%hi"; break; 29 } 30 31 OS << '('; 32 Expr->print(OS); 33 OS << ')'; 34 } 35 36 bool 37 MipsMCExpr::EvaluateAsRelocatableImpl(MCValue &Res, 38 const MCAsmLayout *Layout) const { 39 if (!Layout) 40 return false; 41 return getSubExpr()->EvaluateAsRelocatable(Res, *Layout); 42 } 43 44 // FIXME: This basically copies MCObjectStreamer::AddValueSymbols. Perhaps 45 // that method should be made public? 46 static void AddValueSymbolsImpl(const MCExpr *Value, MCAssembler *Asm) { 47 switch (Value->getKind()) { 48 case MCExpr::Target: 49 llvm_unreachable("Can't handle nested target expr!"); 50 51 case MCExpr::Constant: 52 break; 53 54 case MCExpr::Binary: { 55 const MCBinaryExpr *BE = cast<MCBinaryExpr>(Value); 56 AddValueSymbolsImpl(BE->getLHS(), Asm); 57 AddValueSymbolsImpl(BE->getRHS(), Asm); 58 break; 59 } 60 61 case MCExpr::SymbolRef: 62 Asm->getOrCreateSymbolData(cast<MCSymbolRefExpr>(Value)->getSymbol()); 63 break; 64 65 case MCExpr::Unary: 66 AddValueSymbolsImpl(cast<MCUnaryExpr>(Value)->getSubExpr(), Asm); 67 break; 68 } 69 } 70 71 void MipsMCExpr::AddValueSymbols(MCAssembler *Asm) const { 72 AddValueSymbolsImpl(getSubExpr(), Asm); 73 } 74