LLVM 24.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, Align &Alignment,
67 const Function *F) 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 const Function *F,
74 StringRef SectionSuffix) const override;
75
77 const TargetMachine &TM) const override;
78
80 const TargetMachine &TM) const override;
81
83 const TargetMachine &TM) const override;
84 MCSection *
86 const MachineJumpTableEntry *JTE) const override;
87 MCSection *getSectionForLSDA(const Function &F, const MCSymbol &FnSym,
88 const TargetMachine &TM) const override;
89
90 MCSection *
93 const TargetMachine &TM) const override;
94
95 MCSection *
97 const TargetMachine &TM) const override;
98
99 bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference,
100 const Function &F) const override;
101
102 /// Return an MCExpr to use for a reference to the specified type info global
103 /// variable from exception handling information.
105 unsigned Encoding,
106 const TargetMachine &TM,
108 MCStreamer &Streamer) const override;
109
110 // The symbol that gets passed to .cfi_personality.
112 const TargetMachine &TM,
113 MachineModuleInfo *MMI) const override;
114
115 void InitializeELF(bool UseInitArray_);
116 MCSection *getStaticCtorSection(unsigned Priority,
117 const MCSymbol *KeySym) const override;
118 MCSection *getStaticDtorSection(unsigned Priority,
119 const MCSymbol *KeySym) const override;
120
121 const MCExpr *
123 int64_t Addend,
124 std::optional<int64_t> PCRelativeOffset) const;
125
127 const MCSymbol *RHS, int64_t Addend,
128 std::optional<int64_t> PCRelativeOffset,
129 const TargetMachine &TM) const override;
130
131 MCSection *getSectionForCommandLines() const override;
132};
133
135public:
137 ~TargetLoweringObjectFileMachO() override = default;
138
139 void Initialize(MCContext &Ctx, const TargetMachine &TM) override;
140
141 MCSection *getStaticDtorSection(unsigned Priority,
142 const MCSymbol *KeySym) const override;
143
144 /// Emit the module flags that specify the garbage collection information.
145 void emitModuleMetadata(MCStreamer &Streamer, Module &M) const override;
146
147 void emitLinkerDirectives(MCStreamer &Streamer, Module &M) const override;
148
150 const TargetMachine &TM) const override;
151
153 const TargetMachine &TM) const override;
154
156 const Constant *C, Align &Alignment,
157 const Function *F) const override;
158
159 /// The mach-o version of this method defaults to returning a stub reference.
161 unsigned Encoding,
162 const TargetMachine &TM,
164 MCStreamer &Streamer) const override;
165
166 // The symbol that gets passed to .cfi_personality.
168 const TargetMachine &TM,
169 MachineModuleInfo *MMI) const override;
170
171 /// Get MachO PC relative GOT entry relocation
173 const MCSymbol *Sym,
174 const MCValue &MV, int64_t Offset,
176 MCStreamer &Streamer) const override;
177
178 void getNameWithPrefix(SmallVectorImpl<char> &OutName, const GlobalValue *GV,
179 const TargetMachine &TM) const override;
180
181 MCSection *getSectionForCommandLines() const override;
182};
183
185 mutable unsigned NextUniqueID = 0;
186 const TargetMachine *TM = nullptr;
187
188public:
189 ~TargetLoweringObjectFileCOFF() override = default;
190
191 void Initialize(MCContext &Ctx, const TargetMachine &TM) override;
193 const TargetMachine &TM) const override;
194
196 const TargetMachine &TM) const override;
197
198 void getNameWithPrefix(SmallVectorImpl<char> &OutName, const GlobalValue *GV,
199 const TargetMachine &TM) const override;
200
202 const TargetMachine &TM) const override;
203
204 bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference,
205 const Function &F) const override;
206
207 /// Emit Obj-C garbage collection and linker options.
208 void emitModuleMetadata(MCStreamer &Streamer, Module &M) const override;
209
210 void emitLinkerDirectives(MCStreamer &Streamer, Module &M) const override;
211
212 MCSection *getStaticCtorSection(unsigned Priority,
213 const MCSymbol *KeySym) const override;
214 MCSection *getStaticDtorSection(unsigned Priority,
215 const MCSymbol *KeySym) const override;
216
218 const GlobalValue *RHS, int64_t Addend,
219 std::optional<int64_t> PCRelativeOffset,
220 const TargetMachine &TM) const override;
221
222 /// Given a mergeable constant with the specified size and relocation
223 /// information, return a section that it should be placed in.
225 const Constant *C, Align &Alignment,
226 const Function *F) const override;
227};
228
230 mutable unsigned NextUniqueID = 0;
232
233public:
235 ~TargetLoweringObjectFileWasm() override = default;
236
237 void getModuleMetadata(Module &M) override;
238
240 const TargetMachine &TM) const override;
241
243 const TargetMachine &TM) const override;
244
245 bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference,
246 const Function &F) const override;
247
248 void InitializeWasm();
249 MCSection *getStaticCtorSection(unsigned Priority,
250 const MCSymbol *KeySym) const override;
251 MCSection *getStaticDtorSection(unsigned Priority,
252 const MCSymbol *KeySym) const override;
253};
254
256public:
258 ~TargetLoweringObjectFileXCOFF() override = default;
259
260 static bool ShouldEmitEHBlock(const MachineFunction *MF);
261 static bool ShouldSetSSPCanaryBitInTB(const MachineFunction *MF);
262
264
265 void Initialize(MCContext &Ctx, const TargetMachine &TM) override;
266
267 bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference,
268 const Function &F) const override;
269
271 const TargetMachine &TM) const override;
272
273 MCSection *getStaticCtorSection(unsigned Priority,
274 const MCSymbol *KeySym) const override;
275 MCSection *getStaticDtorSection(unsigned Priority,
276 const MCSymbol *KeySym) const override;
277
279 const TargetMachine &TM) const override;
280
282 const TargetMachine &TM) const override;
283
284 /// Given a constant with the SectionKind, return a section that it should be
285 /// placed in.
287 const Constant *C, Align &Alignment,
288 const Function *F) const override;
289
291
292 MCSection *
294 const TargetMachine &TM) const override;
296 const TargetMachine &TM) const override;
297
298 /// For external functions, this will always return a function descriptor
299 /// csect.
300 MCSection *
302 const TargetMachine &TM) const override;
303
304 /// For functions, this will always return a function descriptor symbol.
306 const TargetMachine &TM) const override;
307
309 const TargetMachine &TM) const override;
310
311 /// For functions, this will return the LSDA section. If option
312 /// -ffunction-sections is on, this will return a unique csect with the
313 /// function name appended to .gcc_except_table as a suffix of the LSDA
314 /// section name.
315 MCSection *getSectionForLSDA(const Function &F, const MCSymbol &FnSym,
316 const TargetMachine &TM) const override;
317};
318
320 std::string DefaultRootSDName;
321 std::string DefaultADAPRName;
322
323public:
325 ~TargetLoweringObjectFileGOFF() override = default;
326
327 void getModuleMetadata(Module &M) override;
328
329 bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference,
330 const Function &F) const override;
332 const TargetMachine &TM) const override;
334 const TargetMachine &TM) const override;
335 MCSection *getSectionForLSDA(const Function &F, const MCSymbol &FnSym,
336 const TargetMachine &TM) const override;
337 MCSection *getStaticXtorSection(unsigned Priority) const;
338};
339
340} // end namespace llvm
341
342#endif // LLVM_CODEGEN_TARGETLOWERINGOBJECTFILEIMPL_H
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
#define LLVM_ABI
Definition Compiler.h:215
#define F(x, y, z)
Definition MD5.cpp:54
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:64
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:573
Streaming machine code generation interface.
Definition MCStreamer.h:222
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...
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
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...
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 * getSectionForConstant(const DataLayout &DL, SectionKind Kind, const Constant *C, Align &Alignment, const Function *F) const override
Given a mergeable constant with the specified size and relocation information, return a section that ...
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 * 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 * getSectionForConstant(const DataLayout &DL, SectionKind Kind, const Constant *C, Align &Alignment, const Function *F) const override
Given a constant with the SectionKind, return a section that it should be placed in.
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 * getStaticXtorSection(unsigned Priority) const
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
bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference, const Function &F) const override
~TargetLoweringObjectFileMachO() override=default
void getNameWithPrefix(SmallVectorImpl< char > &OutName, const GlobalValue *GV, const TargetMachine &TM) const override
MCSection * getSectionForConstant(const DataLayout &DL, SectionKind Kind, const Constant *C, Align &Alignment, const Function *F) const override
Given a constant with the SectionKind, return a section that it should be placed in.
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 * getSectionForConstant(const DataLayout &DL, SectionKind Kind, const Constant *C, Align &Alignment, const Function *F) const override
Given a constant with the SectionKind, return a section that it should be placed in.
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)
MCSymbol * getTargetSymbol(const GlobalValue *GV, const TargetMachine &TM) const override
For functions, this will always return a function descriptor symbol.
MCSection * getSectionForFunctionDescriptor(const GlobalObject *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.
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:578
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.