ARMMCExpr.cpp revision dce4a407a24b04eebc6a376f8e62b41aaa7b071f
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" 13using namespace llvm; 14 15#define DEBUG_TYPE "armmcexpr" 16 17const ARMMCExpr* 18ARMMCExpr::Create(VariantKind Kind, const MCExpr *Expr, 19 MCContext &Ctx) { 20 return new (Ctx) ARMMCExpr(Kind, Expr); 21} 22 23void ARMMCExpr::PrintImpl(raw_ostream &OS) const { 24 switch (Kind) { 25 default: llvm_unreachable("Invalid kind!"); 26 case VK_ARM_HI16: OS << ":upper16:"; break; 27 case VK_ARM_LO16: OS << ":lower16:"; break; 28 } 29 30 const MCExpr *Expr = getSubExpr(); 31 if (Expr->getKind() != MCExpr::SymbolRef) 32 OS << '('; 33 Expr->print(OS); 34 if (Expr->getKind() != MCExpr::SymbolRef) 35 OS << ')'; 36} 37 38bool 39ARMMCExpr::EvaluateAsRelocatableImpl(MCValue &Res, 40 const MCAsmLayout *Layout) const { 41 return false; 42} 43 44// FIXME: This basically copies MCObjectStreamer::AddValueSymbols. Perhaps 45// that method should be made public? 46static void AddValueSymbols_(const MCExpr *Value, MCAssembler *Asm) { 47 switch (Value->getKind()) { 48 case MCExpr::Target: 49 llvm_unreachable("Can't handle nested target expr!"); 50 51 case MCExpr::Constant: 52 break; 53 54 case MCExpr::Binary: { 55 const MCBinaryExpr *BE = cast<MCBinaryExpr>(Value); 56 AddValueSymbols_(BE->getLHS(), Asm); 57 AddValueSymbols_(BE->getRHS(), Asm); 58 break; 59 } 60 61 case MCExpr::SymbolRef: 62 Asm->getOrCreateSymbolData(cast<MCSymbolRefExpr>(Value)->getSymbol()); 63 break; 64 65 case MCExpr::Unary: 66 AddValueSymbols_(cast<MCUnaryExpr>(Value)->getSubExpr(), Asm); 67 break; 68 } 69} 70 71void ARMMCExpr::AddValueSymbols(MCAssembler *Asm) const { 72 AddValueSymbols_(getSubExpr(), Asm); 73} 74