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
17#include "llvm/ADT/SmallPtrSet.h"
18#include "llvm/BinaryFormat/XCOFF.h"
19#include "llvm/MC/MCExpr.h"
20#include "llvm/Target/TargetLoweringObjectFile.h"
21
22namespace llvm {
23
24class GlobalValue;
25class MachineModuleInfo;
26class MachineFunction;
27class MCContext;
28class MCExpr;
29class MCSection;
30class MCSymbol;
31class Module;
32class TargetMachine;
33
34class TargetLoweringObjectFileELF : public TargetLoweringObjectFile {
35 bool UseInitArray = false;
36 mutable unsigned NextUniqueID = 1; // ID 0 is reserved for execute-only sections
37 SmallPtrSet<GlobalObject *, 2> Used;
38
39protected:
40 MCSymbolRefExpr::VariantKind PLTRelativeVariantKind =
41 MCSymbolRefExpr::VK_None;
42
43public:
44 TargetLoweringObjectFileELF();
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.
59 MCSection *getSectionForConstant(const DataLayout &DL, SectionKind Kind,
60 const Constant *C,
61 Align &Alignment) const override;
62
63 MCSection *getExplicitSectionGlobal(const GlobalObject *GO, SectionKind Kind,
64 const TargetMachine &TM) const override;
65
66 MCSection *SelectSectionForGlobal(const GlobalObject *GO, SectionKind Kind,
67 const TargetMachine &TM) const override;
68
69 MCSection *getSectionForJumpTable(const Function &F,
70 const TargetMachine &TM) const override;
71 MCSection *getSectionForLSDA(const Function &F, const MCSymbol &FnSym,
72 const TargetMachine &TM) const override;
73
74 MCSection *
75 getSectionForMachineBasicBlock(const Function &F,
76 const MachineBasicBlock &MBB,
77 const TargetMachine &TM) const override;
78
79 MCSection *
80 getUniqueSectionForFunction(const Function &F,
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.
88 const MCExpr *getTTypeGlobalReference(const GlobalValue *GV,
89 unsigned Encoding,
90 const TargetMachine &TM,
91 MachineModuleInfo *MMI,
92 MCStreamer &Streamer) const override;
93
94 // The symbol that gets passed to .cfi_personality.
95 MCSymbol *getCFIPersonalitySymbol(const GlobalValue *GV,
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
105 const MCExpr *lowerRelativeReference(const GlobalValue *LHS,
106 const GlobalValue *RHS,
107 const TargetMachine &TM) const override;
108
109 const MCExpr *lowerDSOLocalEquivalent(const DSOLocalEquivalent *Equiv,
110 const TargetMachine &TM) const override;
111
112 MCSection *getSectionForCommandLines() const override;
113};
114
115class TargetLoweringObjectFileMachO : public TargetLoweringObjectFile {
116public:
117 TargetLoweringObjectFileMachO();
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
128 MCSection *SelectSectionForGlobal(const GlobalObject *GO, SectionKind Kind,
129 const TargetMachine &TM) const override;
130
131 MCSection *getExplicitSectionGlobal(const GlobalObject *GO, SectionKind Kind,
132 const TargetMachine &TM) const override;
133
134 MCSection *getSectionForConstant(const DataLayout &DL, SectionKind Kind,
135 const Constant *C,
136 Align &Alignment) const override;
137
138 /// The mach-o version of this method defaults to returning a stub reference.
139 const MCExpr *getTTypeGlobalReference(const GlobalValue *GV,
140 unsigned Encoding,
141 const TargetMachine &TM,
142 MachineModuleInfo *MMI,
143 MCStreamer &Streamer) const override;
144
145 // The symbol that gets passed to .cfi_personality.
146 MCSymbol *getCFIPersonalitySymbol(const GlobalValue *GV,
147 const TargetMachine &TM,
148 MachineModuleInfo *MMI) const override;
149
150 /// Get MachO PC relative GOT entry relocation
151 const MCExpr *getIndirectSymViaGOTPCRel(const GlobalValue *GV,
152 const MCSymbol *Sym,
153 const MCValue &MV, int64_t Offset,
154 MachineModuleInfo *MMI,
155 MCStreamer &Streamer) const override;
156
157 void getNameWithPrefix(SmallVectorImpl<char> &OutName, const GlobalValue *GV,
158 const TargetMachine &TM) const override;
159
160 MCSection *getSectionForCommandLines() const override;
161};
162
163class TargetLoweringObjectFileCOFF : public TargetLoweringObjectFile {
164 mutable unsigned NextUniqueID = 0;
165 const TargetMachine *TM = nullptr;
166
167public:
168 ~TargetLoweringObjectFileCOFF() override = default;
169
170 void Initialize(MCContext &Ctx, const TargetMachine &TM) override;
171 MCSection *getExplicitSectionGlobal(const GlobalObject *GO, SectionKind Kind,
172 const TargetMachine &TM) const override;
173
174 MCSection *SelectSectionForGlobal(const GlobalObject *GO, SectionKind Kind,
175 const TargetMachine &TM) const override;
176
177 void getNameWithPrefix(SmallVectorImpl<char> &OutName, const GlobalValue *GV,
178 const TargetMachine &TM) const override;
179
180 MCSection *getSectionForJumpTable(const Function &F,
181 const TargetMachine &TM) const override;
182
183 bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference,
184 const Function &F) const override;
185
186 /// Emit Obj-C garbage collection and linker options.
187 void emitModuleMetadata(MCStreamer &Streamer, Module &M) const override;
188
189 MCSection *getStaticCtorSection(unsigned Priority,
190 const MCSymbol *KeySym) const override;
191 MCSection *getStaticDtorSection(unsigned Priority,
192 const MCSymbol *KeySym) const override;
193
194 const MCExpr *lowerRelativeReference(const GlobalValue *LHS,
195 const GlobalValue *RHS,
196 const TargetMachine &TM) const override;
197
198 /// Given a mergeable constant with the specified size and relocation
199 /// information, return a section that it should be placed in.
200 MCSection *getSectionForConstant(const DataLayout &DL, SectionKind Kind,
201 const Constant *C,
202 Align &Alignment) const override;
203
204private:
205 void emitLinkerDirectives(MCStreamer &Streamer, Module &M) const;
206};
207
208class TargetLoweringObjectFileWasm : public TargetLoweringObjectFile {
209 mutable unsigned NextUniqueID = 0;
210
211public:
212 TargetLoweringObjectFileWasm() = default;
213 ~TargetLoweringObjectFileWasm() override = default;
214
215 MCSection *getExplicitSectionGlobal(const GlobalObject *GO, SectionKind Kind,
216 const TargetMachine &TM) const override;
217
218 MCSection *SelectSectionForGlobal(const GlobalObject *GO, SectionKind Kind,
219 const TargetMachine &TM) const override;
220
221 bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference,
222 const Function &F) const override;
223
224 void InitializeWasm();
225 MCSection *getStaticCtorSection(unsigned Priority,
226 const MCSymbol *KeySym) const override;
227 MCSection *getStaticDtorSection(unsigned Priority,
228 const MCSymbol *KeySym) const override;
229
230 const MCExpr *lowerRelativeReference(const GlobalValue *LHS,
231 const GlobalValue *RHS,
232 const TargetMachine &TM) const override;
233};
234
235class TargetLoweringObjectFileXCOFF : public TargetLoweringObjectFile {
236public:
237 TargetLoweringObjectFileXCOFF() = default;
238 ~TargetLoweringObjectFileXCOFF() override = default;
239
240 static bool ShouldEmitEHBlock(const MachineFunction *MF);
241 static bool ShouldSetSSPCanaryBitInTB(const MachineFunction *MF);
242
243 static MCSymbol *getEHInfoTableSymbol(const MachineFunction *MF);
244
245 void Initialize(MCContext &Ctx, const TargetMachine &TM) override;
246
247 bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference,
248 const Function &F) const override;
249
250 MCSection *getExplicitSectionGlobal(const GlobalObject *GO, SectionKind Kind,
251 const TargetMachine &TM) const override;
252
253 MCSection *getStaticCtorSection(unsigned Priority,
254 const MCSymbol *KeySym) const override;
255 MCSection *getStaticDtorSection(unsigned Priority,
256 const MCSymbol *KeySym) const override;
257
258 const MCExpr *lowerRelativeReference(const GlobalValue *LHS,
259 const GlobalValue *RHS,
260 const TargetMachine &TM) const override;
261
262 MCSection *SelectSectionForGlobal(const GlobalObject *GO, SectionKind Kind,
263 const TargetMachine &TM) const override;
264
265 MCSection *getSectionForJumpTable(const Function &F,
266 const TargetMachine &TM) const override;
267
268 /// Given a constant with the SectionKind, return a section that it should be
269 /// placed in.
270 MCSection *getSectionForConstant(const DataLayout &DL, SectionKind Kind,
271 const Constant *C,
272 Align &Alignment) const override;
273
274 static XCOFF::StorageClass getStorageClassForGlobal(const GlobalValue *GV);
275
276 MCSection *
277 getSectionForFunctionDescriptor(const Function *F,
278 const TargetMachine &TM) const override;
279 MCSection *getSectionForTOCEntry(const MCSymbol *Sym,
280 const TargetMachine &TM) const override;
281
282 /// For external functions, this will always return a function descriptor
283 /// csect.
284 MCSection *
285 getSectionForExternalReference(const GlobalObject *GO,
286 const TargetMachine &TM) const override;
287
288 /// For functions, this will always return a function descriptor symbol.
289 MCSymbol *getTargetSymbol(const GlobalValue *GV,
290 const TargetMachine &TM) const override;
291
292 MCSymbol *getFunctionEntryPointSymbol(const GlobalValue *Func,
293 const TargetMachine &TM) const override;
294
295 /// For functions, this will return the LSDA section. If option
296 /// -ffunction-sections is on, this will return a unique csect with the
297 /// function name appended to .gcc_except_table as a suffix of the LSDA
298 /// section name.
299 MCSection *getSectionForLSDA(const Function &F, const MCSymbol &FnSym,
300 const TargetMachine &TM) const override;
301};
302
303class TargetLoweringObjectFileGOFF : public TargetLoweringObjectFile {
304public:
305 TargetLoweringObjectFileGOFF();
306 ~TargetLoweringObjectFileGOFF() override = default;
307
308 MCSection *SelectSectionForGlobal(const GlobalObject *GO, SectionKind Kind,
309 const TargetMachine &TM) const override;
310 MCSection *getExplicitSectionGlobal(const GlobalObject *GO, SectionKind Kind,
311 const TargetMachine &TM) const override;
312 MCSection *getSectionForLSDA(const Function &F, const MCSymbol &FnSym,
313 const TargetMachine &TM) const override;
314};
315
316} // end namespace llvm
317
318#endif // LLVM_CODEGEN_TARGETLOWERINGOBJECTFILEIMPL_H
319

source code of llvm/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h