LLVM 23.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
#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:516
Streaming machine code generation interface.
Definition MCStreamer.h:221
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...
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.
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
This is an optimization pass for GlobalISel generic memory operations.
Definition Types.h:26
@ Offset
Definition DWP.cpp:532
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.