LLVM 20.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;
25class MachineModuleInfo;
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:
42
43public:
45 ~TargetLoweringObjectFileELF() override = default;
46
47 void Initialize(MCContext &Ctx, const TargetMachine &TM) override;
48
49 void getModuleMetadata(Module &M) override;
50
51 /// Emit Obj-C garbage collection and linker options.
52 void emitModuleMetadata(MCStreamer &Streamer, Module &M) const override;
53
54 void emitPersonalityValue(MCStreamer &Streamer, const DataLayout &DL,
55 const MCSymbol *Sym,
56 const MachineModuleInfo *MMI) const override;
57
58 virtual void emitPersonalityValueImpl(MCStreamer &Streamer,
59 const DataLayout &DL,
60 const MCSymbol *Sym,
61 const MachineModuleInfo *MMI) const;
62
63 void emitLinkerDirectives(MCStreamer &Streamer, Module &M) const override;
64
65 /// Given a constant with the SectionKind, return a section that it should be
66 /// placed in.
68 const Constant *C,
69 Align &Alignment) const override;
70
72 const TargetMachine &TM) const override;
73
75 const TargetMachine &TM) const override;
76
78 const TargetMachine &TM) const override;
79 MCSection *getSectionForLSDA(const Function &F, const MCSymbol &FnSym,
80 const TargetMachine &TM) const override;
81
82 MCSection *
85 const TargetMachine &TM) const override;
86
87 MCSection *
89 const TargetMachine &TM) const override;
90
91 bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference,
92 const Function &F) const override;
93
94 /// Return an MCExpr to use for a reference to the specified type info global
95 /// variable from exception handling information.
97 unsigned Encoding,
98 const TargetMachine &TM,
100 MCStreamer &Streamer) const override;
101
102 // The symbol that gets passed to .cfi_personality.
104 const TargetMachine &TM,
105 MachineModuleInfo *MMI) const override;
106
107 void InitializeELF(bool UseInitArray_);
108 MCSection *getStaticCtorSection(unsigned Priority,
109 const MCSymbol *KeySym) const override;
110 MCSection *getStaticDtorSection(unsigned Priority,
111 const MCSymbol *KeySym) const override;
112
114 const GlobalValue *RHS,
115 const TargetMachine &TM) const override;
116
118 const TargetMachine &TM) const override;
119
120 MCSection *getSectionForCommandLines() const override;
121};
122
124public:
126 ~TargetLoweringObjectFileMachO() override = default;
127
128 void Initialize(MCContext &Ctx, const TargetMachine &TM) override;
129
130 MCSection *getStaticDtorSection(unsigned Priority,
131 const MCSymbol *KeySym) const override;
132
133 /// Emit the module flags that specify the garbage collection information.
134 void emitModuleMetadata(MCStreamer &Streamer, Module &M) const override;
135
136 void emitLinkerDirectives(MCStreamer &Streamer, Module &M) const override;
137
139 const TargetMachine &TM) const override;
140
142 const TargetMachine &TM) const override;
143
145 const Constant *C,
146 Align &Alignment) const override;
147
148 /// The mach-o version of this method defaults to returning a stub reference.
150 unsigned Encoding,
151 const TargetMachine &TM,
153 MCStreamer &Streamer) const override;
154
155 // The symbol that gets passed to .cfi_personality.
157 const TargetMachine &TM,
158 MachineModuleInfo *MMI) const override;
159
160 /// Get MachO PC relative GOT entry relocation
162 const MCSymbol *Sym,
163 const MCValue &MV, int64_t Offset,
165 MCStreamer &Streamer) const override;
166
167 void getNameWithPrefix(SmallVectorImpl<char> &OutName, const GlobalValue *GV,
168 const TargetMachine &TM) const override;
169
170 MCSection *getSectionForCommandLines() const override;
171};
172
174 mutable unsigned NextUniqueID = 0;
175 const TargetMachine *TM = nullptr;
176
177public:
178 ~TargetLoweringObjectFileCOFF() override = default;
179
180 void Initialize(MCContext &Ctx, const TargetMachine &TM) override;
182 const TargetMachine &TM) const override;
183
185 const TargetMachine &TM) const override;
186
187 void getNameWithPrefix(SmallVectorImpl<char> &OutName, const GlobalValue *GV,
188 const TargetMachine &TM) const override;
189
191 const TargetMachine &TM) const override;
192
193 bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference,
194 const Function &F) const override;
195
196 /// Emit Obj-C garbage collection and linker options.
197 void emitModuleMetadata(MCStreamer &Streamer, Module &M) const override;
198
199 void emitLinkerDirectives(MCStreamer &Streamer, Module &M) const override;
200
201 MCSection *getStaticCtorSection(unsigned Priority,
202 const MCSymbol *KeySym) const override;
203 MCSection *getStaticDtorSection(unsigned Priority,
204 const MCSymbol *KeySym) const override;
205
207 const GlobalValue *RHS,
208 const TargetMachine &TM) const override;
209
210 /// Given a mergeable constant with the specified size and relocation
211 /// information, return a section that it should be placed in.
213 const Constant *C,
214 Align &Alignment) const override;
215};
216
218 mutable unsigned NextUniqueID = 0;
220
221public:
223 ~TargetLoweringObjectFileWasm() override = default;
224
225 void getModuleMetadata(Module &M) override;
226
228 const TargetMachine &TM) const override;
229
231 const TargetMachine &TM) const override;
232
233 bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference,
234 const Function &F) const override;
235
236 void InitializeWasm();
237 MCSection *getStaticCtorSection(unsigned Priority,
238 const MCSymbol *KeySym) const override;
239 MCSection *getStaticDtorSection(unsigned Priority,
240 const MCSymbol *KeySym) const override;
241
243 const GlobalValue *RHS,
244 const TargetMachine &TM) const override;
245};
246
248public:
250 ~TargetLoweringObjectFileXCOFF() override = default;
251
252 static bool ShouldEmitEHBlock(const MachineFunction *MF);
253 static bool ShouldSetSSPCanaryBitInTB(const MachineFunction *MF);
254
256
257 void Initialize(MCContext &Ctx, const TargetMachine &TM) override;
258
259 bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference,
260 const Function &F) const override;
261
263 const TargetMachine &TM) const override;
264
265 MCSection *getStaticCtorSection(unsigned Priority,
266 const MCSymbol *KeySym) const override;
267 MCSection *getStaticDtorSection(unsigned Priority,
268 const MCSymbol *KeySym) const override;
269
271 const GlobalValue *RHS,
272 const TargetMachine &TM) const override;
273
275 const TargetMachine &TM) const override;
276
278 const TargetMachine &TM) const override;
279
280 /// Given a constant with the SectionKind, return a section that it should be
281 /// placed in.
283 const Constant *C,
284 Align &Alignment) const override;
285
287
288 MCSection *
290 const TargetMachine &TM) const override;
292 const TargetMachine &TM) const override;
293
294 /// For external functions, this will always return a function descriptor
295 /// csect.
296 MCSection *
298 const TargetMachine &TM) const override;
299
300 /// For functions, this will always return a function descriptor symbol.
302 const TargetMachine &TM) const override;
303
305 const TargetMachine &TM) const override;
306
307 /// For functions, this will return the LSDA section. If option
308 /// -ffunction-sections is on, this will return a unique csect with the
309 /// function name appended to .gcc_except_table as a suffix of the LSDA
310 /// section name.
311 MCSection *getSectionForLSDA(const Function &F, const MCSymbol &FnSym,
312 const TargetMachine &TM) const override;
313};
314
316public:
318 ~TargetLoweringObjectFileGOFF() override = default;
319
321 const TargetMachine &TM) const override;
323 const TargetMachine &TM) const override;
324 MCSection *getSectionForLSDA(const Function &F, const MCSymbol &FnSym,
325 const TargetMachine &TM) const override;
326};
327
328} // end namespace llvm
329
330#endif // LLVM_CODEGEN_TARGETLOWERINGOBJECTFILEIMPL_H
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
Symbol * Sym
Definition: ELF_riscv.cpp:479
#define F(x, y, z)
Definition: MD5.cpp:55
Machine Check Debug Module
This file defines the SmallPtrSet class.
Value * RHS
Value * LHS
This is an important base class in LLVM.
Definition: Constant.h:42
Wrapper for a function that represents a value that functionally represents the original function.
Definition: Constants.h:941
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:36
Streaming machine code generation interface.
Definition: MCStreamer.h:213
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
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:65
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.
Definition: SmallPtrSet.h:519
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Definition: SmallVector.h:573
const MCExpr * lowerRelativeReference(const GlobalValue *LHS, const GlobalValue *RHS, const TargetMachine &TM) 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 * 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.
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.
const MCExpr * lowerRelativeReference(const GlobalValue *LHS, const GlobalValue *RHS, const TargetMachine &TM) const override
MCSection * SelectSectionForGlobal(const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const override
const MCExpr * lowerDSOLocalEquivalent(const DSOLocalEquivalent *Equiv, 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.
MCSymbolRefExpr::VariantKind PLTRelativeVariantKind
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
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.
const MCExpr * lowerRelativeReference(const GlobalValue *LHS, const GlobalValue *RHS, const TargetMachine &TM) const override
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
const MCExpr * lowerRelativeReference(const GlobalValue *LHS, const GlobalValue *RHS, const TargetMachine &TM) 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.
Definition: TargetMachine.h:77
@ C
The default llvm calling convention, compatible with C.
Definition: CallingConv.h:34
StorageClass
Definition: XCOFF.h:170
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
@ Offset
Definition: DWP.cpp:480
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition: Alignment.h:39