17597212abced110723f2fee985a7d60557c092ecEvan Cheng//===-- ARMMCExpr.cpp - ARM specific MC expression classes ----------------===// 27597212abced110723f2fee985a7d60557c092ecEvan Cheng// 37597212abced110723f2fee985a7d60557c092ecEvan Cheng// The LLVM Compiler Infrastructure 47597212abced110723f2fee985a7d60557c092ecEvan Cheng// 57597212abced110723f2fee985a7d60557c092ecEvan Cheng// This file is distributed under the University of Illinois Open Source 67597212abced110723f2fee985a7d60557c092ecEvan Cheng// License. See LICENSE.TXT for details. 77597212abced110723f2fee985a7d60557c092ecEvan Cheng// 87597212abced110723f2fee985a7d60557c092ecEvan Cheng//===----------------------------------------------------------------------===// 97597212abced110723f2fee985a7d60557c092ecEvan Cheng 107597212abced110723f2fee985a7d60557c092ecEvan Cheng#define DEBUG_TYPE "armmcexpr" 117597212abced110723f2fee985a7d60557c092ecEvan Cheng#include "ARMMCExpr.h" 127597212abced110723f2fee985a7d60557c092ecEvan Cheng#include "llvm/MC/MCAssembler.h" 13d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/MC/MCContext.h" 147597212abced110723f2fee985a7d60557c092ecEvan Chengusing namespace llvm; 157597212abced110723f2fee985a7d60557c092ecEvan Cheng 167597212abced110723f2fee985a7d60557c092ecEvan Chengconst ARMMCExpr* 177597212abced110723f2fee985a7d60557c092ecEvan ChengARMMCExpr::Create(VariantKind Kind, const MCExpr *Expr, 187597212abced110723f2fee985a7d60557c092ecEvan Cheng MCContext &Ctx) { 197597212abced110723f2fee985a7d60557c092ecEvan Cheng return new (Ctx) ARMMCExpr(Kind, Expr); 207597212abced110723f2fee985a7d60557c092ecEvan Cheng} 217597212abced110723f2fee985a7d60557c092ecEvan Cheng 227597212abced110723f2fee985a7d60557c092ecEvan Chengvoid ARMMCExpr::PrintImpl(raw_ostream &OS) const { 237597212abced110723f2fee985a7d60557c092ecEvan Cheng switch (Kind) { 24bc2198133a1836598b54b943420748e75d5dea94Craig Topper default: llvm_unreachable("Invalid kind!"); 257597212abced110723f2fee985a7d60557c092ecEvan Cheng case VK_ARM_HI16: OS << ":upper16:"; break; 267597212abced110723f2fee985a7d60557c092ecEvan Cheng case VK_ARM_LO16: OS << ":lower16:"; break; 277597212abced110723f2fee985a7d60557c092ecEvan Cheng } 287597212abced110723f2fee985a7d60557c092ecEvan Cheng 297597212abced110723f2fee985a7d60557c092ecEvan Cheng const MCExpr *Expr = getSubExpr(); 307597212abced110723f2fee985a7d60557c092ecEvan Cheng if (Expr->getKind() != MCExpr::SymbolRef) 317597212abced110723f2fee985a7d60557c092ecEvan Cheng OS << '('; 327597212abced110723f2fee985a7d60557c092ecEvan Cheng Expr->print(OS); 337597212abced110723f2fee985a7d60557c092ecEvan Cheng if (Expr->getKind() != MCExpr::SymbolRef) 347597212abced110723f2fee985a7d60557c092ecEvan Cheng OS << ')'; 357597212abced110723f2fee985a7d60557c092ecEvan Cheng} 367597212abced110723f2fee985a7d60557c092ecEvan Cheng 377597212abced110723f2fee985a7d60557c092ecEvan Chengbool 387597212abced110723f2fee985a7d60557c092ecEvan ChengARMMCExpr::EvaluateAsRelocatableImpl(MCValue &Res, 397597212abced110723f2fee985a7d60557c092ecEvan Cheng const MCAsmLayout *Layout) const { 407597212abced110723f2fee985a7d60557c092ecEvan Cheng return false; 417597212abced110723f2fee985a7d60557c092ecEvan Cheng} 427597212abced110723f2fee985a7d60557c092ecEvan Cheng 437597212abced110723f2fee985a7d60557c092ecEvan Cheng// FIXME: This basically copies MCObjectStreamer::AddValueSymbols. Perhaps 447597212abced110723f2fee985a7d60557c092ecEvan Cheng// that method should be made public? 457597212abced110723f2fee985a7d60557c092ecEvan Chengstatic void AddValueSymbols_(const MCExpr *Value, MCAssembler *Asm) { 467597212abced110723f2fee985a7d60557c092ecEvan Cheng switch (Value->getKind()) { 477597212abced110723f2fee985a7d60557c092ecEvan Cheng case MCExpr::Target: 48bc2198133a1836598b54b943420748e75d5dea94Craig Topper llvm_unreachable("Can't handle nested target expr!"); 497597212abced110723f2fee985a7d60557c092ecEvan Cheng 507597212abced110723f2fee985a7d60557c092ecEvan Cheng case MCExpr::Constant: 517597212abced110723f2fee985a7d60557c092ecEvan Cheng break; 527597212abced110723f2fee985a7d60557c092ecEvan Cheng 537597212abced110723f2fee985a7d60557c092ecEvan Cheng case MCExpr::Binary: { 547597212abced110723f2fee985a7d60557c092ecEvan Cheng const MCBinaryExpr *BE = cast<MCBinaryExpr>(Value); 557597212abced110723f2fee985a7d60557c092ecEvan Cheng AddValueSymbols_(BE->getLHS(), Asm); 567597212abced110723f2fee985a7d60557c092ecEvan Cheng AddValueSymbols_(BE->getRHS(), Asm); 577597212abced110723f2fee985a7d60557c092ecEvan Cheng break; 587597212abced110723f2fee985a7d60557c092ecEvan Cheng } 597597212abced110723f2fee985a7d60557c092ecEvan Cheng 607597212abced110723f2fee985a7d60557c092ecEvan Cheng case MCExpr::SymbolRef: 617597212abced110723f2fee985a7d60557c092ecEvan Cheng Asm->getOrCreateSymbolData(cast<MCSymbolRefExpr>(Value)->getSymbol()); 627597212abced110723f2fee985a7d60557c092ecEvan Cheng break; 637597212abced110723f2fee985a7d60557c092ecEvan Cheng 647597212abced110723f2fee985a7d60557c092ecEvan Cheng case MCExpr::Unary: 657597212abced110723f2fee985a7d60557c092ecEvan Cheng AddValueSymbols_(cast<MCUnaryExpr>(Value)->getSubExpr(), Asm); 667597212abced110723f2fee985a7d60557c092ecEvan Cheng break; 677597212abced110723f2fee985a7d60557c092ecEvan Cheng } 687597212abced110723f2fee985a7d60557c092ecEvan Cheng} 697597212abced110723f2fee985a7d60557c092ecEvan Cheng 707597212abced110723f2fee985a7d60557c092ecEvan Chengvoid ARMMCExpr::AddValueSymbols(MCAssembler *Asm) const { 717597212abced110723f2fee985a7d60557c092ecEvan Cheng AddValueSymbols_(getSubExpr(), Asm); 727597212abced110723f2fee985a7d60557c092ecEvan Cheng} 73