]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm-project/llvm/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h
Merge ^/vendor/libc++/dist up to its last change, and resolve conflicts.
[FreeBSD/FreeBSD.git] / contrib / llvm-project / llvm / include / llvm / CodeGen / TargetLoweringObjectFileImpl.h
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/BinaryFormat/XCOFF.h"
18 #include "llvm/IR/Module.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 Mangler;
27 class MCContext;
28 class MCSection;
29 class MCSymbol;
30 class TargetMachine;
31
32 class TargetLoweringObjectFileELF : public TargetLoweringObjectFile {
33   bool UseInitArray = false;
34   mutable unsigned NextUniqueID = 1;  // ID 0 is reserved for execute-only sections
35
36 protected:
37   MCSymbolRefExpr::VariantKind PLTRelativeVariantKind =
38       MCSymbolRefExpr::VK_None;
39   const TargetMachine *TM = nullptr;
40
41 public:
42   TargetLoweringObjectFileELF() = default;
43   ~TargetLoweringObjectFileELF() override = default;
44
45   void Initialize(MCContext &Ctx, const TargetMachine &TM) override;
46
47   /// Emit Obj-C garbage collection and linker options.
48   void emitModuleMetadata(MCStreamer &Streamer, Module &M) const override;
49
50   void emitPersonalityValue(MCStreamer &Streamer, const DataLayout &DL,
51                             const MCSymbol *Sym) const override;
52
53   /// Given a constant with the SectionKind, return a section that it should be
54   /// placed in.
55   MCSection *getSectionForConstant(const DataLayout &DL, SectionKind Kind,
56                                    const Constant *C,
57                                    unsigned &Align) const override;
58
59   MCSection *getExplicitSectionGlobal(const GlobalObject *GO, SectionKind Kind,
60                                       const TargetMachine &TM) const override;
61
62   MCSection *SelectSectionForGlobal(const GlobalObject *GO, SectionKind Kind,
63                                     const TargetMachine &TM) const override;
64
65   MCSection *getSectionForJumpTable(const Function &F,
66                                     const TargetMachine &TM) const override;
67
68   bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference,
69                                            const Function &F) const override;
70
71   /// Return an MCExpr to use for a reference to the specified type info global
72   /// variable from exception handling information.
73   const MCExpr *getTTypeGlobalReference(const GlobalValue *GV,
74                                         unsigned Encoding,
75                                         const TargetMachine &TM,
76                                         MachineModuleInfo *MMI,
77                                         MCStreamer &Streamer) const override;
78
79   // The symbol that gets passed to .cfi_personality.
80   MCSymbol *getCFIPersonalitySymbol(const GlobalValue *GV,
81                                     const TargetMachine &TM,
82                                     MachineModuleInfo *MMI) const override;
83
84   void InitializeELF(bool UseInitArray_);
85   MCSection *getStaticCtorSection(unsigned Priority,
86                                   const MCSymbol *KeySym) const override;
87   MCSection *getStaticDtorSection(unsigned Priority,
88                                   const MCSymbol *KeySym) const override;
89
90   const MCExpr *lowerRelativeReference(const GlobalValue *LHS,
91                                        const GlobalValue *RHS,
92                                        const TargetMachine &TM) const override;
93
94   MCSection *getSectionForCommandLines() const override;
95 };
96
97 class TargetLoweringObjectFileMachO : public TargetLoweringObjectFile {
98 public:
99   TargetLoweringObjectFileMachO();
100   ~TargetLoweringObjectFileMachO() override = default;
101
102   void Initialize(MCContext &Ctx, const TargetMachine &TM) override;
103
104   /// Emit the module flags that specify the garbage collection information.
105   void emitModuleMetadata(MCStreamer &Streamer, Module &M) const override;
106
107   MCSection *SelectSectionForGlobal(const GlobalObject *GO, SectionKind Kind,
108                                     const TargetMachine &TM) const override;
109
110   MCSection *getExplicitSectionGlobal(const GlobalObject *GO, SectionKind Kind,
111                                       const TargetMachine &TM) const override;
112
113   MCSection *getSectionForConstant(const DataLayout &DL, SectionKind Kind,
114                                    const Constant *C,
115                                    unsigned &Align) const override;
116
117   /// The mach-o version of this method defaults to returning a stub reference.
118   const MCExpr *getTTypeGlobalReference(const GlobalValue *GV,
119                                         unsigned Encoding,
120                                         const TargetMachine &TM,
121                                         MachineModuleInfo *MMI,
122                                         MCStreamer &Streamer) const override;
123
124   // The symbol that gets passed to .cfi_personality.
125   MCSymbol *getCFIPersonalitySymbol(const GlobalValue *GV,
126                                     const TargetMachine &TM,
127                                     MachineModuleInfo *MMI) const override;
128
129   /// Get MachO PC relative GOT entry relocation
130   const MCExpr *getIndirectSymViaGOTPCRel(const GlobalValue *GV,
131                                           const MCSymbol *Sym,
132                                           const MCValue &MV, int64_t Offset,
133                                           MachineModuleInfo *MMI,
134                                           MCStreamer &Streamer) const override;
135
136   void getNameWithPrefix(SmallVectorImpl<char> &OutName, const GlobalValue *GV,
137                          const TargetMachine &TM) const override;
138 };
139
140 class TargetLoweringObjectFileCOFF : public TargetLoweringObjectFile {
141   mutable unsigned NextUniqueID = 0;
142
143 public:
144   ~TargetLoweringObjectFileCOFF() override = default;
145
146   void Initialize(MCContext &Ctx, const TargetMachine &TM) override;
147   MCSection *getExplicitSectionGlobal(const GlobalObject *GO, SectionKind Kind,
148                                       const TargetMachine &TM) const override;
149
150   MCSection *SelectSectionForGlobal(const GlobalObject *GO, SectionKind Kind,
151                                     const TargetMachine &TM) const override;
152
153   void getNameWithPrefix(SmallVectorImpl<char> &OutName, const GlobalValue *GV,
154                          const TargetMachine &TM) const override;
155
156   MCSection *getSectionForJumpTable(const Function &F,
157                                     const TargetMachine &TM) const override;
158
159   /// Emit Obj-C garbage collection and linker options.
160   void emitModuleMetadata(MCStreamer &Streamer, Module &M) const override;
161
162   MCSection *getStaticCtorSection(unsigned Priority,
163                                   const MCSymbol *KeySym) const override;
164   MCSection *getStaticDtorSection(unsigned Priority,
165                                   const MCSymbol *KeySym) const override;
166
167   void emitLinkerFlagsForGlobal(raw_ostream &OS,
168                                 const GlobalValue *GV) const override;
169
170   void emitLinkerFlagsForUsed(raw_ostream &OS,
171                               const GlobalValue *GV) const override;
172
173   const MCExpr *lowerRelativeReference(const GlobalValue *LHS,
174                                        const GlobalValue *RHS,
175                                        const TargetMachine &TM) const override;
176
177   /// Given a mergeable constant with the specified size and relocation
178   /// information, return a section that it should be placed in.
179   MCSection *getSectionForConstant(const DataLayout &DL, SectionKind Kind,
180                                    const Constant *C,
181                                    unsigned &Align) const override;
182 };
183
184 class TargetLoweringObjectFileWasm : public TargetLoweringObjectFile {
185   mutable unsigned NextUniqueID = 0;
186
187 public:
188   TargetLoweringObjectFileWasm() = default;
189   ~TargetLoweringObjectFileWasm() override = default;
190
191   MCSection *getExplicitSectionGlobal(const GlobalObject *GO, SectionKind Kind,
192                                       const TargetMachine &TM) const override;
193
194   MCSection *SelectSectionForGlobal(const GlobalObject *GO, SectionKind Kind,
195                                     const TargetMachine &TM) const override;
196
197   bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference,
198                                            const Function &F) const override;
199
200   void InitializeWasm();
201   MCSection *getStaticCtorSection(unsigned Priority,
202                                   const MCSymbol *KeySym) const override;
203   MCSection *getStaticDtorSection(unsigned Priority,
204                                   const MCSymbol *KeySym) const override;
205
206   const MCExpr *lowerRelativeReference(const GlobalValue *LHS,
207                                        const GlobalValue *RHS,
208                                        const TargetMachine &TM) const override;
209 };
210
211 class TargetLoweringObjectFileXCOFF : public TargetLoweringObjectFile {
212 public:
213   TargetLoweringObjectFileXCOFF() = default;
214   ~TargetLoweringObjectFileXCOFF() override = default;
215
216   void Initialize(MCContext &Ctx, const TargetMachine &TM) override;
217
218   bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference,
219                                            const Function &F) const override;
220
221   MCSection *getExplicitSectionGlobal(const GlobalObject *GO, SectionKind Kind,
222                                       const TargetMachine &TM) const override;
223
224   MCSection *getStaticCtorSection(unsigned Priority,
225                                   const MCSymbol *KeySym) const override;
226   MCSection *getStaticDtorSection(unsigned Priority,
227                                   const MCSymbol *KeySym) const override;
228
229   const MCExpr *lowerRelativeReference(const GlobalValue *LHS,
230                                        const GlobalValue *RHS,
231                                        const TargetMachine &TM) const override;
232
233   MCSection *SelectSectionForGlobal(const GlobalObject *GO, SectionKind Kind,
234                                     const TargetMachine &TM) const override;
235
236   static XCOFF::StorageClass getStorageClassForGlobal(const GlobalObject *GO);
237 };
238
239 } // end namespace llvm
240
241 #endif // LLVM_CODEGEN_TARGETLOWERINGOBJECTFILEIMPL_H