xref: /freebsd/contrib/llvm-project/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCExpr.cpp (revision 02e9120893770924227138ba49df1edb3896112a)
1 //===-- SystemZMCExpr.cpp - SystemZ 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 "SystemZMCExpr.h"
10 #include "llvm/MC/MCContext.h"
11 using namespace llvm;
12 
13 #define DEBUG_TYPE "systemzmcexpr"
14 
15 const SystemZMCExpr *SystemZMCExpr::create(VariantKind Kind, const MCExpr *Expr,
16                                            MCContext &Ctx) {
17   return new (Ctx) SystemZMCExpr(Kind, Expr);
18 }
19 
20 StringRef SystemZMCExpr::getVariantKindName() const {
21   switch (static_cast<uint32_t>(getKind())) {
22   case VK_SystemZ_None:
23     return "A";
24   case VK_SystemZ_RCon:
25     return "R";
26   case VK_SystemZ_VCon:
27     return "V";
28   default:
29     llvm_unreachable("Invalid kind");
30   }
31 }
32 
33 void SystemZMCExpr::printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const {
34   OS << getVariantKindName() << '(';
35   Expr->print(OS, MAI);
36   OS << ')';
37 }
38 
39 bool SystemZMCExpr::evaluateAsRelocatableImpl(MCValue &Res,
40                                               const MCAsmLayout *Layout,
41                                               const MCFixup *Fixup) const {
42   if (!getSubExpr()->evaluateAsRelocatable(Res, Layout, Fixup))
43     return false;
44 
45   Res =
46       MCValue::get(Res.getSymA(), Res.getSymB(), Res.getConstant(), getKind());
47 
48   return true;
49 }
50