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 | |
22 | namespace llvm { |
23 | |
24 | class GlobalValue; |
25 | class MachineModuleInfo; |
26 | class MachineFunction; |
27 | class MCContext; |
28 | class MCExpr; |
29 | class MCSection; |
30 | class MCSymbol; |
31 | class Module; |
32 | class TargetMachine; |
33 | |
34 | class 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 | |
39 | protected: |
40 | MCSymbolRefExpr::VariantKind PLTRelativeVariantKind = |
41 | MCSymbolRefExpr::VK_None; |
42 | |
43 | public: |
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 | |
115 | class TargetLoweringObjectFileMachO : public TargetLoweringObjectFile { |
116 | public: |
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 | |
163 | class TargetLoweringObjectFileCOFF : public TargetLoweringObjectFile { |
164 | mutable unsigned NextUniqueID = 0; |
165 | const TargetMachine *TM = nullptr; |
166 | |
167 | public: |
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 | |
204 | private: |
205 | void emitLinkerDirectives(MCStreamer &Streamer, Module &M) const; |
206 | }; |
207 | |
208 | class TargetLoweringObjectFileWasm : public TargetLoweringObjectFile { |
209 | mutable unsigned NextUniqueID = 0; |
210 | SmallPtrSet<GlobalObject *, 2> Used; |
211 | |
212 | public: |
213 | TargetLoweringObjectFileWasm() = default; |
214 | ~TargetLoweringObjectFileWasm() override = default; |
215 | |
216 | void getModuleMetadata(Module &M) override; |
217 | |
218 | MCSection *getExplicitSectionGlobal(const GlobalObject *GO, SectionKind Kind, |
219 | const TargetMachine &TM) const override; |
220 | |
221 | MCSection *SelectSectionForGlobal(const GlobalObject *GO, SectionKind Kind, |
222 | const TargetMachine &TM) const override; |
223 | |
224 | bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference, |
225 | const Function &F) const override; |
226 | |
227 | void InitializeWasm(); |
228 | MCSection *getStaticCtorSection(unsigned Priority, |
229 | const MCSymbol *KeySym) const override; |
230 | MCSection *getStaticDtorSection(unsigned Priority, |
231 | const MCSymbol *KeySym) const override; |
232 | |
233 | const MCExpr *lowerRelativeReference(const GlobalValue *LHS, |
234 | const GlobalValue *RHS, |
235 | const TargetMachine &TM) const override; |
236 | }; |
237 | |
238 | class TargetLoweringObjectFileXCOFF : public TargetLoweringObjectFile { |
239 | public: |
240 | TargetLoweringObjectFileXCOFF() = default; |
241 | ~TargetLoweringObjectFileXCOFF() override = default; |
242 | |
243 | static bool ShouldEmitEHBlock(const MachineFunction *MF); |
244 | static bool ShouldSetSSPCanaryBitInTB(const MachineFunction *MF); |
245 | |
246 | static MCSymbol *getEHInfoTableSymbol(const MachineFunction *MF); |
247 | |
248 | void Initialize(MCContext &Ctx, const TargetMachine &TM) override; |
249 | |
250 | bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference, |
251 | const Function &F) const override; |
252 | |
253 | MCSection *getExplicitSectionGlobal(const GlobalObject *GO, SectionKind Kind, |
254 | const TargetMachine &TM) const override; |
255 | |
256 | MCSection *getStaticCtorSection(unsigned Priority, |
257 | const MCSymbol *KeySym) const override; |
258 | MCSection *getStaticDtorSection(unsigned Priority, |
259 | const MCSymbol *KeySym) const override; |
260 | |
261 | const MCExpr *lowerRelativeReference(const GlobalValue *LHS, |
262 | const GlobalValue *RHS, |
263 | const TargetMachine &TM) const override; |
264 | |
265 | MCSection *SelectSectionForGlobal(const GlobalObject *GO, SectionKind Kind, |
266 | const TargetMachine &TM) const override; |
267 | |
268 | MCSection *getSectionForJumpTable(const Function &F, |
269 | const TargetMachine &TM) const override; |
270 | |
271 | /// Given a constant with the SectionKind, return a section that it should be |
272 | /// placed in. |
273 | MCSection *getSectionForConstant(const DataLayout &DL, SectionKind Kind, |
274 | const Constant *C, |
275 | Align &Alignment) const override; |
276 | |
277 | static XCOFF::StorageClass getStorageClassForGlobal(const GlobalValue *GV); |
278 | |
279 | MCSection * |
280 | getSectionForFunctionDescriptor(const Function *F, |
281 | const TargetMachine &TM) const override; |
282 | MCSection *getSectionForTOCEntry(const MCSymbol *Sym, |
283 | const TargetMachine &TM) const override; |
284 | |
285 | /// For external functions, this will always return a function descriptor |
286 | /// csect. |
287 | MCSection * |
288 | getSectionForExternalReference(const GlobalObject *GO, |
289 | const TargetMachine &TM) const override; |
290 | |
291 | /// For functions, this will always return a function descriptor symbol. |
292 | MCSymbol *getTargetSymbol(const GlobalValue *GV, |
293 | const TargetMachine &TM) const override; |
294 | |
295 | MCSymbol *getFunctionEntryPointSymbol(const GlobalValue *Func, |
296 | const TargetMachine &TM) const override; |
297 | |
298 | /// For functions, this will return the LSDA section. If option |
299 | /// -ffunction-sections is on, this will return a unique csect with the |
300 | /// function name appended to .gcc_except_table as a suffix of the LSDA |
301 | /// section name. |
302 | MCSection *getSectionForLSDA(const Function &F, const MCSymbol &FnSym, |
303 | const TargetMachine &TM) const override; |
304 | }; |
305 | |
306 | class TargetLoweringObjectFileGOFF : public TargetLoweringObjectFile { |
307 | public: |
308 | TargetLoweringObjectFileGOFF(); |
309 | ~TargetLoweringObjectFileGOFF() override = default; |
310 | |
311 | MCSection *SelectSectionForGlobal(const GlobalObject *GO, SectionKind Kind, |
312 | const TargetMachine &TM) const override; |
313 | MCSection *getExplicitSectionGlobal(const GlobalObject *GO, SectionKind Kind, |
314 | const TargetMachine &TM) const override; |
315 | MCSection *getSectionForLSDA(const Function &F, const MCSymbol &FnSym, |
316 | const TargetMachine &TM) const override; |
317 | }; |
318 | |
319 | } // end namespace llvm |
320 | |
321 | #endif // LLVM_CODEGEN_TARGETLOWERINGOBJECTFILEIMPL_H |
322 | |