ARMMCExpr.cpp revision 4c5e43da7792f75567b693105cc53e3f1992ad98
1//===-- ARMMCExpr.cpp - ARM specific MC expression classes ----------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "ARMMCExpr.h"
11#include "llvm/MC/MCAssembler.h"
12#include "llvm/MC/MCContext.h"
13#include "llvm/MC/MCStreamer.h"
14using namespace llvm;
15
16#define DEBUG_TYPE "armmcexpr"
17
18const ARMMCExpr*
19ARMMCExpr::Create(VariantKind Kind, const MCExpr *Expr,
20                       MCContext &Ctx) {
21  return new (Ctx) ARMMCExpr(Kind, Expr);
22}
23
24void ARMMCExpr::PrintImpl(raw_ostream &OS) const {
25  switch (Kind) {
26  default: llvm_unreachable("Invalid kind!");
27  case VK_ARM_HI16: OS << ":upper16:"; break;
28  case VK_ARM_LO16: OS << ":lower16:"; break;
29  }
30
31  const MCExpr *Expr = getSubExpr();
32  if (Expr->getKind() != MCExpr::SymbolRef)
33    OS << '(';
34  Expr->print(OS);
35  if (Expr->getKind() != MCExpr::SymbolRef)
36    OS << ')';
37}
38
39void ARMMCExpr::visitUsedExpr(MCStreamer &Streamer) const {
40  Streamer.visitUsedExpr(*getSubExpr());
41}
42