ARMMCExpr.cpp revision 226584
1226584Sdim//===-- ARMMCExpr.cpp - ARM specific MC expression classes ----------------===// 2226584Sdim// 3226584Sdim// The LLVM Compiler Infrastructure 4226584Sdim// 5226584Sdim// This file is distributed under the University of Illinois Open Source 6226584Sdim// License. See LICENSE.TXT for details. 7226584Sdim// 8226584Sdim//===----------------------------------------------------------------------===// 9226584Sdim 10226584Sdim#define DEBUG_TYPE "armmcexpr" 11226584Sdim#include "ARMMCExpr.h" 12226584Sdim#include "llvm/MC/MCContext.h" 13226584Sdim#include "llvm/MC/MCAssembler.h" 14226584Sdimusing namespace llvm; 15226584Sdim 16226584Sdimconst ARMMCExpr* 17226584SdimARMMCExpr::Create(VariantKind Kind, const MCExpr *Expr, 18226584Sdim MCContext &Ctx) { 19226584Sdim return new (Ctx) ARMMCExpr(Kind, Expr); 20226584Sdim} 21226584Sdim 22226584Sdimvoid ARMMCExpr::PrintImpl(raw_ostream &OS) const { 23226584Sdim switch (Kind) { 24226584Sdim default: assert(0 && "Invalid kind!"); 25226584Sdim case VK_ARM_HI16: OS << ":upper16:"; break; 26226584Sdim case VK_ARM_LO16: OS << ":lower16:"; break; 27226584Sdim } 28226584Sdim 29226584Sdim const MCExpr *Expr = getSubExpr(); 30226584Sdim if (Expr->getKind() != MCExpr::SymbolRef) 31226584Sdim OS << '('; 32226584Sdim Expr->print(OS); 33226584Sdim if (Expr->getKind() != MCExpr::SymbolRef) 34226584Sdim OS << ')'; 35226584Sdim} 36226584Sdim 37226584Sdimbool 38226584SdimARMMCExpr::EvaluateAsRelocatableImpl(MCValue &Res, 39226584Sdim const MCAsmLayout *Layout) const { 40226584Sdim return false; 41226584Sdim} 42226584Sdim 43226584Sdim// FIXME: This basically copies MCObjectStreamer::AddValueSymbols. Perhaps 44226584Sdim// that method should be made public? 45226584Sdimstatic void AddValueSymbols_(const MCExpr *Value, MCAssembler *Asm) { 46226584Sdim switch (Value->getKind()) { 47226584Sdim case MCExpr::Target: 48226584Sdim assert(0 && "Can't handle nested target expr!"); 49226584Sdim break; 50226584Sdim 51226584Sdim case MCExpr::Constant: 52226584Sdim break; 53226584Sdim 54226584Sdim case MCExpr::Binary: { 55226584Sdim const MCBinaryExpr *BE = cast<MCBinaryExpr>(Value); 56226584Sdim AddValueSymbols_(BE->getLHS(), Asm); 57226584Sdim AddValueSymbols_(BE->getRHS(), Asm); 58226584Sdim break; 59226584Sdim } 60226584Sdim 61226584Sdim case MCExpr::SymbolRef: 62226584Sdim Asm->getOrCreateSymbolData(cast<MCSymbolRefExpr>(Value)->getSymbol()); 63226584Sdim break; 64226584Sdim 65226584Sdim case MCExpr::Unary: 66226584Sdim AddValueSymbols_(cast<MCUnaryExpr>(Value)->getSubExpr(), Asm); 67226584Sdim break; 68226584Sdim } 69226584Sdim} 70226584Sdim 71226584Sdimvoid ARMMCExpr::AddValueSymbols(MCAssembler *Asm) const { 72226584Sdim AddValueSymbols_(getSubExpr(), Asm); 73226584Sdim} 74