LLVM 17.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) const override;
56
57 /// Given a constant with the SectionKind, return a section that it should be
58 /// placed in.
60 const Constant *C,
61 Align &Alignment) const override;
62
64 const TargetMachine &TM) const override;
65
67 const TargetMachine &TM) const override;
68
70 const TargetMachine &TM) const override;
71 MCSection *getSectionForLSDA(const Function &F, const MCSymbol &FnSym,
72 const TargetMachine &TM) const override;
73
74 MCSection *
77 const TargetMachine &TM) const override;
78
79 MCSection *
81 const TargetMachine &TM) const override;
82
83 bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference,
84 const Function &F) const override;
85
86 /// Return an MCExpr to use for a reference to the specified type info global
87 /// variable from exception handling information.
89 unsigned Encoding,
90 const TargetMachine &TM,
92 MCStreamer &Streamer) const override;
93
94 // The symbol that gets passed to .cfi_personality.
96 const TargetMachine &TM,
97 MachineModuleInfo *MMI) const override;
98
99 void InitializeELF(bool UseInitArray_);
100 MCSection *getStaticCtorSection(unsigned Priority,
101 const MCSymbol *KeySym) const override;
102 MCSection *getStaticDtorSection(unsigned Priority,
103 const MCSymbol *KeySym) const override;
104
106 const GlobalValue *RHS,
107 const TargetMachine &TM) const override;
108
110 const TargetMachine &TM) const override;
111
112 MCSection *getSectionForCommandLines() const override;
113};
114
116public:
118 ~TargetLoweringObjectFileMachO() override = default;
119
120 void Initialize(MCContext &Ctx, const TargetMachine &TM) override;
121
122 MCSection *getStaticDtorSection(unsigned Priority,
123 const MCSymbol *KeySym) const override;
124
125 /// Emit the module flags that specify the garbage collection information.
126 void emitModuleMetadata(MCStreamer &Streamer, Module &M) const override;
127
129 const TargetMachine &TM) const override;
130
132 const TargetMachine &TM) const override;
133
135 const Constant *C,
136 Align &Alignment) const override;
137
138 /// The mach-o version of this method defaults to returning a stub reference.
140 unsigned Encoding,
141 const TargetMachine &TM,
143 MCStreamer &Streamer) const override;
144
145 // The symbol that gets passed to .cfi_personality.
147 const TargetMachine &TM,
148 MachineModuleInfo *MMI) const override;
149
150 /// Get MachO PC relative GOT entry relocation
152 const MCSymbol *Sym,
153 const MCValue &MV, int64_t Offset,
155 MCStreamer &Streamer) const override;
156
157 void getNameWithPrefix(SmallVectorImpl<char> &OutName, const GlobalValue *GV,
158 const TargetMachine &TM) const override;
159};
160
162 mutable unsigned NextUniqueID = 0;
163 const TargetMachine *TM = nullptr;
164
165public:
166 ~TargetLoweringObjectFileCOFF() override = default;
167
168 void Initialize(MCContext &Ctx, const TargetMachine &TM) override;
170 const TargetMachine &TM) const override;
171
173 const TargetMachine &TM) const override;
174
175 void getNameWithPrefix(SmallVectorImpl<char> &OutName, const GlobalValue *GV,
176 const TargetMachine &TM) const override;
177
179 const TargetMachine &TM) const override;
180
181 bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference,
182 const Function &F) const override;
183
184 /// Emit Obj-C garbage collection and linker options.
185 void emitModuleMetadata(MCStreamer &Streamer, Module &M) const override;
186
187 MCSection *getStaticCtorSection(unsigned Priority,
188 const MCSymbol *KeySym) const override;
189 MCSection *getStaticDtorSection(unsigned Priority,
190 const MCSymbol *KeySym) const override;
191
193 const GlobalValue *RHS,
194 const TargetMachine &TM) const override;
195
196 /// Given a mergeable constant with the specified size and relocation
197 /// information, return a section that it should be placed in.
199 const Constant *C,
200 Align &Alignment) const override;
201
202private:
203 void emitLinkerDirectives(MCStreamer &Streamer, Module &M) const;
204};
205
207 mutable unsigned NextUniqueID = 0;
208
209public:
211 ~TargetLoweringObjectFileWasm() override = default;
212
214 const TargetMachine &TM) const override;
215
217 const TargetMachine &TM) const override;
218
219 bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference,
220 const Function &F) const override;
221
222 void InitializeWasm();
223 MCSection *getStaticCtorSection(unsigned Priority,
224 const MCSymbol *KeySym) const override;
225 MCSection *getStaticDtorSection(unsigned Priority,
226 const MCSymbol *KeySym) const override;
227
229 const GlobalValue *RHS,
230 const TargetMachine &TM) const override;
231};
232
234public:
236 ~TargetLoweringObjectFileXCOFF() override = default;
237
238 static bool ShouldEmitEHBlock(const MachineFunction *MF);
239 static bool ShouldSetSSPCanaryBitInTB(const MachineFunction *MF);
240
242
243 void Initialize(MCContext &Ctx, const TargetMachine &TM) override;
244
245 bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference,
246 const Function &F) const override;
247
249 const TargetMachine &TM) const override;
250
251 MCSection *getStaticCtorSection(unsigned Priority,
252 const MCSymbol *KeySym) const override;
253 MCSection *getStaticDtorSection(unsigned Priority,
254 const MCSymbol *KeySym) const override;
255
257 const GlobalValue *RHS,
258 const TargetMachine &TM) const override;
259
261 const TargetMachine &TM) const override;
262
264 const TargetMachine &TM) const override;
265
266 /// Given a constant with the SectionKind, return a section that it should be
267 /// placed in.
269 const Constant *C,
270 Align &Alignment) const override;
271
273
274 MCSection *
276 const TargetMachine &TM) const override;
278 const TargetMachine &TM) const override;
279
280 /// For external functions, this will always return a function descriptor
281 /// csect.
282 MCSection *
284 const TargetMachine &TM) const override;
285
286 /// For functions, this will always return a function descriptor symbol.
288 const TargetMachine &TM) const override;
289
291 const TargetMachine &TM) const override;
292
293 /// For functions, this will return the LSDA section. If option
294 /// -ffunction-sections is on, this will return a unique csect with the
295 /// function name appended to .gcc_except_table as a suffix of the LSDA
296 /// section name.
297 MCSection *getSectionForLSDA(const Function &F, const MCSymbol &FnSym,
298 const TargetMachine &TM) const override;
299};
300
302public:
304 ~TargetLoweringObjectFileGOFF() override = default;
305
307 const TargetMachine &TM) const override;
309 const TargetMachine &TM) const override;
310};
311
312} // end namespace llvm
313
314#endif // LLVM_CODEGEN_TARGETLOWERINGOBJECTFILEIMPL_H
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
#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:41
Wrapper for a function that represents a value that functionally represents the original function.
Definition: Constants.h:925
A parsed version of the target data layout string in and methods for querying it.
Definition: DataLayout.h:110
Context object for machine code objects.
Definition: MCContext.h:76
Base class for the full range of assembler expressions which are needed for parsing.
Definition: MCExpr.h:35
Instances of this class represent a uniqued identifier for a section in the current translation unit.
Definition: MCSection.h:39
Streaming machine code generation interface.
Definition: MCStreamer.h:212
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:450
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Definition: SmallVector.h:577
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 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
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 * 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 * 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.
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:78
@ C
The default llvm calling convention, compatible with C.
Definition: CallingConv.h:34
StorageClass
Definition: XCOFF.h:169
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
@ Offset
Definition: DWP.cpp:406
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition: Alignment.h:39