LLVM 22.0.0git
TargetLoweringObjectFileImpl.h
Go to the documentation of this file.
1//==- llvm/CodeGen/TargetLoweringObjectFileImpl.h - Object Info --*- 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// This file implements classes used to handle lowerings specific to common
10// object file formats.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_CODEGEN_TARGETLOWERINGOBJECTFILEIMPL_H
15#define LLVM_CODEGEN_TARGETLOWERINGOBJECTFILEIMPL_H
16
19#include "llvm/MC/MCExpr.h"
21
22namespace llvm {
23
24class GlobalValue;
26class MachineFunction;
27class MCContext;
28class MCExpr;
29class MCSection;
30class MCSymbol;
31class Module;
32class TargetMachine;
33
35 bool UseInitArray = false;
36 mutable unsigned NextUniqueID = 1; // ID 0 is reserved for execute-only sections
38
39protected:
41
42public:
43 ~TargetLoweringObjectFileELF() override = default;
44
45 void Initialize(MCContext &Ctx, const TargetMachine &TM) override;
46
47 void getModuleMetadata(Module &M) override;
48
49 /// Emit Obj-C garbage collection and linker options.
50 void emitModuleMetadata(MCStreamer &Streamer, Module &M) const override;
51
52 void emitPersonalityValue(MCStreamer &Streamer, const DataLayout &DL,
53 const MCSymbol *Sym,
54 const MachineModuleInfo *MMI) const override;
55
56 virtual void emitPersonalityValueImpl(MCStreamer &Streamer,
57 const DataLayout &DL,
58 const MCSymbol *Sym,
59 const MachineModuleInfo *MMI) const;
60
61 void emitLinkerDirectives(MCStreamer &Streamer, Module &M) const override;
62
63 /// Given a constant with the SectionKind, return a section that it should be
64 /// placed in.
66 const Constant *C,
67 Align &Alignment) const override;
68
69 /// Similar to the function above, but append \p SectionSuffix to the section
70 /// name.
72 const Constant *C, Align &Alignment,
73 StringRef SectionSuffix) const override;
74
76 const TargetMachine &TM) const override;
77
79 const TargetMachine &TM) const override;
80
82 const TargetMachine &TM) const override;
83 MCSection *
85 const MachineJumpTableEntry *JTE) const override;
86 MCSection *getSectionForLSDA(const Function &F, const MCSymbol &FnSym,
87 const TargetMachine &TM) const override;
88
89 MCSection *
92 const TargetMachine &TM) const override;
93
94 MCSection *
96 const TargetMachine &TM) const override;
97
98 bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference,
99 const Function &F) const override;
100
101 /// Return an MCExpr to use for a reference to the specified type info global
102 /// variable from exception handling information.
104 unsigned Encoding,
105 const TargetMachine &TM,
107 MCStreamer &Streamer) const override;
108
109 // The symbol that gets passed to .cfi_personality.
111 const TargetMachine &TM,
112 MachineModuleInfo *MMI) const override;
113
114 void InitializeELF(bool UseInitArray_);
115 MCSection *getStaticCtorSection(unsigned Priority,
116 const MCSymbol *KeySym) const override;
117 MCSection *getStaticDtorSection(unsigned Priority,
118 const MCSymbol *KeySym) const override;
119
120 const MCExpr *
122 int64_t Addend,
123 std::optional<int64_t> PCRelativeOffset) const;
124
126 const MCSymbol *RHS, int64_t Addend,
127 std::optional<int64_t> PCRelativeOffset,
128 const TargetMachine &TM) const override;
129
130 MCSection *getSectionForCommandLines() const override;
131};
132
134public:
136 ~TargetLoweringObjectFileMachO() override = default;
137
138 void Initialize(MCContext &Ctx, const TargetMachine &TM) override;
139
140 MCSection *getStaticDtorSection(unsigned Priority,
141 const MCSymbol *KeySym) const override;
142
143 /// Emit the module flags that specify the garbage collection information.
144 void emitModuleMetadata(MCStreamer &Streamer, Module &M) const override;
145
146 void emitLinkerDirectives(MCStreamer &Streamer, Module &M) const override;
147
149 const TargetMachine &TM) const override;
150
152 const TargetMachine &TM) const override;
153
155 const Constant *C,
156 Align &Alignment) const override;
157
158 /// The mach-o version of this method defaults to returning a stub reference.
160 unsigned Encoding,
161 const TargetMachine &TM,
163 MCStreamer &Streamer) const override;
164
165 // The symbol that gets passed to .cfi_personality.
167 const TargetMachine &TM,
168 MachineModuleInfo *MMI) const override;
169
170 /// Get MachO PC relative GOT entry relocation
172 const MCSymbol *Sym,
173 const MCValue &MV, int64_t Offset,
175 MCStreamer &Streamer) const override;
176
177 void getNameWithPrefix(SmallVectorImpl<char> &OutName, const GlobalValue *GV,
178 const TargetMachine &TM) const override;
179
180 MCSection *getSectionForCommandLines() const override;
181};
182
184 mutable unsigned NextUniqueID = 0;
185 const TargetMachine *TM = nullptr;
186
187public:
188 ~TargetLoweringObjectFileCOFF() override = default;
189
190 void Initialize(MCContext &Ctx, const TargetMachine &TM) override;
192 const TargetMachine &TM) const override;
193
195 const TargetMachine &TM) const override;
196
197 void getNameWithPrefix(SmallVectorImpl<char> &OutName, const GlobalValue *GV,
198 const TargetMachine &TM) const override;
199
201 const TargetMachine &TM) const override;
202
203 bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference,
204 const Function &F) const override;
205
206 /// Emit Obj-C garbage collection and linker options.
207 void emitModuleMetadata(MCStreamer &Streamer, Module &M) const override;
208
209 void emitLinkerDirectives(MCStreamer &Streamer, Module &M) const override;
210
211 MCSection *getStaticCtorSection(unsigned Priority,
212 const MCSymbol *KeySym) const override;
213 MCSection *getStaticDtorSection(unsigned Priority,
214 const MCSymbol *KeySym) const override;
215
217 const GlobalValue *RHS, int64_t Addend,
218 std::optional<int64_t> PCRelativeOffset,
219 const TargetMachine &TM) const override;
220
221 /// Given a mergeable constant with the specified size and relocation
222 /// information, return a section that it should be placed in.
224 const Constant *C,
225 Align &Alignment) const override;
226};
227
229 mutable unsigned NextUniqueID = 0;
231
232public:
234 ~TargetLoweringObjectFileWasm() override = default;
235
236 void getModuleMetadata(Module &M) override;
237
239 const TargetMachine &TM) const override;
240
242 const TargetMachine &TM) const override;
243
244 bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference,
245 const Function &F) const override;
246
247 void InitializeWasm();
248 MCSection *getStaticCtorSection(unsigned Priority,
249 const MCSymbol *KeySym) const override;
250 MCSection *getStaticDtorSection(unsigned Priority,
251 const MCSymbol *KeySym) const override;
252};
253
255public:
257 ~TargetLoweringObjectFileXCOFF() override = default;
258
259 static bool ShouldEmitEHBlock(const MachineFunction *MF);
260 static bool ShouldSetSSPCanaryBitInTB(const MachineFunction *MF);
261
263
264 void Initialize(MCContext &Ctx, const TargetMachine &TM) override;
265
266 bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference,
267 const Function &F) const override;
268
270 const TargetMachine &TM) const override;
271
272 MCSection *getStaticCtorSection(unsigned Priority,
273 const MCSymbol *KeySym) const override;
274 MCSection *getStaticDtorSection(unsigned Priority,
275 const MCSymbol *KeySym) const override;
276
278 const TargetMachine &TM) const override;
279
281 const TargetMachine &TM) const override;
282
283 /// Given a constant with the SectionKind, return a section that it should be
284 /// placed in.
286 const Constant *C,
287 Align &Alignment) const override;
288
290
291 MCSection *
293 const TargetMachine &TM) const override;
295 const TargetMachine &TM) const override;
296
297 /// For external functions, this will always return a function descriptor
298 /// csect.
299 MCSection *
301 const TargetMachine &TM) const override;
302
303 /// For functions, this will always return a function descriptor symbol.
305 const TargetMachine &TM) const override;
306
308 const TargetMachine &TM) const override;
309
310 /// For functions, this will return the LSDA section. If option
311 /// -ffunction-sections is on, this will return a unique csect with the
312 /// function name appended to .gcc_except_table as a suffix of the LSDA
313 /// section name.
314 MCSection *getSectionForLSDA(const Function &F, const MCSymbol &FnSym,
315 const TargetMachine &TM) const override;
316};
317
319 std::string DefaultRootSDName;
320 std::string DefaultADAPRName;
321
322public:
324 ~TargetLoweringObjectFileGOFF() override = default;
325
326 void getModuleMetadata(Module &M) override;
327
329 const TargetMachine &TM) const override;
331 const TargetMachine &TM) const override;
332 MCSection *getSectionForLSDA(const Function &F, const MCSymbol &FnSym,
333 const TargetMachine &TM) const override;
334};
335
336} // end namespace llvm
337
338#endif // LLVM_CODEGEN_TARGETLOWERINGOBJECTFILEIMPL_H
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
#define F(x, y, z)
Definition MD5.cpp:55
This file defines the SmallPtrSet class.
Value * RHS
Value * LHS
This is an important base class in LLVM.
Definition Constant.h:43
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:63
Context object for machine code objects.
Definition MCContext.h:83
Base class for the full range of assembler expressions which are needed for parsing.
Definition MCExpr.h:34
Instances of this class represent a uniqued identifier for a section in the current translation unit.
Definition MCSection.h:496
Streaming machine code generation interface.
Definition MCStreamer.h:220
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition MCSymbol.h:42
This class contains meta information specific to a module.
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
SectionKind - This is a simple POD value that classifies the properties of a section.
Definition SectionKind.h:22
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
MCSection * getExplicitSectionGlobal(const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const override
Targets should implement this method to assign a section to globals with an explicit section specfied...
MCSection * getSectionForConstant(const DataLayout &DL, SectionKind Kind, const Constant *C, Align &Alignment) const override
Given a mergeable constant with the specified size and relocation information, return a section that ...
void Initialize(MCContext &Ctx, const TargetMachine &TM) override
This method must be called before any actual lowering is done.
void emitModuleMetadata(MCStreamer &Streamer, Module &M) const override
Emit Obj-C garbage collection and linker options.
MCSection * SelectSectionForGlobal(const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const override
MCSection * getStaticCtorSection(unsigned Priority, const MCSymbol *KeySym) const override
void emitLinkerDirectives(MCStreamer &Streamer, Module &M) const override
Process linker options metadata and emit platform-specific bits.
const MCExpr * lowerRelativeReference(const GlobalValue *LHS, const GlobalValue *RHS, int64_t Addend, std::optional< int64_t > PCRelativeOffset, const TargetMachine &TM) const override
bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference, const Function &F) const override
void getNameWithPrefix(SmallVectorImpl< char > &OutName, const GlobalValue *GV, const TargetMachine &TM) const override
~TargetLoweringObjectFileCOFF() override=default
MCSection * getStaticDtorSection(unsigned Priority, const MCSymbol *KeySym) const override
MCSection * getSectionForJumpTable(const Function &F, const TargetMachine &TM) const override
MCSection * getUniqueSectionForFunction(const Function &F, const TargetMachine &TM) const override
void Initialize(MCContext &Ctx, const TargetMachine &TM) override
This method must be called before any actual lowering is done.
MCSection * getSectionForConstant(const DataLayout &DL, SectionKind Kind, const Constant *C, Align &Alignment) const override
Given a constant with the SectionKind, return a section that it should be placed in.
MCSection * getStaticCtorSection(unsigned Priority, const MCSymbol *KeySym) const override
~TargetLoweringObjectFileELF() override=default
MCSection * getSectionForJumpTable(const Function &F, const TargetMachine &TM) const override
void emitModuleMetadata(MCStreamer &Streamer, Module &M) const override
Emit Obj-C garbage collection and linker options.
void emitLinkerDirectives(MCStreamer &Streamer, Module &M) const override
Process linker options metadata and emit platform-specific bits.
MCSymbol * getCFIPersonalitySymbol(const GlobalValue *GV, const TargetMachine &TM, MachineModuleInfo *MMI) const override
MCSection * getStaticDtorSection(unsigned Priority, const MCSymbol *KeySym) const override
void emitPersonalityValue(MCStreamer &Streamer, const DataLayout &DL, const MCSymbol *Sym, const MachineModuleInfo *MMI) const override
const MCExpr * getTTypeGlobalReference(const GlobalValue *GV, unsigned Encoding, const TargetMachine &TM, MachineModuleInfo *MMI, MCStreamer &Streamer) const override
Return an MCExpr to use for a reference to the specified type info global variable from exception han...
void getModuleMetadata(Module &M) override
Get the module-level metadata that the platform cares about.
MCSection * SelectSectionForGlobal(const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const override
const MCExpr * lowerSymbolDifference(const MCSymbol *LHS, const MCSymbol *RHS, int64_t Addend, std::optional< int64_t > PCRelativeOffset) const
const MCExpr * lowerDSOLocalEquivalent(const MCSymbol *LHS, const MCSymbol *RHS, int64_t Addend, std::optional< int64_t > PCRelativeOffset, const TargetMachine &TM) const override
MCSection * getSectionForCommandLines() const override
If supported, return the section to use for the llvm.commandline metadata.
MCSection * getSectionForLSDA(const Function &F, const MCSymbol &FnSym, const TargetMachine &TM) const override
virtual void emitPersonalityValueImpl(MCStreamer &Streamer, const DataLayout &DL, const MCSymbol *Sym, const MachineModuleInfo *MMI) const
bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference, const Function &F) const override
MCSection * getSectionForMachineBasicBlock(const Function &F, const MachineBasicBlock &MBB, const TargetMachine &TM) const override
Returns a unique section for the given machine basic block.
MCSection * getExplicitSectionGlobal(const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const override
Targets should implement this method to assign a section to globals with an explicit section specfied...
MCSection * getExplicitSectionGlobal(const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const override
Targets should implement this method to assign a section to globals with an explicit section specfied...
MCSection * getSectionForLSDA(const Function &F, const MCSymbol &FnSym, const TargetMachine &TM) const override
void getModuleMetadata(Module &M) override
Get the module-level metadata that the platform cares about.
MCSection * SelectSectionForGlobal(const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const override
~TargetLoweringObjectFileGOFF() override=default
~TargetLoweringObjectFileMachO() override=default
MCSection * getSectionForConstant(const DataLayout &DL, SectionKind Kind, const Constant *C, Align &Alignment) const override
Given a constant with the SectionKind, return a section that it should be placed in.
void getNameWithPrefix(SmallVectorImpl< char > &OutName, const GlobalValue *GV, const TargetMachine &TM) const override
MCSymbol * getCFIPersonalitySymbol(const GlobalValue *GV, const TargetMachine &TM, MachineModuleInfo *MMI) const override
MCSection * SelectSectionForGlobal(const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const override
void emitLinkerDirectives(MCStreamer &Streamer, Module &M) const override
Process linker options metadata and emit platform-specific bits.
MCSection * getExplicitSectionGlobal(const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const override
Targets should implement this method to assign a section to globals with an explicit section specfied...
const MCExpr * getIndirectSymViaGOTPCRel(const GlobalValue *GV, const MCSymbol *Sym, const MCValue &MV, int64_t Offset, MachineModuleInfo *MMI, MCStreamer &Streamer) const override
Get MachO PC relative GOT entry relocation.
void emitModuleMetadata(MCStreamer &Streamer, Module &M) const override
Emit the module flags that specify the garbage collection information.
void Initialize(MCContext &Ctx, const TargetMachine &TM) override
This method must be called before any actual lowering is done.
MCSection * getSectionForCommandLines() const override
If supported, return the section to use for the llvm.commandline metadata.
MCSection * getStaticDtorSection(unsigned Priority, const MCSymbol *KeySym) const override
const MCExpr * getTTypeGlobalReference(const GlobalValue *GV, unsigned Encoding, const TargetMachine &TM, MachineModuleInfo *MMI, MCStreamer &Streamer) const override
The mach-o version of this method defaults to returning a stub reference.
void getModuleMetadata(Module &M) override
Get the module-level metadata that the platform cares about.
MCSection * getStaticCtorSection(unsigned Priority, const MCSymbol *KeySym) const override
~TargetLoweringObjectFileWasm() override=default
bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference, const Function &F) const override
MCSection * getStaticDtorSection(unsigned Priority, const MCSymbol *KeySym) const override
MCSection * getExplicitSectionGlobal(const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const override
Targets should implement this method to assign a section to globals with an explicit section specfied...
MCSection * SelectSectionForGlobal(const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const override
static bool ShouldSetSSPCanaryBitInTB(const MachineFunction *MF)
void Initialize(MCContext &Ctx, const TargetMachine &TM) override
This method must be called before any actual lowering is done.
MCSection * getSectionForTOCEntry(const MCSymbol *Sym, const TargetMachine &TM) const override
On targets that support TOC entries, return a section for the entry given the symbol it refers to.
MCSection * getSectionForExternalReference(const GlobalObject *GO, const TargetMachine &TM) const override
For external functions, this will always return a function descriptor csect.
MCSymbol * getFunctionEntryPointSymbol(const GlobalValue *Func, const TargetMachine &TM) const override
If supported, return the function entry point symbol.
bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference, const Function &F) const override
MCSection * getSectionForJumpTable(const Function &F, const TargetMachine &TM) const override
static MCSymbol * getEHInfoTableSymbol(const MachineFunction *MF)
MCSection * getExplicitSectionGlobal(const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const override
Targets should implement this method to assign a section to globals with an explicit section specfied...
~TargetLoweringObjectFileXCOFF() override=default
MCSection * getStaticCtorSection(unsigned Priority, const MCSymbol *KeySym) const override
static XCOFF::StorageClass getStorageClassForGlobal(const GlobalValue *GV)
MCSection * getSectionForConstant(const DataLayout &DL, SectionKind Kind, const Constant *C, Align &Alignment) const override
Given a constant with the SectionKind, return a section that it should be placed in.
MCSymbol * getTargetSymbol(const GlobalValue *GV, const TargetMachine &TM) const override
For functions, this will always return a function descriptor symbol.
MCSection * getSectionForFunctionDescriptor(const Function *F, const TargetMachine &TM) const override
On targets that use separate function descriptor symbols, return a section for the descriptor given i...
static bool ShouldEmitEHBlock(const MachineFunction *MF)
MCSection * SelectSectionForGlobal(const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const override
MCSection * getStaticDtorSection(unsigned Priority, const MCSymbol *KeySym) const override
MCSection * getSectionForLSDA(const Function &F, const MCSymbol &FnSym, const TargetMachine &TM) const override
For functions, this will return the LSDA section.
Primary interface to the complete machine description for the target machine.
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:477
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
MachineJumpTableEntry - One jump table in the jump table info.