LLVM 21.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 *
81 const MachineJumpTableEntry *JTE) const override;
82 MCSection *getSectionForLSDA(const Function &F, const MCSymbol &FnSym,
83 const TargetMachine &TM) const override;
84
85 MCSection *
88 const TargetMachine &TM) const override;
89
90 MCSection *
92 const TargetMachine &TM) const override;
93
94 bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference,
95 const Function &F) const override;
96
97 /// Return an MCExpr to use for a reference to the specified type info global
98 /// variable from exception handling information.
100 unsigned Encoding,
101 const TargetMachine &TM,
103 MCStreamer &Streamer) const override;
104
105 // The symbol that gets passed to .cfi_personality.
107 const TargetMachine &TM,
108 MachineModuleInfo *MMI) const override;
109
110 void InitializeELF(bool UseInitArray_);
111 MCSection *getStaticCtorSection(unsigned Priority,
112 const MCSymbol *KeySym) const override;
113 MCSection *getStaticDtorSection(unsigned Priority,
114 const MCSymbol *KeySym) const override;
115
117 const GlobalValue *RHS,
118 const TargetMachine &TM) const override;
119
121 const TargetMachine &TM) const override;
122
123 MCSection *getSectionForCommandLines() const override;
124};
125
127public:
129 ~TargetLoweringObjectFileMachO() override = default;
130
131 void Initialize(MCContext &Ctx, const TargetMachine &TM) override;
132
133 MCSection *getStaticDtorSection(unsigned Priority,
134 const MCSymbol *KeySym) const override;
135
136 /// Emit the module flags that specify the garbage collection information.
137 void emitModuleMetadata(MCStreamer &Streamer, Module &M) const override;
138
139 void emitLinkerDirectives(MCStreamer &Streamer, Module &M) const override;
140
142 const TargetMachine &TM) const override;
143
145 const TargetMachine &TM) const override;
146
148 const Constant *C,
149 Align &Alignment) const override;
150
151 /// The mach-o version of this method defaults to returning a stub reference.
153 unsigned Encoding,
154 const TargetMachine &TM,
156 MCStreamer &Streamer) const override;
157
158 // The symbol that gets passed to .cfi_personality.
160 const TargetMachine &TM,
161 MachineModuleInfo *MMI) const override;
162
163 /// Get MachO PC relative GOT entry relocation
165 const MCSymbol *Sym,
166 const MCValue &MV, int64_t Offset,
168 MCStreamer &Streamer) const override;
169
170 void getNameWithPrefix(SmallVectorImpl<char> &OutName, const GlobalValue *GV,
171 const TargetMachine &TM) const override;
172
173 MCSection *getSectionForCommandLines() const override;
174};
175
177 mutable unsigned NextUniqueID = 0;
178 const TargetMachine *TM = nullptr;
179
180public:
181 ~TargetLoweringObjectFileCOFF() override = default;
182
183 void Initialize(MCContext &Ctx, const TargetMachine &TM) override;
185 const TargetMachine &TM) const override;
186
188 const TargetMachine &TM) const override;
189
190 void getNameWithPrefix(SmallVectorImpl<char> &OutName, const GlobalValue *GV,
191 const TargetMachine &TM) const override;
192
194 const TargetMachine &TM) const override;
195
196 bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference,
197 const Function &F) const override;
198
199 /// Emit Obj-C garbage collection and linker options.
200 void emitModuleMetadata(MCStreamer &Streamer, Module &M) const override;
201
202 void emitLinkerDirectives(MCStreamer &Streamer, Module &M) const override;
203
204 MCSection *getStaticCtorSection(unsigned Priority,
205 const MCSymbol *KeySym) const override;
206 MCSection *getStaticDtorSection(unsigned Priority,
207 const MCSymbol *KeySym) const override;
208
210 const GlobalValue *RHS,
211 const TargetMachine &TM) const override;
212
213 /// Given a mergeable constant with the specified size and relocation
214 /// information, return a section that it should be placed in.
216 const Constant *C,
217 Align &Alignment) const override;
218};
219
221 mutable unsigned NextUniqueID = 0;
223
224public:
226 ~TargetLoweringObjectFileWasm() override = default;
227
228 void getModuleMetadata(Module &M) override;
229
231 const TargetMachine &TM) const override;
232
234 const TargetMachine &TM) const override;
235
236 bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference,
237 const Function &F) const override;
238
239 void InitializeWasm();
240 MCSection *getStaticCtorSection(unsigned Priority,
241 const MCSymbol *KeySym) const override;
242 MCSection *getStaticDtorSection(unsigned Priority,
243 const MCSymbol *KeySym) const override;
244
246 const GlobalValue *RHS,
247 const TargetMachine &TM) const override;
248};
249
251public:
253 ~TargetLoweringObjectFileXCOFF() override = default;
254
255 static bool ShouldEmitEHBlock(const MachineFunction *MF);
256 static bool ShouldSetSSPCanaryBitInTB(const MachineFunction *MF);
257
259
260 void Initialize(MCContext &Ctx, const TargetMachine &TM) override;
261
262 bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference,
263 const Function &F) const override;
264
266 const TargetMachine &TM) const override;
267
268 MCSection *getStaticCtorSection(unsigned Priority,
269 const MCSymbol *KeySym) const override;
270 MCSection *getStaticDtorSection(unsigned Priority,
271 const MCSymbol *KeySym) const override;
272
274 const GlobalValue *RHS,
275 const TargetMachine &TM) 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
319public:
321 ~TargetLoweringObjectFileGOFF() override = default;
322
324 const TargetMachine &TM) const override;
326 const TargetMachine &TM) const override;
327 MCSection *getSectionForLSDA(const Function &F, const MCSymbol &FnSym,
328 const TargetMachine &TM) const override;
329};
330
331} // end namespace llvm
332
333#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
MachineJumpTableEntry - One jump table in the jump table info.