Home | History | Annotate | Download | only in MCTargetDesc
      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"
     14 using namespace llvm;
     15 
     16 #define DEBUG_TYPE "lanaimcexpr"
     17 
     18 const LanaiMCExpr *LanaiMCExpr::create(VariantKind Kind, const MCExpr *Expr,
     19                                        MCContext &Ctx) {
     20   return new (Ctx) LanaiMCExpr(Kind, Expr);
     21 }
     22 
     23 void 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 
     46 void LanaiMCExpr::visitUsedExpr(MCStreamer &Streamer) const {
     47   Streamer.visitUsedExpr(*getSubExpr());
     48 }
     49 
     50 bool 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