LLVM 19.0.0git
MCAsmBackend.h
Go to the documentation of this file.
1//===- llvm/MC/MCAsmBackend.h - MC Asm Backend ------------------*- 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#ifndef LLVM_MC_MCASMBACKEND_H
10#define LLVM_MC_MCASMBACKEND_H
11
12#include "llvm/ADT/ArrayRef.h"
14#include "llvm/MC/MCFixup.h"
15#include "llvm/Support/Endian.h"
16#include <cstdint>
17
18namespace llvm {
19
20class MCAlignFragment;
21class MCDwarfCallFrameFragment;
22class MCDwarfLineAddrFragment;
23class MCFragment;
24class MCLEBFragment;
25class MCRelaxableFragment;
26class MCSymbol;
27class MCAssembler;
28class MCContext;
29struct MCDwarfFrameInfo;
30struct MCFixupKindInfo;
31class MCInst;
32class MCObjectStreamer;
33class MCObjectTargetWriter;
34class MCObjectWriter;
35class MCSubtargetInfo;
36class MCValue;
37class raw_pwrite_stream;
38class StringRef;
39class raw_ostream;
40
41/// Generic interface to target specific assembler backends.
43protected: // Can only create subclasses.
45
46public:
47 MCAsmBackend(const MCAsmBackend &) = delete;
49 virtual ~MCAsmBackend();
50
52
53 /// Fixup kind used for linker relaxation. Currently only used by RISC-V.
54 const unsigned RelaxFixupKind;
55
56 /// Return true if this target might automatically pad instructions and thus
57 /// need to emit padding enable/disable directives around sensative code.
58 virtual bool allowAutoPadding() const { return false; }
59 /// Return true if this target allows an unrelaxable instruction to be
60 /// emitted into RelaxableFragment and then we can increase its size in a
61 /// tricky way for optimization.
62 virtual bool allowEnhancedRelaxation() const { return false; }
63
64 /// lifetime management
65 virtual void reset() {}
66
67 /// Create a new MCObjectWriter instance for use by the assembler backend to
68 /// emit the final object file.
69 std::unique_ptr<MCObjectWriter>
71
72 /// Create an MCObjectWriter that writes two object files: a .o file which is
73 /// linked into the final program and a .dwo file which is used by debuggers.
74 /// This function is only supported with ELF targets.
75 std::unique_ptr<MCObjectWriter>
77
78 virtual std::unique_ptr<MCObjectTargetWriter>
80
81 /// \name Target Fixup Interfaces
82 /// @{
83
84 /// Get the number of target specific fixup kinds.
85 virtual unsigned getNumFixupKinds() const = 0;
86
87 /// Map a relocation name used in .reloc to a fixup kind.
88 virtual std::optional<MCFixupKind> getFixupKind(StringRef Name) const;
89
90 /// Get information on a fixup kind.
91 virtual const MCFixupKindInfo &getFixupKindInfo(MCFixupKind Kind) const;
92
93 /// Hook to check if a relocation is needed for some target specific reason.
94 virtual bool shouldForceRelocation(const MCAssembler &Asm,
95 const MCFixup &Fixup,
96 const MCValue &Target,
97 const MCSubtargetInfo *STI) {
98 return false;
99 }
100
101 /// Hook to check if extra nop bytes must be inserted for alignment directive.
102 /// For some targets this may be necessary in order to support linker
103 /// relaxation. The number of bytes to insert are returned in Size.
105 unsigned &Size) {
106 return false;
107 }
108
109 /// Hook which indicates if the target requires a fixup to be generated when
110 /// handling an align directive in an executable section
112 MCAlignFragment &AF) {
113 return false;
114 }
115
116 virtual bool evaluateTargetFixup(const MCAssembler &Asm,
117 const MCFixup &Fixup, const MCFragment *DF,
118 const MCValue &Target,
119 const MCSubtargetInfo *STI, uint64_t &Value,
120 bool &WasForced) {
121 llvm_unreachable("Need to implement hook if target has custom fixups");
122 }
123
124 virtual bool handleAddSubRelocations(const MCAssembler &Asm,
125 const MCFragment &F,
126 const MCFixup &Fixup,
127 const MCValue &Target,
128 uint64_t &FixedValue) const {
129 return false;
130 }
131
132 /// Apply the \p Value for given \p Fixup into the provided data fragment, at
133 /// the offset specified by the fixup and following the fixup kind as
134 /// appropriate. Errors (such as an out of range fixup value) should be
135 /// reported via \p Ctx.
136 /// The \p STI is present only for fragments of type MCRelaxableFragment and
137 /// MCDataFragment with hasInstructions() == true.
138 virtual void applyFixup(const MCAssembler &Asm, const MCFixup &Fixup,
140 uint64_t Value, bool IsResolved,
141 const MCSubtargetInfo *STI) const = 0;
142
143 /// @}
144
145 /// \name Target Relaxation Interfaces
146 /// @{
147
148 /// Check whether the given instruction may need relaxation.
149 ///
150 /// \param Inst - The instruction to test.
151 /// \param STI - The MCSubtargetInfo in effect when the instruction was
152 /// encoded.
153 virtual bool mayNeedRelaxation(const MCInst &Inst,
154 const MCSubtargetInfo &STI) const {
155 return false;
156 }
157
158 /// Target specific predicate for whether a given fixup requires the
159 /// associated instruction to be relaxed.
160 virtual bool fixupNeedsRelaxationAdvanced(const MCAssembler &Asm,
161 const MCFixup &Fixup, bool Resolved,
163 const MCRelaxableFragment *DF,
164 const bool WasForced) const;
165
166 /// Simple predicate for targets where !Resolved implies requiring relaxation
167 virtual bool fixupNeedsRelaxation(const MCFixup &Fixup,
168 uint64_t Value) const {
169 llvm_unreachable("Needed if mayNeedRelaxation may return true");
170 }
171
172 /// Relax the instruction in the given fragment to the next wider instruction.
173 ///
174 /// \param [out] Inst The instruction to relax, which is also the relaxed
175 /// instruction.
176 /// \param STI the subtarget information for the associated instruction.
177 virtual void relaxInstruction(MCInst &Inst,
178 const MCSubtargetInfo &STI) const {};
179
180 virtual bool relaxDwarfLineAddr(const MCAssembler &Asm,
182 bool &WasRelaxed) const {
183 return false;
184 }
185
186 virtual bool relaxDwarfCFA(const MCAssembler &Asm,
188 bool &WasRelaxed) const {
189 return false;
190 }
191
192 // Defined by linker relaxation targets to possibly emit LEB128 relocations
193 // and set Value at the relocated location.
194 virtual std::pair<bool, bool>
195 relaxLEB128(const MCAssembler &Asm, MCLEBFragment &LF, int64_t &Value) const {
196 return std::make_pair(false, false);
197 }
198
199 /// @}
200
201 /// Returns the minimum size of a nop in bytes on this target. The assembler
202 /// will use this to emit excess padding in situations where the padding
203 /// required for simple alignment would be less than the minimum nop size.
204 ///
205 virtual unsigned getMinimumNopSize() const { return 1; }
206
207 /// Returns the maximum size of a nop in bytes on this target.
208 ///
209 virtual unsigned getMaximumNopSize(const MCSubtargetInfo &STI) const {
210 return 0;
211 }
212
213 /// Write an (optimal) nop sequence of Count bytes to the given output. If the
214 /// target cannot generate such a sequence, it should return an error.
215 ///
216 /// \return - True on success.
217 virtual bool writeNopData(raw_ostream &OS, uint64_t Count,
218 const MCSubtargetInfo *STI) const = 0;
219
220 /// Give backend an opportunity to finish layout after relaxation
221 virtual void finishLayout(MCAssembler const &Asm) const {}
222
223 /// Handle any target-specific assembler flags. By default, do nothing.
225
226 /// Generate the compact unwind encoding for the CFI instructions.
228 const MCContext *Ctxt) const {
229 return 0;
230 }
231
232 /// Check whether a given symbol has been flagged with MICROMIPS flag.
233 virtual bool isMicroMips(const MCSymbol *Sym) const {
234 return false;
235 }
236
237 bool isDarwinCanonicalPersonality(const MCSymbol *Sym) const;
238};
239
240} // end namespace llvm
241
242#endif // LLVM_MC_MCASMBACKEND_H
static RegisterPass< DebugifyFunctionPass > DF("debugify-function", "Attach debug info to a function")
std::string Name
uint64_t Size
Symbol * Sym
Definition: ELF_riscv.cpp:479
#define F(x, y, z)
Definition: MD5.cpp:55
PowerPC TLS Dynamic Call Fixup
raw_pwrite_stream & OS
Generic interface to target specific assembler backends.
Definition: MCAsmBackend.h:42
std::unique_ptr< MCObjectWriter > createObjectWriter(raw_pwrite_stream &OS) const
Create a new MCObjectWriter instance for use by the assembler backend to emit the final object file.
std::unique_ptr< MCObjectWriter > createDwoObjectWriter(raw_pwrite_stream &OS, raw_pwrite_stream &DwoOS) const
Create an MCObjectWriter that writes two object files: a .o file which is linked into the final progr...
virtual unsigned getMinimumNopSize() const
Returns the minimum size of a nop in bytes on this target.
Definition: MCAsmBackend.h:205
MCAsmBackend(const MCAsmBackend &)=delete
const llvm::endianness Endian
Definition: MCAsmBackend.h:51
virtual bool allowEnhancedRelaxation() const
Return true if this target allows an unrelaxable instruction to be emitted into RelaxableFragment and...
Definition: MCAsmBackend.h:62
virtual unsigned getMaximumNopSize(const MCSubtargetInfo &STI) const
Returns the maximum size of a nop in bytes on this target.
Definition: MCAsmBackend.h:209
virtual void handleAssemblerFlag(MCAssemblerFlag Flag)
Handle any target-specific assembler flags. By default, do nothing.
Definition: MCAsmBackend.h:224
virtual bool writeNopData(raw_ostream &OS, uint64_t Count, const MCSubtargetInfo *STI) const =0
Write an (optimal) nop sequence of Count bytes to the given output.
virtual void relaxInstruction(MCInst &Inst, const MCSubtargetInfo &STI) const
Relax the instruction in the given fragment to the next wider instruction.
Definition: MCAsmBackend.h:177
virtual bool mayNeedRelaxation(const MCInst &Inst, const MCSubtargetInfo &STI) const
Check whether the given instruction may need relaxation.
Definition: MCAsmBackend.h:153
virtual bool isMicroMips(const MCSymbol *Sym) const
Check whether a given symbol has been flagged with MICROMIPS flag.
Definition: MCAsmBackend.h:233
virtual bool shouldInsertFixupForCodeAlign(MCAssembler &Asm, MCAlignFragment &AF)
Hook which indicates if the target requires a fixup to be generated when handling an align directive ...
Definition: MCAsmBackend.h:111
virtual bool shouldInsertExtraNopBytesForCodeAlign(const MCAlignFragment &AF, unsigned &Size)
Hook to check if extra nop bytes must be inserted for alignment directive.
Definition: MCAsmBackend.h:104
virtual bool fixupNeedsRelaxationAdvanced(const MCAssembler &Asm, const MCFixup &Fixup, bool Resolved, uint64_t Value, const MCRelaxableFragment *DF, const bool WasForced) const
Target specific predicate for whether a given fixup requires the associated instruction to be relaxed...
virtual bool fixupNeedsRelaxation(const MCFixup &Fixup, uint64_t Value) const
Simple predicate for targets where !Resolved implies requiring relaxation.
Definition: MCAsmBackend.h:167
virtual bool relaxDwarfCFA(const MCAssembler &Asm, MCDwarfCallFrameFragment &DF, bool &WasRelaxed) const
Definition: MCAsmBackend.h:186
MCAsmBackend & operator=(const MCAsmBackend &)=delete
bool isDarwinCanonicalPersonality(const MCSymbol *Sym) const
virtual bool relaxDwarfLineAddr(const MCAssembler &Asm, MCDwarfLineAddrFragment &DF, bool &WasRelaxed) const
Definition: MCAsmBackend.h:180
virtual std::unique_ptr< MCObjectTargetWriter > createObjectTargetWriter() const =0
virtual void finishLayout(MCAssembler const &Asm) const
Give backend an opportunity to finish layout after relaxation.
Definition: MCAsmBackend.h:221
virtual bool handleAddSubRelocations(const MCAssembler &Asm, const MCFragment &F, const MCFixup &Fixup, const MCValue &Target, uint64_t &FixedValue) const
Definition: MCAsmBackend.h:124
virtual bool evaluateTargetFixup(const MCAssembler &Asm, const MCFixup &Fixup, const MCFragment *DF, const MCValue &Target, const MCSubtargetInfo *STI, uint64_t &Value, bool &WasForced)
Definition: MCAsmBackend.h:116
virtual void reset()
lifetime management
Definition: MCAsmBackend.h:65
virtual bool shouldForceRelocation(const MCAssembler &Asm, const MCFixup &Fixup, const MCValue &Target, const MCSubtargetInfo *STI)
Hook to check if a relocation is needed for some target specific reason.
Definition: MCAsmBackend.h:94
const unsigned RelaxFixupKind
Fixup kind used for linker relaxation. Currently only used by RISC-V.
Definition: MCAsmBackend.h:54
virtual unsigned getNumFixupKinds() const =0
Get the number of target specific fixup kinds.
virtual const MCFixupKindInfo & getFixupKindInfo(MCFixupKind Kind) const
Get information on a fixup kind.
virtual std::optional< MCFixupKind > getFixupKind(StringRef Name) const
Map a relocation name used in .reloc to a fixup kind.
virtual std::pair< bool, bool > relaxLEB128(const MCAssembler &Asm, MCLEBFragment &LF, int64_t &Value) const
Definition: MCAsmBackend.h:195
virtual void applyFixup(const MCAssembler &Asm, const MCFixup &Fixup, const MCValue &Target, MutableArrayRef< char > Data, uint64_t Value, bool IsResolved, const MCSubtargetInfo *STI) const =0
Apply the Value for given Fixup into the provided data fragment, at the offset specified by the fixup...
virtual bool allowAutoPadding() const
Return true if this target might automatically pad instructions and thus need to emit padding enable/...
Definition: MCAsmBackend.h:58
virtual ~MCAsmBackend()
virtual uint32_t generateCompactUnwindEncoding(const MCDwarfFrameInfo *FI, const MCContext *Ctxt) const
Generate the compact unwind encoding for the CFI instructions.
Definition: MCAsmBackend.h:227
Context object for machine code objects.
Definition: MCContext.h:83
Encode information on a single operation to perform on a byte sequence (e.g., an encoded instruction)...
Definition: MCFixup.h:71
Instances of this class represent a single low-level machine instruction.
Definition: MCInst.h:184
A relaxable fragment holds on to its MCInst, since it may need to be relaxed during the assembler lay...
Definition: MCFragment.h:261
Generic base class for all target subtargets.
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition: MCSymbol.h:41
This represents an "assembler immediate".
Definition: MCValue.h:36
MutableArrayRef - Represent a mutable reference to an array (0 or more elements consecutively in memo...
Definition: ArrayRef.h:307
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:50
Target - Wrapper for Target specific information.
LLVM Value Representation.
Definition: Value.h:74
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition: raw_ostream.h:52
An abstract base class for streams implementations that also support a pwrite operation.
Definition: raw_ostream.h:434
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
MCFixupKind
Extensible enumeration to represent the type of a fixup.
Definition: MCFixup.h:21
@ MaxFixupKind
Set limit to accommodate the highest reloc type in use for all Targets, currently R_AARCH64_IRELATIVE...
Definition: MCFixup.h:54
MCAssemblerFlag
Definition: MCDirectives.h:53
endianness
Definition: bit.h:70
Target independent information on a fixup kind.