LLVM  16.0.0git
RISCVMCTargetDesc.cpp
Go to the documentation of this file.
1 //===-- RISCVMCTargetDesc.cpp - RISCV 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 RISCV-specific target descriptions.
10 ///
11 //===----------------------------------------------------------------------===//
12 
13 #include "RISCVMCTargetDesc.h"
14 #include "RISCVBaseInfo.h"
15 #include "RISCVELFStreamer.h"
16 #include "RISCVInstPrinter.h"
17 #include "RISCVMCAsmInfo.h"
18 #include "RISCVMCObjectFileInfo.h"
19 #include "RISCVTargetStreamer.h"
21 #include "llvm/ADT/STLExtras.h"
22 #include "llvm/MC/MCAsmBackend.h"
23 #include "llvm/MC/MCAsmInfo.h"
24 #include "llvm/MC/MCCodeEmitter.h"
26 #include "llvm/MC/MCInstrInfo.h"
28 #include "llvm/MC/MCObjectWriter.h"
29 #include "llvm/MC/MCRegisterInfo.h"
30 #include "llvm/MC/MCStreamer.h"
32 #include "llvm/MC/TargetRegistry.h"
34 
35 #define GET_INSTRINFO_MC_DESC
36 #define ENABLE_INSTR_PREDICATE_VERIFIER
37 #include "RISCVGenInstrInfo.inc"
38 
39 #define GET_REGINFO_MC_DESC
40 #include "RISCVGenRegisterInfo.inc"
41 
42 #define GET_SUBTARGETINFO_MC_DESC
43 #include "RISCVGenSubtargetInfo.inc"
44 
45 using namespace llvm;
46 
48  MCInstrInfo *X = new MCInstrInfo();
49  InitRISCVMCInstrInfo(X);
50  return X;
51 }
52 
55  InitRISCVMCRegisterInfo(X, RISCV::X1);
56  return X;
57 }
58 
60  const Triple &TT,
61  const MCTargetOptions &Options) {
62  MCAsmInfo *MAI = new RISCVMCAsmInfo(TT);
63 
64  MCRegister SP = MRI.getDwarfRegNum(RISCV::X2, true);
65  MCCFIInstruction Inst = MCCFIInstruction::cfiDefCfa(nullptr, SP, 0);
66  MAI->addInitialFrameState(Inst);
67 
68  return MAI;
69 }
70 
71 static MCObjectFileInfo *
73  bool LargeCodeModel = false) {
75  MOFI->initMCObjectFileInfo(Ctx, PIC, LargeCodeModel);
76  return MOFI;
77 }
78 
80  StringRef CPU, StringRef FS) {
81  if (CPU.empty() || CPU == "generic")
82  CPU = TT.isArch64Bit() ? "generic-rv64" : "generic-rv32";
83 
84  return createRISCVMCSubtargetInfoImpl(TT, CPU, /*TuneCPU*/ CPU, FS);
85 }
86 
88  unsigned SyntaxVariant,
89  const MCAsmInfo &MAI,
90  const MCInstrInfo &MII,
91  const MCRegisterInfo &MRI) {
92  return new RISCVInstPrinter(MAI, MII, MRI);
93 }
94 
95 static MCTargetStreamer *
97  const Triple &TT = STI.getTargetTriple();
98  if (TT.isOSBinFormatELF())
99  return new RISCVTargetELFStreamer(S, STI);
100  return nullptr;
101 }
102 
105  MCInstPrinter *InstPrint,
106  bool isVerboseAsm) {
107  return new RISCVTargetAsmStreamer(S, OS);
108 }
109 
111  return new RISCVTargetStreamer(S);
112 }
113 
114 namespace {
115 
116 class RISCVMCInstrAnalysis : public MCInstrAnalysis {
117 public:
118  explicit RISCVMCInstrAnalysis(const MCInstrInfo *Info)
119  : MCInstrAnalysis(Info) {}
120 
121  bool evaluateBranch(const MCInst &Inst, uint64_t Addr, uint64_t Size,
122  uint64_t &Target) const override {
123  if (isConditionalBranch(Inst)) {
124  int64_t Imm;
125  if (Size == 2)
126  Imm = Inst.getOperand(1).getImm();
127  else
128  Imm = Inst.getOperand(2).getImm();
129  Target = Addr + Imm;
130  return true;
131  }
132 
133  if (Inst.getOpcode() == RISCV::C_JAL || Inst.getOpcode() == RISCV::C_J) {
134  Target = Addr + Inst.getOperand(0).getImm();
135  return true;
136  }
137 
138  if (Inst.getOpcode() == RISCV::JAL) {
139  Target = Addr + Inst.getOperand(1).getImm();
140  return true;
141  }
142 
143  return false;
144  }
145 };
146 
147 } // end anonymous namespace
148 
150  return new RISCVMCInstrAnalysis(Info);
151 }
152 
153 namespace {
155  std::unique_ptr<MCAsmBackend> &&MAB,
156  std::unique_ptr<MCObjectWriter> &&MOW,
157  std::unique_ptr<MCCodeEmitter> &&MCE,
158  bool RelaxAll) {
160  std::move(MCE), RelaxAll);
161 }
162 } // end anonymous namespace
163 
165  for (Target *T : {&getTheRISCV32Target(), &getTheRISCV64Target()}) {
178 
179  // Register the asm target streamer.
181  // Register the null target streamer.
184  }
185 }
llvm::createRISCVELFStreamer
MCELFStreamer * createRISCVELFStreamer(MCContext &C, std::unique_ptr< MCAsmBackend > MAB, std::unique_ptr< MCObjectWriter > MOW, std::unique_ptr< MCCodeEmitter > MCE, bool RelaxAll)
Definition: RISCVELFStreamer.cpp:283
llvm
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
llvm::getTheRISCV64Target
Target & getTheRISCV64Target()
Definition: RISCVTargetInfo.cpp:18
RISCVELFStreamer.h
T
llvm::MCContext
Context object for machine code objects.
Definition: MCContext.h:76
MCCodeEmitter.h
llvm::Target
Target - Wrapper for Target specific information.
Definition: TargetRegistry.h:149
llvm::MCAsmInfo
This class is intended to be used as a base class for asm properties and features specific to the tar...
Definition: MCAsmInfo.h:56
createRISCVNullTargetStreamer
static MCTargetStreamer * createRISCVNullTargetStreamer(MCStreamer &S)
Definition: RISCVMCTargetDesc.cpp:110
ErrorHandling.h
llvm::TargetRegistry::RegisterAsmTargetStreamer
static void RegisterAsmTargetStreamer(Target &T, Target::AsmTargetStreamerCtorTy Fn)
Definition: TargetRegistry.h:1038
llvm::TargetRegistry::RegisterMCInstrAnalysis
static void RegisterMCInstrAnalysis(Target &T, Target::MCInstrAnalysisCtorFnTy Fn)
RegisterMCInstrAnalysis - Register a MCInstrAnalysis implementation for the given target.
Definition: TargetRegistry.h:881
llvm::Triple
Triple - Helper class for working with autoconf configuration names.
Definition: Triple.h:44
MCObjectFileInfo.h
PIC
PassInstrumentationCallbacks PIC
Definition: PassBuilderBindings.cpp:55
RISCVMCObjectFileInfo.h
llvm::TargetRegistry::RegisterMCObjectFileInfo
static void RegisterMCObjectFileInfo(Target &T, Target::MCObjectFileInfoCtorFnTy Fn)
Register a MCObjectFileInfo implementation for the given target.
Definition: TargetRegistry.h:861
STLExtras.h
llvm::MCInst
Instances of this class represent a single low-level machine instruction.
Definition: MCInst.h:184
llvm::createRISCVMCCodeEmitter
MCCodeEmitter * createRISCVMCCodeEmitter(const MCInstrInfo &MCII, MCContext &Ctx)
Definition: RISCVMCCodeEmitter.cpp:90
createRISCVMCSubtargetInfo
static MCSubtargetInfo * createRISCVMCSubtargetInfo(const Triple &TT, StringRef CPU, StringRef FS)
Definition: RISCVMCTargetDesc.cpp:79
llvm::TargetRegistry::RegisterMCInstPrinter
static void RegisterMCInstPrinter(Target &T, Target::MCInstPrinterCtorTy Fn)
RegisterMCInstPrinter - Register a MCInstPrinter implementation for the given target.
Definition: TargetRegistry.h:988
createRISCVObjectTargetStreamer
static MCTargetStreamer * createRISCVObjectTargetStreamer(MCStreamer &S, const MCSubtargetInfo &STI)
Definition: RISCVMCTargetDesc.cpp:96
RISCVInstPrinter.h
Context
LLVMContext & Context
Definition: NVVMIntrRange.cpp:66
createRISCVAsmTargetStreamer
static MCTargetStreamer * createRISCVAsmTargetStreamer(MCStreamer &S, formatted_raw_ostream &OS, MCInstPrinter *InstPrint, bool isVerboseAsm)
Definition: RISCVMCTargetDesc.cpp:103
llvm::MCStreamer
Streaming machine code generation interface.
Definition: MCStreamer.h:212
llvm::createRISCVAsmBackend
MCAsmBackend * createRISCVAsmBackend(const Target &T, const MCSubtargetInfo &STI, const MCRegisterInfo &MRI, const MCTargetOptions &Options)
Definition: RISCVAsmBackend.cpp:650
MCAsmBackend.h
llvm::RISCVInstPrinter
Definition: RISCVInstPrinter.h:21
LLVMInitializeRISCVTargetMC
LLVM_EXTERNAL_VISIBILITY void LLVMInitializeRISCVTargetMC()
Definition: RISCVMCTargetDesc.cpp:164
llvm::MCSubtargetInfo::getTargetTriple
const Triple & getTargetTriple() const
Definition: MCSubtargetInfo.h:108
llvm::RISCVMCAsmInfo
Definition: RISCVMCAsmInfo.h:21
MCInstrInfo.h
llvm::MCOperand::getImm
int64_t getImm() const
Definition: MCInst.h:80
llvm::MCInstrAnalysis
Definition: MCInstrAnalysis.h:30
MCSubtargetInfo.h
RISCVMCTargetDesc.h
Options
const char LLVMTargetMachineRef LLVMPassBuilderOptionsRef Options
Definition: PassBuilderBindings.cpp:48
llvm::X86AS::FS
@ FS
Definition: X86.h:200
llvm::MCTargetStreamer
Target specific streamer interface.
Definition: MCStreamer.h:93
Info
Analysis containing CSE Info
Definition: CSEInfo.cpp:27
llvm::MCCFIInstruction
Definition: MCDwarf.h:478
X
static GCMetadataPrinterRegistry::Add< ErlangGCPrinter > X("erlang", "erlang-compatible garbage collector")
llvm::StringRef::empty
constexpr bool empty() const
empty - Check if the string is empty.
Definition: StringRef.h:134
RISCVTargetStreamer.h
llvm::TargetRegistry::RegisterMCAsmBackend
static void RegisterMCAsmBackend(Target &T, Target::MCAsmBackendCtorTy Fn)
RegisterMCAsmBackend - Register a MCAsmBackend implementation for the given target.
Definition: TargetRegistry.h:935
uint64_t
llvm::MCInstPrinter
This is an instance of a target assembly language printer that converts an MCInst to valid target ass...
Definition: MCInstPrinter.h:43
LLVM_EXTERNAL_VISIBILITY
#define LLVM_EXTERNAL_VISIBILITY
Definition: Compiler.h:127
Addr
uint64_t Addr
Definition: ELFObjHandler.cpp:79
createRISCVMCObjectFileInfo
static MCObjectFileInfo * createRISCVMCObjectFileInfo(MCContext &Ctx, bool PIC, bool LargeCodeModel=false)
Definition: RISCVMCTargetDesc.cpp:72
move
compiles ldr LCPI1_0 ldr ldr mov lsr tst moveq r1 ldr LCPI1_1 and r0 bx lr It would be better to do something like to fold the shift into the conditional move
Definition: README.txt:546
llvm::TargetRegistry::RegisterObjectTargetStreamer
static void RegisterObjectTargetStreamer(Target &T, Target::ObjectTargetStreamerCtorTy Fn)
Definition: TargetRegistry.h:1044
MCRegisterInfo.h
RISCVMCAsmInfo.h
llvm::formatted_raw_ostream
formatted_raw_ostream - A raw_ostream that wraps another one and keeps track of line and column posit...
Definition: FormattedStream.h:30
llvm::TargetRegistry::RegisterMCAsmInfo
static void RegisterMCAsmInfo(Target &T, Target::MCAsmInfoCtorFnTy Fn)
RegisterMCAsmInfo - Register a MCAsmInfo implementation for the given target.
Definition: TargetRegistry.h:849
llvm::MCCFIInstruction::cfiDefCfa
static MCCFIInstruction cfiDefCfa(MCSymbol *L, unsigned Register, int Offset)
.cfi_def_cfa defines a rule for computing CFA as: take address from Register and add Offset to it.
Definition: MCDwarf.h:532
llvm::MCAsmInfo::addInitialFrameState
void addInitialFrameState(const MCCFIInstruction &Inst)
Definition: MCAsmInfo.cpp:86
createRISCVInstrAnalysis
static MCInstrAnalysis * createRISCVInstrAnalysis(const MCInstrInfo *Info)
Definition: RISCVMCTargetDesc.cpp:149
createRISCVMCInstrInfo
static MCInstrInfo * createRISCVMCInstrInfo()
Definition: RISCVMCTargetDesc.cpp:47
createRISCVMCInstPrinter
static MCInstPrinter * createRISCVMCInstPrinter(const Triple &T, unsigned SyntaxVariant, const MCAsmInfo &MAI, const MCInstrInfo &MII, const MCRegisterInfo &MRI)
Definition: RISCVMCTargetDesc.cpp:87
llvm::TargetRegistry::RegisterMCSubtargetInfo
static void RegisterMCSubtargetInfo(Target &T, Target::MCSubtargetInfoCtorFnTy Fn)
RegisterMCSubtargetInfo - Register a MCSubtargetInfo implementation for the given target.
Definition: TargetRegistry.h:908
llvm::MCTargetOptions
Definition: MCTargetOptions.h:37
llvm::MCObjectFileInfo::initMCObjectFileInfo
void initMCObjectFileInfo(MCContext &MCCtx, bool PIC, bool LargeCodeModel=false)
Definition: MCObjectFileInfo.cpp:1026
llvm::RISCVTargetAsmStreamer
Definition: RISCVTargetStreamer.h:48
MCInstrAnalysis.h
MCAsmInfo.h
llvm::StringRef
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:50
S
add sub stmia L5 ldr r0 bl L_printf $stub Instead of a and a wouldn t it be better to do three moves *Return an aggregate type is even return S
Definition: README.txt:210
llvm::MCRegisterInfo
MCRegisterInfo base class - We assume that the target defines a static array of MCRegisterDesc object...
Definition: MCRegisterInfo.h:135
MRI
unsigned const MachineRegisterInfo * MRI
Definition: AArch64AdvSIMDScalarPass.cpp:105
MCObjectWriter.h
llvm::TargetRegistry::RegisterMCInstrInfo
static void RegisterMCInstrInfo(Target &T, Target::MCInstrInfoCtorFnTy Fn)
RegisterMCInstrInfo - Register a MCInstrInfo implementation for the given target.
Definition: TargetRegistry.h:875
llvm::TargetRegistry::RegisterMCCodeEmitter
static void RegisterMCCodeEmitter(Target &T, Target::MCCodeEmitterCtorTy Fn)
RegisterMCCodeEmitter - Register a MCCodeEmitter implementation for the given target.
Definition: TargetRegistry.h:1001
llvm::MCInstrInfo
Interface to description of machine instruction set.
Definition: MCInstrInfo.h:26
createRISCVMCRegisterInfo
static MCRegisterInfo * createRISCVMCRegisterInfo(const Triple &TT)
Definition: RISCVMCTargetDesc.cpp:53
llvm::TargetRegistry::RegisterMCRegInfo
static void RegisterMCRegInfo(Target &T, Target::MCRegInfoCtorFnTy Fn)
RegisterMCRegInfo - Register a MCRegisterInfo implementation for the given target.
Definition: TargetRegistry.h:895
llvm::TargetRegistry::RegisterELFStreamer
static void RegisterELFStreamer(Target &T, Target::ELFStreamerCtorTy Fn)
Definition: TargetRegistry.h:1013
llvm::MCInst::getOpcode
unsigned getOpcode() const
Definition: MCInst.h:198
RISCVBaseInfo.h
llvm::TargetRegistry::RegisterNullTargetStreamer
static void RegisterNullTargetStreamer(Target &T, Target::NullTargetStreamerCtorTy Fn)
Definition: TargetRegistry.h:1033
llvm::RISCVMatInt::Imm
@ Imm
Definition: RISCVMatInt.h:23
llvm::RISCVTargetELFStreamer
Definition: RISCVELFStreamer.h:17
MCStreamer.h
llvm::MCInst::getOperand
const MCOperand & getOperand(unsigned i) const
Definition: MCInst.h:206
RISCVTargetInfo.h
llvm::RISCVTargetStreamer
Definition: RISCVTargetStreamer.h:20
llvm::RISCVMCObjectFileInfo
Definition: RISCVMCObjectFileInfo.h:20
TargetRegistry.h
llvm::MCSubtargetInfo
Generic base class for all target subtargets.
Definition: MCSubtargetInfo.h:76
createRISCVMCAsmInfo
static MCAsmInfo * createRISCVMCAsmInfo(const MCRegisterInfo &MRI, const Triple &TT, const MCTargetOptions &Options)
Definition: RISCVMCTargetDesc.cpp:59
llvm::getTheRISCV32Target
Target & getTheRISCV32Target()
Definition: RISCVTargetInfo.cpp:13
llvm::MCObjectFileInfo
Definition: MCObjectFileInfo.h:28
llvm::MCRegister
Wrapper class representing physical registers. Should be passed by value.
Definition: MCRegister.h:24