1//===-- LanaiMCExpr.cpp - Lanai 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 "LanaiMCExpr.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 "lanaimcexpr" 17 18const LanaiMCExpr *LanaiMCExpr::create(VariantKind Kind, const MCExpr *Expr, 19 MCContext &Ctx) { 20 return new (Ctx) LanaiMCExpr(Kind, Expr); 21} 22 23void LanaiMCExpr::printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const { 24 if (Kind == VK_Lanai_None) { 25 Expr->print(OS, MAI); 26 return; 27 } 28 29 switch (Kind) { 30 default: 31 llvm_unreachable("Invalid kind!"); 32 case VK_Lanai_ABS_HI: 33 OS << "hi"; 34 break; 35 case VK_Lanai_ABS_LO: 36 OS << "lo"; 37 break; 38 } 39 40 OS << '('; 41 const MCExpr *Expr = getSubExpr(); 42 Expr->print(OS, MAI); 43 OS << ')'; 44} 45 46void LanaiMCExpr::visitUsedExpr(MCStreamer &Streamer) const { 47 Streamer.visitUsedExpr(*getSubExpr()); 48} 49 50bool LanaiMCExpr::evaluateAsRelocatableImpl(MCValue &Res, 51 const MCAsmLayout *Layout, 52 const MCFixup *Fixup) const { 53 if (!getSubExpr()->evaluateAsRelocatable(Res, Layout, Fixup)) 54 return false; 55 56 Res = 57 MCValue::get(Res.getSymA(), Res.getSymB(), Res.getConstant(), getKind()); 58 59 return true; 60} 61