xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/ARM/MCTargetDesc/ARMMCExpr.cpp (revision 06c3fb2749bda94cb5201f81ffdb8fa6c3161b2e)
10b57cec5SDimitry Andric //===-- ARMMCExpr.cpp - ARM specific MC expression classes ----------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric 
90b57cec5SDimitry Andric #include "ARMMCExpr.h"
100b57cec5SDimitry Andric #include "llvm/MC/MCContext.h"
110b57cec5SDimitry Andric #include "llvm/MC/MCStreamer.h"
120b57cec5SDimitry Andric using namespace llvm;
130b57cec5SDimitry Andric 
140b57cec5SDimitry Andric #define DEBUG_TYPE "armmcexpr"
150b57cec5SDimitry Andric 
160b57cec5SDimitry Andric const ARMMCExpr*
create(VariantKind Kind,const MCExpr * Expr,MCContext & Ctx)170b57cec5SDimitry Andric ARMMCExpr::create(VariantKind Kind, const MCExpr *Expr,
180b57cec5SDimitry Andric                        MCContext &Ctx) {
190b57cec5SDimitry Andric   return new (Ctx) ARMMCExpr(Kind, Expr);
200b57cec5SDimitry Andric }
210b57cec5SDimitry Andric 
printImpl(raw_ostream & OS,const MCAsmInfo * MAI) const220b57cec5SDimitry Andric void ARMMCExpr::printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const {
230b57cec5SDimitry Andric   switch (Kind) {
240b57cec5SDimitry Andric   default: llvm_unreachable("Invalid kind!");
25*06c3fb27SDimitry Andric   case VK_ARM_HI16:
26*06c3fb27SDimitry Andric     OS << ":upper16:";
27*06c3fb27SDimitry Andric     break;
28*06c3fb27SDimitry Andric   case VK_ARM_LO16:
29*06c3fb27SDimitry Andric     OS << ":lower16:";
30*06c3fb27SDimitry Andric     break;
31*06c3fb27SDimitry Andric   case VK_ARM_HI_8_15:
32*06c3fb27SDimitry Andric     OS << ":upper8_15:";
33*06c3fb27SDimitry Andric     break;
34*06c3fb27SDimitry Andric   case VK_ARM_HI_0_7:
35*06c3fb27SDimitry Andric     OS << ":upper0_7:";
36*06c3fb27SDimitry Andric     break;
37*06c3fb27SDimitry Andric   case VK_ARM_LO_8_15:
38*06c3fb27SDimitry Andric     OS << ":lower8_15:";
39*06c3fb27SDimitry Andric     break;
40*06c3fb27SDimitry Andric   case VK_ARM_LO_0_7:
41*06c3fb27SDimitry Andric     OS << ":lower0_7:";
42*06c3fb27SDimitry Andric     break;
430b57cec5SDimitry Andric   }
440b57cec5SDimitry Andric 
450b57cec5SDimitry Andric   const MCExpr *Expr = getSubExpr();
460b57cec5SDimitry Andric   if (Expr->getKind() != MCExpr::SymbolRef)
470b57cec5SDimitry Andric     OS << '(';
480b57cec5SDimitry Andric   Expr->print(OS, MAI);
490b57cec5SDimitry Andric   if (Expr->getKind() != MCExpr::SymbolRef)
500b57cec5SDimitry Andric     OS << ')';
510b57cec5SDimitry Andric }
520b57cec5SDimitry Andric 
visitUsedExpr(MCStreamer & Streamer) const530b57cec5SDimitry Andric void ARMMCExpr::visitUsedExpr(MCStreamer &Streamer) const {
540b57cec5SDimitry Andric   Streamer.visitUsedExpr(*getSubExpr());
550b57cec5SDimitry Andric }
56