LLVM 24.0.0git
MipsMCTargetDesc.cpp
Go to the documentation of this file.
1//===-- MipsMCTargetDesc.cpp - Mips Target Descriptions -------------------===//
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// This file provides Mips specific target descriptions.
10//
11//===----------------------------------------------------------------------===//
12
13#include "MipsMCTargetDesc.h"
14#include "MipsAsmBackend.h"
15#include "MipsBaseInfo.h"
16#include "MipsELFStreamer.h"
17#include "MipsInstPrinter.h"
18#include "MipsMCAsmInfo.h"
19#include "MipsTargetStreamer.h"
25#include "llvm/MC/MCInstrInfo.h"
29#include "llvm/MC/MCSymbol.h"
35
36using namespace llvm;
37
38#define GET_INSTRINFO_MC_DESC
39#define ENABLE_INSTR_PREDICATE_VERIFIER
40#include "MipsGenInstrInfo.inc"
41
42#define GET_SUBTARGETINFO_MC_DESC
43#include "MipsGenSubtargetInfo.inc"
44
45#define GET_REGINFO_MC_DESC
46#include "MipsGenRegisterInfo.inc"
47
48#define GET_REGISTER_MATCHER
49#include "MipsGenAsmMatcher.inc"
50
52 unsigned RegClassID, unsigned AltIdx) {
53 MCRegister Reg = MatchRegisterAltName(Name, AltIdx);
54 if (!Reg)
55 Reg = MatchRegisterName(Name);
56 if (!Reg)
57 return MCRegister();
58
59 const MCRegisterClass &RC = MRI.getRegClass(RegClassID);
60 // GPR32 and GPR64 share names; select the requested width.
61 if (!RC.contains(Reg)) {
62 if (RegClassID == Mips::GPR32RegClassID &&
63 MRI.getRegClass(Mips::GPR64RegClassID).contains(Reg))
64 Reg = MRI.getSubReg(Reg, Mips::sub_32);
65 else if (RegClassID == Mips::GPR64RegClassID &&
66 MRI.getRegClass(Mips::GPR32RegClassID).contains(Reg))
67 Reg = MRI.getMatchingSuperReg(Reg, Mips::sub_32, &RC);
68 }
69 return RC.contains(Reg) ? Reg : MCRegister();
70}
71
73 unsigned AltIdx, bool *IsDeprecated) {
74 if (IsDeprecated)
75 *IsDeprecated = false;
76
77 if (MCRegister Reg =
78 matchRegisterName(Name, MRI, Mips::GPR32RegClassID, AltIdx))
79 return MRI.getEncodingValue(Reg);
80
81 static const struct {
82 StringLiteral Name;
83 MCPhysReg Reg;
84 // NoRegAltName applies to all ABIs.
85 unsigned AltIdx;
86 } Aliases[] = {
87 {"AT", Mips::AT, Mips::NoRegAltName},
88 {"s8", Mips::FP, Mips::NoRegAltName},
89 {"kt0", Mips::K0, Mips::NABIRegAltName},
90 {"kt1", Mips::K1, Mips::NABIRegAltName},
91 };
92 for (const auto &Alias : Aliases)
93 if (Name == Alias.Name &&
94 (Alias.AltIdx == Mips::NoRegAltName || Alias.AltIdx == AltIdx))
95 return MRI.getEncodingValue(Alias.Reg);
96
97 // GNU also accepts t4-t7 for NABI's t0-t3.
98 if (AltIdx == Mips::NABIRegAltName) {
99 static const struct {
100 StringLiteral Name;
101 MCPhysReg Reg;
102 } Deprecated[] = {
103 {"t4", Mips::T4},
104 {"t5", Mips::T5},
105 {"t6", Mips::T6},
106 {"t7", Mips::T7},
107 };
108 for (const auto &Alias : Deprecated) {
109 if (Name == Alias.Name) {
110 if (IsDeprecated)
111 *IsDeprecated = true;
112 return MRI.getEncodingValue(Alias.Reg);
113 }
114 }
115 }
116 return -1;
117}
118
120 // Mapping from CodeView to MC register id.
121 static const struct {
123 MCPhysReg Reg;
124 } RegMap[] = {
125 {codeview::RegisterId::MIPS_ZERO, Mips::ZERO},
126 {codeview::RegisterId::MIPS_AT, Mips::AT},
127 {codeview::RegisterId::MIPS_V0, Mips::V0},
128 {codeview::RegisterId::MIPS_V1, Mips::V1},
129 {codeview::RegisterId::MIPS_A0, Mips::A0},
130 {codeview::RegisterId::MIPS_A1, Mips::A1},
131 {codeview::RegisterId::MIPS_A2, Mips::A2},
132 {codeview::RegisterId::MIPS_A3, Mips::A3},
133 {codeview::RegisterId::MIPS_T0, Mips::T0},
134 {codeview::RegisterId::MIPS_T1, Mips::T1},
135 {codeview::RegisterId::MIPS_T2, Mips::T2},
136 {codeview::RegisterId::MIPS_T3, Mips::T3},
137 {codeview::RegisterId::MIPS_T4, Mips::T4},
138 {codeview::RegisterId::MIPS_T5, Mips::T5},
139 {codeview::RegisterId::MIPS_T6, Mips::T6},
140 {codeview::RegisterId::MIPS_T7, Mips::T7},
141 {codeview::RegisterId::MIPS_S0, Mips::S0},
142 {codeview::RegisterId::MIPS_S1, Mips::S1},
143 {codeview::RegisterId::MIPS_S2, Mips::S2},
144 {codeview::RegisterId::MIPS_S3, Mips::S3},
145 {codeview::RegisterId::MIPS_S4, Mips::S4},
146 {codeview::RegisterId::MIPS_S5, Mips::S5},
147 {codeview::RegisterId::MIPS_S6, Mips::S6},
148 {codeview::RegisterId::MIPS_S7, Mips::S7},
149 {codeview::RegisterId::MIPS_T8, Mips::T8},
150 {codeview::RegisterId::MIPS_T9, Mips::T9},
151 {codeview::RegisterId::MIPS_K0, Mips::K0},
152 {codeview::RegisterId::MIPS_K1, Mips::K1},
153 {codeview::RegisterId::MIPS_GP, Mips::GP},
154 {codeview::RegisterId::MIPS_SP, Mips::SP},
155 {codeview::RegisterId::MIPS_S8, Mips::FP},
156 {codeview::RegisterId::MIPS_RA, Mips::RA},
157 {codeview::RegisterId::MIPS_LO, Mips::HI0},
158 {codeview::RegisterId::MIPS_HI, Mips::LO0},
159 {codeview::RegisterId::MIPS_Fir, Mips::FCR0},
160 {codeview::RegisterId::MIPS_Psr, Mips::COP012}, // CP0.Status
161 {codeview::RegisterId::MIPS_F0, Mips::F0},
162 {codeview::RegisterId::MIPS_F1, Mips::F1},
163 {codeview::RegisterId::MIPS_F2, Mips::F2},
164 {codeview::RegisterId::MIPS_F3, Mips::F3},
165 {codeview::RegisterId::MIPS_F4, Mips::F4},
166 {codeview::RegisterId::MIPS_F5, Mips::F5},
167 {codeview::RegisterId::MIPS_F6, Mips::F6},
168 {codeview::RegisterId::MIPS_F7, Mips::F7},
169 {codeview::RegisterId::MIPS_F8, Mips::F8},
170 {codeview::RegisterId::MIPS_F9, Mips::F9},
171 {codeview::RegisterId::MIPS_F10, Mips::F10},
172 {codeview::RegisterId::MIPS_F11, Mips::F11},
173 {codeview::RegisterId::MIPS_F12, Mips::F12},
174 {codeview::RegisterId::MIPS_F13, Mips::F13},
175 {codeview::RegisterId::MIPS_F14, Mips::F14},
176 {codeview::RegisterId::MIPS_F15, Mips::F15},
177 {codeview::RegisterId::MIPS_F16, Mips::F16},
178 {codeview::RegisterId::MIPS_F17, Mips::F17},
179 {codeview::RegisterId::MIPS_F18, Mips::F18},
180 {codeview::RegisterId::MIPS_F19, Mips::F19},
181 {codeview::RegisterId::MIPS_F20, Mips::F20},
182 {codeview::RegisterId::MIPS_F21, Mips::F21},
183 {codeview::RegisterId::MIPS_F22, Mips::F22},
184 {codeview::RegisterId::MIPS_F23, Mips::F23},
185 {codeview::RegisterId::MIPS_F24, Mips::F24},
186 {codeview::RegisterId::MIPS_F25, Mips::F25},
187 {codeview::RegisterId::MIPS_F26, Mips::F26},
188 {codeview::RegisterId::MIPS_F27, Mips::F27},
189 {codeview::RegisterId::MIPS_F28, Mips::F28},
190 {codeview::RegisterId::MIPS_F29, Mips::F29},
191 {codeview::RegisterId::MIPS_F30, Mips::F30},
192 {codeview::RegisterId::MIPS_F31, Mips::F31},
193 {codeview::RegisterId::MIPS_Fsr, Mips::FCR31},
194 };
195 for (const auto &I : RegMap)
196 MRI->mapLLVMRegToCVReg(I.Reg, static_cast<int>(I.CVReg));
197}
198
199namespace {
200class MipsWinCOFFTargetStreamer : public MipsTargetStreamer {
201public:
202 MipsWinCOFFTargetStreamer(MCStreamer &S) : MipsTargetStreamer(S) {}
203};
204} // end namespace
205
206/// Select the Mips CPU for the given triple and cpu name.
208 if (CPU.empty() || CPU == "generic") {
209 if (TT.getSubArch() == llvm::Triple::MipsSubArch_r6) {
210 if (TT.isMIPS32())
211 CPU = "mips32r6";
212 else
213 CPU = "mips64r6";
214 } else {
215 if (TT.isMIPS32())
216 CPU = "mips32";
217 else
218 CPU = "mips64";
219 }
220 }
221 return CPU;
222}
223
225 MCInstrInfo *X = new MCInstrInfo();
226 InitMipsMCInstrInfo(X);
227 return X;
228}
229
232 InitMipsMCRegisterInfo(X, Mips::RA);
233 return X;
234}
235
237 StringRef CPU, StringRef FS) {
238 CPU = MIPS_MC::selectMipsCPU(TT, CPU);
239 return createMipsMCSubtargetInfoImpl(TT, CPU, /*TuneCPU*/ CPU, FS);
240}
241
243 const Triple &TT,
244 const MCTargetOptions &Options) {
245 MCAsmInfo *MAI;
246
247 if (TT.isOSBinFormatCOFF())
248 MAI = new MipsCOFFMCAsmInfo(Options);
249 else
250 MAI = new MipsELFMCAsmInfo(TT, Options);
251
252 unsigned SP = MRI.getDwarfRegNum(Mips::SP, true);
254 MAI->addInitialFrameState(Inst);
255
256 return MAI;
257}
258
260 unsigned SyntaxVariant,
261 const MCAsmInfo &MAI,
262 const MCInstrInfo &MII,
263 const MCRegisterInfo &MRI) {
264 return new MipsInstPrinter(MAI, MII, MRI);
265}
266
268 std::unique_ptr<MCAsmBackend> &&MAB,
269 std::unique_ptr<MCObjectWriter> &&OW,
270 std::unique_ptr<MCCodeEmitter> &&Emitter) {
271 MCStreamer *S;
272 S = createMipsELFStreamer(Context, std::move(MAB), std::move(OW),
273 std::move(Emitter));
274 return S;
275}
276
282
286
287static MCTargetStreamer *
290 return new MipsWinCOFFTargetStreamer(S);
291 return new MipsTargetELFStreamer(S, STI);
292}
293
294namespace {
295
296class MipsMCInstrAnalysis : public MCInstrAnalysis {
297public:
298 MipsMCInstrAnalysis(const MCInstrInfo *Info) : MCInstrAnalysis(Info) {}
299
300 bool evaluateBranch(const MCInst &Inst, uint64_t Addr, uint64_t Size,
301 uint64_t &Target) const override {
302 unsigned NumOps = Inst.getNumOperands();
303 if (NumOps == 0)
304 return false;
305 switch (Info->get(Inst.getOpcode()).operands()[NumOps - 1].OperandType) {
308 // j, jal, jalx, jals
309 // Absolute branch within the current 256 MB-aligned region
310 uint64_t Region = Addr & ~uint64_t(0xfffffff);
311 Target = Region + Inst.getOperand(NumOps - 1).getImm();
312 return true;
313 }
315 // b, beq ...
316 Target = Addr + Inst.getOperand(NumOps - 1).getImm();
317 return true;
318 default:
319 return false;
320 }
321 }
322};
323}
324
326 return new MipsMCInstrAnalysis(Info);
327}
328
332 // Register the MC asm info.
334
335 // Register the MC instruction info.
337
338 // Register the MC register info.
340
341 // Register the elf streamer.
343
344 // Register the asm target streamer.
346
349
351
352 // Register the MC subtarget info.
354
355 // Register the MC instruction analyzer.
357
358 // Register the MCInstPrinter.
360
363
364 // Register the asm backend.
366 }
367
368 // Register the MC Code Emitter
371
374}
static MCRegister MatchRegisterName(StringRef Name)
unsigned uint64_t
static MCStreamer * createMCStreamer(const Triple &T, MCContext &Context, std::unique_ptr< MCAsmBackend > &&MAB, std::unique_ptr< MCObjectWriter > &&OW, std::unique_ptr< MCCodeEmitter > &&Emitter)
static MCRegister MatchRegisterAltName(StringRef Name)
Maps from the set of all alternative registernames to a register number.
#define X(NUM, ENUM, NAME)
Definition ELF.h:857
#define LLVM_ABI
Definition Compiler.h:215
#define LLVM_EXTERNAL_VISIBILITY
Definition Compiler.h:132
dxil DXContainer Global Emitter
const size_t AbstractManglingParser< Derived, Alloc >::NumOps
static LVOptions Options
Definition LVOptions.cpp:25
#define I(x, y, z)
Definition MD5.cpp:57
#define T
static MCRegisterInfo * createMipsMCRegisterInfo(const Triple &TT)
LLVM_ABI LLVM_EXTERNAL_VISIBILITY void LLVMInitializeMipsTargetMC()
static MCTargetStreamer * createMipsObjectTargetStreamer(MCStreamer &S, const MCSubtargetInfo &STI)
static MCTargetStreamer * createMipsAsmTargetStreamer(MCStreamer &S, formatted_raw_ostream &OS, MCInstPrinter *InstPrint)
static MCStreamer * createMCStreamer(const Triple &T, MCContext &Context, std::unique_ptr< MCAsmBackend > &&MAB, std::unique_ptr< MCObjectWriter > &&OW, std::unique_ptr< MCCodeEmitter > &&Emitter)
static MCSubtargetInfo * createMipsMCSubtargetInfo(const Triple &TT, StringRef CPU, StringRef FS)
static MCInstrInfo * createMipsMCInstrInfo()
static MCInstPrinter * createMipsMCInstPrinter(const Triple &T, unsigned SyntaxVariant, const MCAsmInfo &MAI, const MCInstrInfo &MII, const MCRegisterInfo &MRI)
static MCTargetStreamer * createMipsNullTargetStreamer(MCStreamer &S)
static MCAsmInfo * createMipsMCAsmInfo(const MCRegisterInfo &MRI, const Triple &TT, const MCTargetOptions &Options)
static MCInstrAnalysis * createMipsMCInstrAnalysis(const MCInstrInfo *Info)
This class is intended to be used as a base class for asm properties and features specific to the tar...
Definition MCAsmInfo.h:67
void addInitialFrameState(const MCCFIInstruction &Inst)
Definition MCAsmInfo.cpp:56
static MCCFIInstruction createDefCfaRegister(MCSymbol *L, unsigned Register, SMLoc Loc={})
.cfi_def_cfa_register modifies a rule for computing CFA.
Definition MCDwarf.h:635
Context object for machine code objects.
Definition MCContext.h:83
This is an instance of a target assembly language printer that converts an MCInst to valid target ass...
unsigned getNumOperands() const
Definition MCInst.h:212
unsigned getOpcode() const
Definition MCInst.h:202
const MCOperand & getOperand(unsigned i) const
Definition MCInst.h:210
Interface to description of machine instruction set.
Definition MCInstrInfo.h:27
int64_t getImm() const
Definition MCInst.h:84
MCRegisterClass - Base class of TargetRegisterClass.
bool contains(MCRegister Reg) const
contains - Return true if the specified register is included in this register class.
MCRegisterInfo base class - We assume that the target defines a static array of MCRegisterDesc object...
MCRegister getMatchingSuperReg(MCRegister Reg, unsigned SubIdx, const MCRegisterClass *RC) const
Return a super-register of the specified register Reg so its sub-register of index SubIdx is Reg.
void mapLLVMRegToCVReg(MCRegister LLVMReg, int CVReg)
uint16_t getEncodingValue(MCRegister Reg) const
Returns the encoding for Reg.
const MCRegisterClass & getRegClass(unsigned i) const
Returns the register class associated with the enumeration value.
MCRegister getSubReg(MCRegister Reg, unsigned Idx) const
Returns the physical register number of sub-register "Index" for physical register RegNo.
virtual int64_t getDwarfRegNum(MCRegister Reg, bool isEH) const
Map a target register to an equivalent dwarf register number.
Wrapper class representing physical registers. Should be passed by value.
Definition MCRegister.h:41
Streaming machine code generation interface.
Definition MCStreamer.h:222
Generic base class for all target subtargets.
const Triple & getTargetTriple() const
Target specific streamer interface.
Definition MCStreamer.h:95
A wrapper around a string literal that serves as a proxy for constructing global tables of StringRefs...
Definition StringRef.h:888
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
Target - Wrapper for Target specific information.
Triple - Helper class for working with autoconf configuration names.
Definition Triple.h:48
bool isOSBinFormatCOFF() const
Tests whether the OS uses the COFF binary format.
Definition Triple.h:869
@ MipsSubArch_r6
Definition Triple.h:170
formatted_raw_ostream - A raw_ostream that wraps another one and keeps track of line and column posit...
@ OPERAND_IMMEDIATE
Definition MCInstrDesc.h:61
StringRef selectMipsCPU(const Triple &TT, StringRef CPU)
Select the Mips CPU for the given triple and cpu name.
MCRegister matchRegisterName(StringRef Name, const MCRegisterInfo &MRI, unsigned RegClassID, unsigned AltIdx)
Match a symbolic name in RegClassID, or return an invalid register.
void initLLVMToCVRegMapping(MCRegisterInfo *MRI)
int getCPURegisterIndex(StringRef Name, const MCRegisterInfo &MRI, unsigned AltIdx, bool *IsDeprecated=nullptr)
Return a GPR name's hardware index, or -1 if unknown.
This is an optimization pass for GlobalISel generic memory operations.
MCCodeEmitter * createMipsMCCodeEmitterEL(const MCInstrInfo &MCII, MCContext &Ctx)
MCCodeEmitter * createMipsMCCodeEmitterEB(const MCInstrInfo &MCII, MCContext &Ctx)
MCELFStreamer * createMipsELFStreamer(MCContext &Context, std::unique_ptr< MCAsmBackend > MAB, std::unique_ptr< MCObjectWriter > OW, std::unique_ptr< MCCodeEmitter > Emitter)
Target & getTheMips64Target()
MCStreamer * createMipsWinCOFFStreamer(MCContext &C, std::unique_ptr< MCAsmBackend > &&AB, std::unique_ptr< MCObjectWriter > &&OW, std::unique_ptr< MCCodeEmitter > &&CE)
Construct an MIPS Windows COFF machine code streamer which will generate PE/COFF format object files.
Target & getTheMips64elTarget()
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
Definition MCRegister.h:21
Target & getTheMipselTarget()
Target & getTheMipsTarget()
MCAsmBackend * createMipsAsmBackend(const Target &T, const MCSubtargetInfo &STI, const MCRegisterInfo &MRI, const MCTargetOptions &Options)
RegisterMCAsmInfoFn - Helper template for registering a target assembly info implementation.
static void RegisterMCRegInfo(Target &T, Target::MCRegInfoCtorFnTy Fn)
RegisterMCRegInfo - Register a MCRegisterInfo implementation for the given target.
static void RegisterMCAsmBackend(Target &T, Target::MCAsmBackendCtorTy Fn)
RegisterMCAsmBackend - Register a MCAsmBackend implementation for the given target.
static void RegisterMCCodeEmitter(Target &T, Target::MCCodeEmitterCtorTy Fn)
RegisterMCCodeEmitter - Register a MCCodeEmitter implementation for the given target.
static void RegisterMCSubtargetInfo(Target &T, Target::MCSubtargetInfoCtorFnTy Fn)
RegisterMCSubtargetInfo - Register a MCSubtargetInfo implementation for the given target.
static void RegisterObjectTargetStreamer(Target &T, Target::ObjectTargetStreamerCtorTy Fn)
static void RegisterMCInstrAnalysis(Target &T, Target::MCInstrAnalysisCtorFnTy Fn)
RegisterMCInstrAnalysis - Register a MCInstrAnalysis implementation for the given target.
static void RegisterELFStreamer(Target &T, Target::ELFStreamerCtorTy Fn)
static void RegisterNullTargetStreamer(Target &T, Target::NullTargetStreamerCtorTy Fn)
static void RegisterMCInstPrinter(Target &T, Target::MCInstPrinterCtorTy Fn)
RegisterMCInstPrinter - Register a MCInstPrinter implementation for the given target.
static void RegisterCOFFStreamer(Target &T, Target::COFFStreamerCtorTy Fn)
static void RegisterMCInstrInfo(Target &T, Target::MCInstrInfoCtorFnTy Fn)
RegisterMCInstrInfo - Register a MCInstrInfo implementation for the given target.
static void RegisterAsmTargetStreamer(Target &T, Target::AsmTargetStreamerCtorTy Fn)