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