1//===-- LanaiMCExpr.cpp - Lanai specific MC expression classes ------------===// 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8 9#include "LanaiMCExpr.h" 10#include "llvm/MC/MCAssembler.h" 11#include "llvm/MC/MCContext.h" 12#include "llvm/MC/MCStreamer.h" 13using namespace llvm; 14 15#define DEBUG_TYPE "lanaimcexpr" 16 17const LanaiMCExpr *LanaiMCExpr::create(VariantKind Kind, const MCExpr *Expr, 18 MCContext &Ctx) { 19 return new (Ctx) LanaiMCExpr(Kind, Expr); 20} 21 22void LanaiMCExpr::printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const { 23 if (Kind == VK_Lanai_None) { 24 Expr->print(OS, MAI); 25 return; 26 } 27 28 switch (Kind) { 29 default: 30 llvm_unreachable("Invalid kind!"); 31 case VK_Lanai_ABS_HI: 32 OS << "hi"; 33 break; 34 case VK_Lanai_ABS_LO: 35 OS << "lo"; 36 break; 37 } 38 39 OS << '('; 40 const MCExpr *Expr = getSubExpr(); 41 Expr->print(OS, MAI); 42 OS << ')'; 43} 44 45void LanaiMCExpr::visitUsedExpr(MCStreamer &Streamer) const { 46 Streamer.visitUsedExpr(*getSubExpr()); 47} 48 49bool LanaiMCExpr::evaluateAsRelocatableImpl(MCValue &Res, 50 const MCAsmLayout *Layout, 51 const MCFixup *Fixup) const { 52 if (!getSubExpr()->evaluateAsRelocatable(Res, Layout, Fixup)) 53 return false; 54 55 Res = 56 MCValue::get(Res.getSymA(), Res.getSymB(), Res.getConstant(), getKind()); 57 58 return true; 59} 60