LLVM 20.0.0git
ARCMCInstLower.cpp
Go to the documentation of this file.
1//===- ARCMCInstLower.cpp - ARC MachineInstr to MCInst ----------*- C++ -*-===//
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/// \file
10/// This file contains code to lower ARC MachineInstrs to their
11/// corresponding MCInst records.
12///
13//===----------------------------------------------------------------------===//
14
15#include "ARCMCInstLower.h"
20#include "llvm/MC/MCContext.h"
21#include "llvm/MC/MCExpr.h"
22#include "llvm/MC/MCInst.h"
23
24using namespace llvm;
25
27 : Ctx(C), Printer(AsmPrinter) {}
28
29MCOperand ARCMCInstLower::LowerSymbolOperand(const MachineOperand &MO,
30 MachineOperandType MOTy,
31 unsigned Offset) const {
33 const MCSymbol *Symbol;
34
35 switch (MOTy) {
37 Symbol = MO.getMBB()->getSymbol();
38 break;
40 Symbol = Printer.getSymbol(MO.getGlobal());
41 Offset += MO.getOffset();
42 break;
44 Symbol = Printer.GetBlockAddressSymbol(MO.getBlockAddress());
45 Offset += MO.getOffset();
46 break;
48 Symbol = Printer.GetExternalSymbolSymbol(MO.getSymbolName());
49 Offset += MO.getOffset();
50 break;
52 Symbol = Printer.GetJTISymbol(MO.getIndex());
53 break;
55 Symbol = Printer.GetCPISymbol(MO.getIndex());
56 Offset += MO.getOffset();
57 break;
58 default:
59 llvm_unreachable("<unknown operand type>");
60 }
61
62 assert(Symbol && "Symbol creation failed.\n");
63 const MCSymbolRefExpr *MCSym = MCSymbolRefExpr::create(Symbol, Kind, *Ctx);
64
65 if (!Offset)
66 return MCOperand::createExpr(MCSym);
67
68 // Assume offset is never negative.
69 assert(Offset > 0);
70
71 const MCConstantExpr *OffsetExpr = MCConstantExpr::create(Offset, *Ctx);
72 const MCBinaryExpr *Add = MCBinaryExpr::createAdd(MCSym, OffsetExpr, *Ctx);
74}
75
77 unsigned Offset) const {
78 MachineOperandType MOTy = MO.getType();
79
80 switch (MOTy) {
81 default:
82 llvm_unreachable("unknown operand type");
84 // Ignore all implicit register operands.
85 if (MO.isImplicit())
86 break;
87 return MCOperand::createReg(MO.getReg());
89 return MCOperand::createImm(MO.getImm() + Offset);
96 return LowerSymbolOperand(MO, MOTy, Offset);
98 break;
99 }
100
101 return {};
102}
103
104void ARCMCInstLower::Lower(const MachineInstr *MI, MCInst &OutMI) const {
105 OutMI.setOpcode(MI->getOpcode());
106
107 for (const MachineOperand &MO : MI->operands()) {
108 MCOperand MCOp = LowerOperand(MO);
109
110 if (MCOp.isValid())
111 OutMI.addOperand(MCOp);
112 }
113}
dxil pretty DXIL Metadata Pretty Printer
IRTranslator LLVM IR MI
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
ARCMCInstLower(MCContext *C, AsmPrinter &asmprinter)
void Lower(const MachineInstr *MI, MCInst &OutMI) const
MCOperand LowerOperand(const MachineOperand &MO, unsigned offset=0) const
This class is intended to be used as a driving class for all asm writers.
Definition: AsmPrinter.h:86
MCSymbol * getSymbol(const GlobalValue *GV) const
Definition: AsmPrinter.cpp:701
virtual MCSymbol * GetCPISymbol(unsigned CPID) const
Return the symbol for the specified constant pool entry.
MCSymbol * GetJTISymbol(unsigned JTID, bool isLinkerPrivate=false) const
Return the symbol for the specified jump table entry.
MCSymbol * GetExternalSymbolSymbol(Twine Sym) const
Return the MCSymbol for the specified ExternalSymbol.
MCSymbol * GetBlockAddressSymbol(const BlockAddress *BA) const
Return the MCSymbol used to satisfy BlockAddress uses of the specified basic block.
Binary assembler expressions.
Definition: MCExpr.h:493
static const MCBinaryExpr * createAdd(const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx)
Definition: MCExpr.h:537
static const MCConstantExpr * create(int64_t Value, MCContext &Ctx, bool PrintInHex=false, unsigned SizeInBytes=0)
Definition: MCExpr.cpp:222
Context object for machine code objects.
Definition: MCContext.h:83
Instances of this class represent a single low-level machine instruction.
Definition: MCInst.h:185
void addOperand(const MCOperand Op)
Definition: MCInst.h:211
void setOpcode(unsigned Op)
Definition: MCInst.h:198
Instances of this class represent operands of the MCInst class.
Definition: MCInst.h:37
static MCOperand createExpr(const MCExpr *Val)
Definition: MCInst.h:163
static MCOperand createReg(MCRegister Reg)
Definition: MCInst.h:135
static MCOperand createImm(int64_t Val)
Definition: MCInst.h:142
bool isValid() const
Definition: MCInst.h:61
Represent a reference to a symbol from inside an expression.
Definition: MCExpr.h:192
static const MCSymbolRefExpr * create(const MCSymbol *Symbol, MCContext &Ctx)
Definition: MCExpr.h:398
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition: MCSymbol.h:41
MCSymbol * getSymbol() const
Return the MCSymbol for this basic block.
Representation of each machine instruction.
Definition: MachineInstr.h:69
MachineOperand class - Representation of each machine instruction operand.
const GlobalValue * getGlobal() const
int64_t getImm() const
bool isImplicit() const
MachineBasicBlock * getMBB() const
const BlockAddress * getBlockAddress() const
MachineOperandType getType() const
getType - Returns the MachineOperandType for this operand.
const char * getSymbolName() const
Register getReg() const
getReg - Returns the register number.
@ MO_Immediate
Immediate operand.
@ MO_ConstantPoolIndex
Address of indexed Constant in Constant Pool.
@ MO_GlobalAddress
Address of a global value.
@ MO_RegisterMask
Mask of preserved registers.
@ MO_BlockAddress
Address of a basic block.
@ MO_MachineBasicBlock
MachineBasicBlock reference.
@ MO_Register
Register operand.
@ MO_ExternalSymbol
Name of external global symbol.
@ MO_JumpTableIndex
Address of indexed Jump Table for switch.
int64_t getOffset() const
Return the offset from the symbol in this operand.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ C
The default llvm calling convention, compatible with C.
Definition: CallingConv.h:34
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
@ Offset
Definition: DWP.cpp:480
@ Add
Sum of integers.