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" 12249423Sdim#include "llvm/MC/MCAssembler.h" 13226584Sdim#include "llvm/MC/MCContext.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) { 24234353Sdim default: llvm_unreachable("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: 48234353Sdim llvm_unreachable("Can't handle nested target expr!"); 49226584Sdim 50226584Sdim case MCExpr::Constant: 51226584Sdim break; 52226584Sdim 53226584Sdim case MCExpr::Binary: { 54226584Sdim const MCBinaryExpr *BE = cast<MCBinaryExpr>(Value); 55226584Sdim AddValueSymbols_(BE->getLHS(), Asm); 56226584Sdim AddValueSymbols_(BE->getRHS(), Asm); 57226584Sdim break; 58226584Sdim } 59226584Sdim 60226584Sdim case MCExpr::SymbolRef: 61226584Sdim Asm->getOrCreateSymbolData(cast<MCSymbolRefExpr>(Value)->getSymbol()); 62226584Sdim break; 63226584Sdim 64226584Sdim case MCExpr::Unary: 65226584Sdim AddValueSymbols_(cast<MCUnaryExpr>(Value)->getSubExpr(), Asm); 66226584Sdim break; 67226584Sdim } 68226584Sdim} 69226584Sdim 70226584Sdimvoid ARMMCExpr::AddValueSymbols(MCAssembler *Asm) const { 71226584Sdim AddValueSymbols_(getSubExpr(), Asm); 72226584Sdim} 73