1 //===-- ARMMCTargetDesc.h - ARM Target Descriptions -------------*- C++ -*-===//
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
7 //===----------------------------------------------------------------------===//
9 // This file provides ARM specific target descriptions.
11 //===----------------------------------------------------------------------===//
13 #ifndef LLVM_LIB_TARGET_ARM_MCTARGETDESC_ARMMCTARGETDESC_H
14 #define LLVM_LIB_TARGET_ARM_MCTARGETDESC_ARMMCTARGETDESC_H
16 #include "llvm/Support/DataTypes.h"
17 #include "llvm/MC/MCInstrDesc.h"
22 class formatted_raw_ostream
;
28 class MCObjectTargetWriter
;
31 class MCSubtargetInfo
;
33 class MCTargetOptions
;
34 class MCRelocationInfo
;
35 class MCTargetStreamer
;
40 class raw_pwrite_stream
;
43 std::string
ParseARMTriple(const Triple
&TT
, StringRef CPU
);
44 void initLLVMToCVRegMapping(MCRegisterInfo
*MRI
);
46 bool isPredicated(const MCInst
&MI
, const MCInstrInfo
*MCII
);
47 bool isCPSRDefined(const MCInst
&MI
, const MCInstrInfo
*MCII
);
50 bool isLDMBaseRegInList(const Inst
&MI
) {
51 auto BaseReg
= MI
.getOperand(0).getReg();
52 for (unsigned I
= 1, E
= MI
.getNumOperands(); I
< E
; ++I
) {
53 const auto &Op
= MI
.getOperand(I
);
54 if (Op
.isReg() && Op
.getReg() == BaseReg
)
60 uint64_t evaluateBranchTarget(const MCInstrDesc
&InstDesc
, uint64_t Addr
,
63 /// Create a ARM MCSubtargetInfo instance. This is exposed so Asm parser, etc.
64 /// do not need to go through TargetRegistry.
65 MCSubtargetInfo
*createARMMCSubtargetInfo(const Triple
&TT
, StringRef CPU
,
69 MCTargetStreamer
*createARMNullTargetStreamer(MCStreamer
&S
);
70 MCTargetStreamer
*createARMTargetAsmStreamer(MCStreamer
&S
,
71 formatted_raw_ostream
&OS
,
72 MCInstPrinter
*InstPrint
,
74 MCTargetStreamer
*createARMObjectTargetStreamer(MCStreamer
&S
,
75 const MCSubtargetInfo
&STI
);
77 MCCodeEmitter
*createARMLEMCCodeEmitter(const MCInstrInfo
&MCII
,
78 const MCRegisterInfo
&MRI
,
81 MCCodeEmitter
*createARMBEMCCodeEmitter(const MCInstrInfo
&MCII
,
82 const MCRegisterInfo
&MRI
,
85 MCAsmBackend
*createARMLEAsmBackend(const Target
&T
, const MCSubtargetInfo
&STI
,
86 const MCRegisterInfo
&MRI
,
87 const MCTargetOptions
&Options
);
89 MCAsmBackend
*createARMBEAsmBackend(const Target
&T
, const MCSubtargetInfo
&STI
,
90 const MCRegisterInfo
&MRI
,
91 const MCTargetOptions
&Options
);
93 // Construct a PE/COFF machine code streamer which will generate a PE/COFF
95 MCStreamer
*createARMWinCOFFStreamer(MCContext
&Context
,
96 std::unique_ptr
<MCAsmBackend
> &&MAB
,
97 std::unique_ptr
<MCObjectWriter
> &&OW
,
98 std::unique_ptr
<MCCodeEmitter
> &&Emitter
,
100 bool IncrementalLinkerCompatible
);
102 /// Construct an ELF Mach-O object writer.
103 std::unique_ptr
<MCObjectTargetWriter
> createARMELFObjectWriter(uint8_t OSABI
);
105 /// Construct an ARM Mach-O object writer.
106 std::unique_ptr
<MCObjectTargetWriter
>
107 createARMMachObjectWriter(bool Is64Bit
, uint32_t CPUType
,
108 uint32_t CPUSubtype
);
110 /// Construct an ARM PE/COFF object writer.
111 std::unique_ptr
<MCObjectTargetWriter
>
112 createARMWinCOFFObjectWriter();
114 /// Construct ARM Mach-O relocation info.
115 MCRelocationInfo
*createARMMachORelocationInfo(MCContext
&Ctx
);
119 OPERAND_VPRED_R
= MCOI::OPERAND_FIRST_TARGET
,
122 inline bool isVpred(OperandType op
) {
123 return op
== OPERAND_VPRED_R
|| op
== OPERAND_VPRED_N
;
125 inline bool isVpred(uint8_t op
) {
126 return isVpred(static_cast<OperandType
>(op
));
129 bool isCDECoproc(size_t Coproc
, const MCSubtargetInfo
&STI
);
131 } // end namespace ARM
133 } // End llvm namespace
135 // Defines symbolic names for ARM registers. This defines a mapping from
136 // register name to register number.
138 #define GET_REGINFO_ENUM
139 #include "ARMGenRegisterInfo.inc"
141 // Defines symbolic names for the ARM instructions.
143 #define GET_INSTRINFO_ENUM
144 #include "ARMGenInstrInfo.inc"
146 #define GET_SUBTARGETINFO_ENUM
147 #include "ARMGenSubtargetInfo.inc"