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