diff options
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCExpr.cpp')
-rw-r--r-- | contrib/llvm-project/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCExpr.cpp | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/contrib/llvm-project/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCExpr.cpp b/contrib/llvm-project/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCExpr.cpp new file mode 100644 index 000000000000..4fa2028ad13e --- /dev/null +++ b/contrib/llvm-project/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCExpr.cpp @@ -0,0 +1,49 @@ +//===-- SystemZMCExpr.cpp - SystemZ specific MC expression classes --------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "SystemZMCExpr.h" +#include "llvm/MC/MCContext.h" +using namespace llvm; + +#define DEBUG_TYPE "systemzmcexpr" + +const SystemZMCExpr *SystemZMCExpr::create(VariantKind Kind, const MCExpr *Expr, + MCContext &Ctx) { + return new (Ctx) SystemZMCExpr(Kind, Expr); +} + +StringRef SystemZMCExpr::getVariantKindName() const { + switch (static_cast<uint32_t>(getKind())) { + case VK_SystemZ_None: + return "A"; + case VK_SystemZ_RCon: + return "R"; + case VK_SystemZ_VCon: + return "V"; + default: + llvm_unreachable("Invalid kind"); + } +} + +void SystemZMCExpr::printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const { + OS << getVariantKindName() << '('; + Expr->print(OS, MAI); + OS << ')'; +} + +bool SystemZMCExpr::evaluateAsRelocatableImpl(MCValue &Res, + const MCAssembler *Asm, + const MCFixup *Fixup) const { + if (!getSubExpr()->evaluateAsRelocatable(Res, Asm, Fixup)) + return false; + + Res = + MCValue::get(Res.getSymA(), Res.getSymB(), Res.getConstant(), getKind()); + + return true; +} |