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 /// 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
70 const TargetMachine &TM) const override;
71
73 const TargetMachine &TM) const override;
74
76 const TargetMachine &TM) const override;
77 MCSection *getSectionForLSDA(const Function &F, const MCSymbol &FnSym,
78 const TargetMachine &TM) const override;
79
80 MCSection *
83 const TargetMachine &TM) const override;
84
85 MCSection *
87 const TargetMachine &TM) const override;
88
89 bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference,
90 const Function &F) const override;
91
92 /// Return an MCExpr to use for a reference to the specified type info global
93 /// variable from exception handling information.
95 unsigned Encoding,
96 const TargetMachine &TM,
98 MCStreamer &Streamer) const override;
99
100 // The symbol that gets passed to .cfi_personality.
102 const TargetMachine &TM,
103 MachineModuleInfo *MMI) const override;
104
105 void InitializeELF(bool UseInitArray_);
106 MCSection *getStaticCtorSection(unsigned Priority,
107 const MCSymbol *KeySym) const override;
108 MCSection *getStaticDtorSection(unsigned Priority,
109 const MCSymbol *KeySym) const override;
110
112 const GlobalValue *RHS,
113 const TargetMachine &TM) const override;
114
116 const TargetMachine &TM) const override;
117
118 MCSection *getSectionForCommandLines() const override;
119};
120
122public:
124 ~TargetLoweringObjectFileMachO() override = default;
125
126 void Initialize(MCContext &Ctx, const TargetMachine &TM) override;
127
128 MCSection *getStaticDtorSection(unsigned Priority,
129 const MCSymbol *KeySym) const override;
130
131 /// Emit the module flags that specify the garbage collection information.
132 void emitModuleMetadata(MCStreamer &Streamer, Module &M) const override;
133
135 const TargetMachine &TM) const override;
136
138 const TargetMachine &TM) const override;
139
141 const Constant *C,
142 Align &Alignment) const override;
143
144 /// The mach-o version of this method defaults to returning a stub reference.
146 unsigned Encoding,
147 const TargetMachine &TM,
149 MCStreamer &Streamer) const override;
150
151 // The symbol that gets passed to .cfi_personality.
153 const TargetMachine &TM,
154 MachineModuleInfo *MMI) const override;
155
156 /// Get MachO PC relative GOT entry relocation
158 const MCSymbol *Sym,
159 const MCValue &MV, int64_t Offset,
161 MCStreamer &Streamer) const override;
162
163 void getNameWithPrefix(SmallVectorImpl<char> &OutName, const GlobalValue *GV,
164 const TargetMachine &TM) const override;
165
166 MCSection *getSectionForCommandLines() const override;
167};
168
170 mutable unsigned NextUniqueID = 0;
171 const TargetMachine *TM = nullptr;
172
173public:
174 ~TargetLoweringObjectFileCOFF() override = default;
175
176 void Initialize(MCContext &Ctx, const TargetMachine &TM) override;
178 const TargetMachine &TM) const override;
179
181 const TargetMachine &TM) const override;
182
183 void getNameWithPrefix(SmallVectorImpl<char> &OutName, const GlobalValue *GV,
184 const TargetMachine &TM) const override;
185
187 const TargetMachine &TM) const override;
188
189 bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference,
190 const Function &F) const override;
191
192 /// Emit Obj-C garbage collection and linker options.
193 void emitModuleMetadata(MCStreamer &Streamer, Module &M) const override;
194
195 MCSection *getStaticCtorSection(unsigned Priority,
196 const MCSymbol *KeySym) const override;
197 MCSection *getStaticDtorSection(unsigned Priority,
198 const MCSymbol *KeySym) const override;
199
201 const GlobalValue *RHS,
202 const TargetMachine &TM) const override;
203
204 /// Given a mergeable constant with the specified size and relocation
205 /// information, return a section that it should be placed in.
207 const Constant *C,
208 Align &Alignment) const override;
209
210private:
211 void emitLinkerDirectives(MCStreamer &Streamer, Module &M) const;
212};
213
215 mutable unsigned NextUniqueID = 0;
217
218public:
220 ~TargetLoweringObjectFileWasm() override = default;
221
222 void getModuleMetadata(Module &M) override;
223
225 const TargetMachine &TM) const override;
226
228 const TargetMachine &TM) const override;
229
230 bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference,
231 const Function &F) const override;
232
233 void InitializeWasm();
234 MCSection *getStaticCtorSection(unsigned Priority,
235 const MCSymbol *KeySym) const override;
236 MCSection *getStaticDtorSection(unsigned Priority,
237 const MCSymbol *KeySym) const override;
238
240 const GlobalValue *RHS,
241 const TargetMachine &TM) const override;
242};
243
245public:
247 ~TargetLoweringObjectFileXCOFF() override = default;
248
249 static bool ShouldEmitEHBlock(const MachineFunction *MF);
250 static bool ShouldSetSSPCanaryBitInTB(const MachineFunction *MF);
251
253
254 void Initialize(MCContext &Ctx, const TargetMachine &TM) override;
255
256 bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference,
257 const Function &F) const override;
258
260 const TargetMachine &TM) const override;
261
262 MCSection *getStaticCtorSection(unsigned Priority,
263 const MCSymbol *KeySym) const override;
264 MCSection *getStaticDtorSection(unsigned Priority,
265 const MCSymbol *KeySym) const override;
266
268 const GlobalValue *RHS,
269 const TargetMachine &TM) const override;
270
272 const TargetMachine &TM) const override;
273
275 const TargetMachine &TM) const override;
276
277 /// Given a constant with the SectionKind, return a section that it should be
278 /// placed in.
280 const Constant *C,
281 Align &Alignment) const override;
282
284
285 MCSection *
287 const TargetMachine &TM) const override;
289 const TargetMachine &TM) const override;
290
291 /// For external functions, this will always return a function descriptor
292 /// csect.
293 MCSection *
295 const TargetMachine &TM) const override;
296
297 /// For functions, this will always return a function descriptor symbol.
299 const TargetMachine &TM) const override;
300
302 const TargetMachine &TM) const override;
303
304 /// For functions, this will return the LSDA section. If option
305 /// -ffunction-sections is on, this will return a unique csect with the
306 /// function name appended to .gcc_except_table as a suffix of the LSDA
307 /// section name.
308 MCSection *getSectionForLSDA(const Function &F, const MCSymbol &FnSym,
309 const TargetMachine &TM) const override;
310};
311
313public:
315 ~TargetLoweringObjectFileGOFF() override = default;
316
318 const TargetMachine &TM) const override;
320 const TargetMachine &TM) const override;
321 MCSection *getSectionForLSDA(const Function &F, const MCSymbol &FnSym,
322 const TargetMachine &TM) const override;
323};
324
325} // end namespace llvm
326
327#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
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.
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
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