ARMMCExpr.cpp revision 234353
1247738Sbapt//===-- ARMMCExpr.cpp - ARM specific MC expression classes ----------------===// 2247738Sbapt// 3247738Sbapt// The LLVM Compiler Infrastructure 4247738Sbapt// 5247738Sbapt// This file is distributed under the University of Illinois Open Source 6247738Sbapt// License. See LICENSE.TXT for details. 7247738Sbapt// 8247738Sbapt//===----------------------------------------------------------------------===// 9247738Sbapt 10247738Sbapt#define DEBUG_TYPE "armmcexpr" 11247738Sbapt#include "ARMMCExpr.h" 12247738Sbapt#include "llvm/MC/MCContext.h" 13247738Sbapt#include "llvm/MC/MCAssembler.h" 14247738Sbaptusing namespace llvm; 15247738Sbapt 16247738Sbaptconst ARMMCExpr* 17247738SbaptARMMCExpr::Create(VariantKind Kind, const MCExpr *Expr, 18247738Sbapt MCContext &Ctx) { 19247738Sbapt return new (Ctx) ARMMCExpr(Kind, Expr); 20247738Sbapt} 21247738Sbapt 22247738Sbaptvoid ARMMCExpr::PrintImpl(raw_ostream &OS) const { 23247738Sbapt switch (Kind) { 24247738Sbapt default: llvm_unreachable("Invalid kind!"); 25247738Sbapt case VK_ARM_HI16: OS << ":upper16:"; break; 26247738Sbapt case VK_ARM_LO16: OS << ":lower16:"; break; 27247738Sbapt } 28247738Sbapt 29247738Sbapt const MCExpr *Expr = getSubExpr(); 30247738Sbapt if (Expr->getKind() != MCExpr::SymbolRef) 31247738Sbapt OS << '('; 32247738Sbapt Expr->print(OS); 33247738Sbapt if (Expr->getKind() != MCExpr::SymbolRef) 34247738Sbapt OS << ')'; 35247738Sbapt} 36247738Sbapt 37247738Sbaptbool 38247738SbaptARMMCExpr::EvaluateAsRelocatableImpl(MCValue &Res, 39247738Sbapt const MCAsmLayout *Layout) const { 40247738Sbapt return false; 41247738Sbapt} 42247738Sbapt 43247738Sbapt// FIXME: This basically copies MCObjectStreamer::AddValueSymbols. Perhaps 44247738Sbapt// that method should be made public? 45247738Sbaptstatic void AddValueSymbols_(const MCExpr *Value, MCAssembler *Asm) { 46247738Sbapt switch (Value->getKind()) { 47247738Sbapt case MCExpr::Target: 48247738Sbapt llvm_unreachable("Can't handle nested target expr!"); 49247738Sbapt 50247738Sbapt case MCExpr::Constant: 51247738Sbapt break; 52247738Sbapt 53247738Sbapt case MCExpr::Binary: { 54247738Sbapt const MCBinaryExpr *BE = cast<MCBinaryExpr>(Value); 55247738Sbapt AddValueSymbols_(BE->getLHS(), Asm); 56247738Sbapt AddValueSymbols_(BE->getRHS(), Asm); 57247738Sbapt break; 58247738Sbapt } 59247738Sbapt 60247738Sbapt case MCExpr::SymbolRef: 61247738Sbapt Asm->getOrCreateSymbolData(cast<MCSymbolRefExpr>(Value)->getSymbol()); 62247738Sbapt break; 63247738Sbapt 64247738Sbapt case MCExpr::Unary: 65247738Sbapt AddValueSymbols_(cast<MCUnaryExpr>(Value)->getSubExpr(), Asm); 66247738Sbapt break; 67247738Sbapt } 68247738Sbapt} 69247738Sbapt 70247738Sbaptvoid ARMMCExpr::AddValueSymbols(MCAssembler *Asm) const { 71247738Sbapt AddValueSymbols_(getSubExpr(), Asm); 72247738Sbapt} 73247738Sbapt