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