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