|  | //===-- LanaiMCExpr.cpp - Lanai specific MC expression classes ------------===// | 
|  | // | 
|  | //                     The LLVM Compiler Infrastructure | 
|  | // | 
|  | // This file is distributed under the University of Illinois Open Source | 
|  | // License. See LICENSE.TXT for details. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #include "LanaiMCExpr.h" | 
|  | #include "llvm/MC/MCAssembler.h" | 
|  | #include "llvm/MC/MCContext.h" | 
|  | #include "llvm/MC/MCStreamer.h" | 
|  | using namespace llvm; | 
|  |  | 
|  | #define DEBUG_TYPE "lanaimcexpr" | 
|  |  | 
|  | const LanaiMCExpr *LanaiMCExpr::create(VariantKind Kind, const MCExpr *Expr, | 
|  | MCContext &Ctx) { | 
|  | return new (Ctx) LanaiMCExpr(Kind, Expr); | 
|  | } | 
|  |  | 
|  | void LanaiMCExpr::printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const { | 
|  | if (Kind == VK_Lanai_None) { | 
|  | Expr->print(OS, MAI); | 
|  | return; | 
|  | } | 
|  |  | 
|  | switch (Kind) { | 
|  | default: | 
|  | llvm_unreachable("Invalid kind!"); | 
|  | case VK_Lanai_ABS_HI: | 
|  | OS << "hi"; | 
|  | break; | 
|  | case VK_Lanai_ABS_LO: | 
|  | OS << "lo"; | 
|  | break; | 
|  | } | 
|  |  | 
|  | OS << '('; | 
|  | const MCExpr *Expr = getSubExpr(); | 
|  | Expr->print(OS, MAI); | 
|  | OS << ')'; | 
|  | } | 
|  |  | 
|  | void LanaiMCExpr::visitUsedExpr(MCStreamer &Streamer) const { | 
|  | Streamer.visitUsedExpr(*getSubExpr()); | 
|  | } | 
|  |  | 
|  | bool LanaiMCExpr::evaluateAsRelocatableImpl(MCValue &Res, | 
|  | const MCAsmLayout *Layout, | 
|  | const MCFixup *Fixup) const { | 
|  | if (!getSubExpr()->evaluateAsRelocatable(Res, Layout, Fixup)) | 
|  | return false; | 
|  |  | 
|  | Res = | 
|  | MCValue::get(Res.getSymA(), Res.getSymB(), Res.getConstant(), getKind()); | 
|  |  | 
|  | return true; | 
|  | } |