LLVM 20.0.0git
XCoreMCInstLower.cpp
Go to the documentation of this file.
1//===-- XCoreMCInstLower.cpp - Convert XCore MachineInstr to MCInst -------===//
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 XCore MachineInstrs to their
11/// corresponding MCInst records.
12///
13//===----------------------------------------------------------------------===//
14#include "XCoreMCInstLower.h"
19#include "llvm/IR/Mangler.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 : Printer(asmprinter) {}
28
30
31MCOperand XCoreMCInstLower::LowerSymbolOperand(const MachineOperand &MO,
32 MachineOperandType MOTy,
33 unsigned Offset) const {
35 const MCSymbol *Symbol;
36
37 switch (MOTy) {
39 Symbol = MO.getMBB()->getSymbol();
40 break;
42 Symbol = Printer.getSymbol(MO.getGlobal());
43 Offset += MO.getOffset();
44 break;
46 Symbol = Printer.GetBlockAddressSymbol(MO.getBlockAddress());
47 Offset += MO.getOffset();
48 break;
50 Symbol = Printer.GetExternalSymbolSymbol(MO.getSymbolName());
51 Offset += MO.getOffset();
52 break;
54 Symbol = Printer.GetJTISymbol(MO.getIndex());
55 break;
57 Symbol = Printer.GetCPISymbol(MO.getIndex());
58 Offset += MO.getOffset();
59 break;
60 default:
61 llvm_unreachable("<unknown operand type>");
62 }
63
64 const MCSymbolRefExpr *MCSym = MCSymbolRefExpr::create(Symbol, Kind, *Ctx);
65
66 if (!Offset)
67 return MCOperand::createExpr(MCSym);
68
69 // Assume offset is never negative.
70 assert(Offset > 0);
71
72 const MCConstantExpr *OffsetExpr = MCConstantExpr::create(Offset, *Ctx);
73 const MCBinaryExpr *Add = MCBinaryExpr::createAdd(MCSym, OffsetExpr, *Ctx);
75}
76
78 unsigned offset) const {
79 MachineOperandType MOTy = MO.getType();
80
81 switch (MOTy) {
82 default: llvm_unreachable("unknown operand type");
84 // Ignore all implicit register operands.
85 if (MO.isImplicit()) break;
86 return MCOperand::createReg(MO.getReg());
88 return MCOperand::createImm(MO.getImm() + offset);
95 return LowerSymbolOperand(MO, MOTy, offset);
97 break;
98 }
99
100 return MCOperand();
101}
102
103void XCoreMCInstLower::Lower(const MachineInstr *MI, MCInst &OutMI) const {
104 OutMI.setOpcode(MI->getOpcode());
105
106 for (const MachineOperand &MO : MI->operands()) {
107 MCOperand MCOp = LowerOperand(MO);
108
109 if (MCOp.isValid())
110 OutMI.addOperand(MCOp);
111 }
112}
dxil pretty DXIL Metadata Pretty Printer
IRTranslator LLVM IR MI
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
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.
MCOperand LowerOperand(const MachineOperand &MO, unsigned offset=0) const
XCoreMCInstLower(class AsmPrinter &asmprinter)
void Lower(const MachineInstr *MI, MCInst &OutMI) const
void Initialize(MCContext *C)
#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.