106c3fb27SDimitry Andric //===-- SystemZMCExpr.cpp - SystemZ specific MC expression classes --------===// 206c3fb27SDimitry Andric // 306c3fb27SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 406c3fb27SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 506c3fb27SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 606c3fb27SDimitry Andric // 706c3fb27SDimitry Andric //===----------------------------------------------------------------------===// 806c3fb27SDimitry Andric 906c3fb27SDimitry Andric #include "SystemZMCExpr.h" 1006c3fb27SDimitry Andric #include "llvm/MC/MCContext.h" 1106c3fb27SDimitry Andric using namespace llvm; 1206c3fb27SDimitry Andric 1306c3fb27SDimitry Andric #define DEBUG_TYPE "systemzmcexpr" 1406c3fb27SDimitry Andric 1506c3fb27SDimitry Andric const SystemZMCExpr *SystemZMCExpr::create(VariantKind Kind, const MCExpr *Expr, 1606c3fb27SDimitry Andric MCContext &Ctx) { 1706c3fb27SDimitry Andric return new (Ctx) SystemZMCExpr(Kind, Expr); 1806c3fb27SDimitry Andric } 1906c3fb27SDimitry Andric 2006c3fb27SDimitry Andric StringRef SystemZMCExpr::getVariantKindName() const { 2106c3fb27SDimitry Andric switch (static_cast<uint32_t>(getKind())) { 2206c3fb27SDimitry Andric case VK_SystemZ_None: 2306c3fb27SDimitry Andric return "A"; 2406c3fb27SDimitry Andric case VK_SystemZ_RCon: 2506c3fb27SDimitry Andric return "R"; 2606c3fb27SDimitry Andric case VK_SystemZ_VCon: 2706c3fb27SDimitry Andric return "V"; 2806c3fb27SDimitry Andric default: 2906c3fb27SDimitry Andric llvm_unreachable("Invalid kind"); 3006c3fb27SDimitry Andric } 3106c3fb27SDimitry Andric } 3206c3fb27SDimitry Andric 3306c3fb27SDimitry Andric void SystemZMCExpr::printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const { 3406c3fb27SDimitry Andric OS << getVariantKindName() << '('; 3506c3fb27SDimitry Andric Expr->print(OS, MAI); 3606c3fb27SDimitry Andric OS << ')'; 3706c3fb27SDimitry Andric } 3806c3fb27SDimitry Andric 3906c3fb27SDimitry Andric bool SystemZMCExpr::evaluateAsRelocatableImpl(MCValue &Res, 40*0fca6ea1SDimitry Andric const MCAssembler *Asm, 4106c3fb27SDimitry Andric const MCFixup *Fixup) const { 42*0fca6ea1SDimitry Andric if (!getSubExpr()->evaluateAsRelocatable(Res, Asm, Fixup)) 4306c3fb27SDimitry Andric return false; 4406c3fb27SDimitry Andric 4506c3fb27SDimitry Andric Res = 4606c3fb27SDimitry Andric MCValue::get(Res.getSymA(), Res.getSymB(), Res.getConstant(), getKind()); 4706c3fb27SDimitry Andric 4806c3fb27SDimitry Andric return true; 4906c3fb27SDimitry Andric } 50