1//===-- llvm/Target/TargetLoweringObjectFile.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_TARGET_TARGETLOWERINGOBJECTFILE_H
15#define LLVM_TARGET_TARGETLOWERINGOBJECTFILE_H
16
17#include "llvm/MC/MCObjectFileInfo.h"
18#include "llvm/MC/MCRegister.h"
19#include <cstdint>
20
21namespace llvm {
22
23struct Align;
24class Constant;
25class DataLayout;
26class Function;
27class GlobalObject;
28class GlobalValue;
29class MachineBasicBlock;
30class MachineModuleInfo;
31class Mangler;
32class MCContext;
33class MCExpr;
34class MCSection;
35class MCSymbol;
36class MCSymbolRefExpr;
37class MCStreamer;
38class MCValue;
39class Module;
40class SectionKind;
41class StringRef;
42class TargetMachine;
43class DSOLocalEquivalent;
44
45class TargetLoweringObjectFile : public MCObjectFileInfo {
46 /// Name-mangler for global names.
47 Mangler *Mang = nullptr;
48
49protected:
50 bool SupportIndirectSymViaGOTPCRel = false;
51 bool SupportGOTPCRelWithOffset = true;
52 bool SupportDebugThreadLocalLocation = true;
53 bool SupportDSOLocalEquivalentLowering = false;
54
55 /// PersonalityEncoding, LSDAEncoding, TTypeEncoding - Some encoding values
56 /// for EH.
57 unsigned PersonalityEncoding = 0;
58 unsigned LSDAEncoding = 0;
59 unsigned TTypeEncoding = 0;
60 unsigned CallSiteEncoding = 0;
61
62 /// This section contains the static constructor pointer list.
63 MCSection *StaticCtorSection = nullptr;
64
65 /// This section contains the static destructor pointer list.
66 MCSection *StaticDtorSection = nullptr;
67
68 const TargetMachine *TM = nullptr;
69
70public:
71 TargetLoweringObjectFile() = default;
72 TargetLoweringObjectFile(const TargetLoweringObjectFile &) = delete;
73 TargetLoweringObjectFile &
74 operator=(const TargetLoweringObjectFile &) = delete;
75 virtual ~TargetLoweringObjectFile();
76
77 Mangler &getMangler() const { return *Mang; }
78
79 /// This method must be called before any actual lowering is done. This
80 /// specifies the current context for codegen, and gives the lowering
81 /// implementations a chance to set up their default sections.
82 virtual void Initialize(MCContext &ctx, const TargetMachine &TM);
83
84 virtual void emitPersonalityValue(MCStreamer &Streamer, const DataLayout &TM,
85 const MCSymbol *Sym) const;
86
87 /// Emit the module-level metadata that the platform cares about.
88 virtual void emitModuleMetadata(MCStreamer &Streamer, Module &M) const {}
89
90 /// Emit Call Graph Profile metadata.
91 void emitCGProfileMetadata(MCStreamer &Streamer, Module &M) const;
92
93 /// Get the module-level metadata that the platform cares about.
94 virtual void getModuleMetadata(Module &M) {}
95
96 /// Given a constant with the SectionKind, return a section that it should be
97 /// placed in.
98 virtual MCSection *getSectionForConstant(const DataLayout &DL,
99 SectionKind Kind, const Constant *C,
100 Align &Alignment) const;
101
102 virtual MCSection *
103 getSectionForMachineBasicBlock(const Function &F,
104 const MachineBasicBlock &MBB,
105 const TargetMachine &TM) const;
106
107 virtual MCSection *
108 getUniqueSectionForFunction(const Function &F,
109 const TargetMachine &TM) const;
110
111 /// Classify the specified global variable into a set of target independent
112 /// categories embodied in SectionKind.
113 static SectionKind getKindForGlobal(const GlobalObject *GO,
114 const TargetMachine &TM);
115
116 /// This method computes the appropriate section to emit the specified global
117 /// variable or function definition. This should not be passed external (or
118 /// available externally) globals.
119 MCSection *SectionForGlobal(const GlobalObject *GO, SectionKind Kind,
120 const TargetMachine &TM) const;
121
122 /// This method computes the appropriate section to emit the specified global
123 /// variable or function definition. This should not be passed external (or
124 /// available externally) globals.
125 MCSection *SectionForGlobal(const GlobalObject *GO,
126 const TargetMachine &TM) const;
127
128 virtual void getNameWithPrefix(SmallVectorImpl<char> &OutName,
129 const GlobalValue *GV,
130 const TargetMachine &TM) const;
131
132 virtual MCSection *getSectionForJumpTable(const Function &F,
133 const TargetMachine &TM) const;
134 virtual MCSection *getSectionForLSDA(const Function &, const MCSymbol &,
135 const TargetMachine &) const {
136 return LSDASection;
137 }
138
139 virtual bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference,
140 const Function &F) const;
141
142 /// Targets should implement this method to assign a section to globals with
143 /// an explicit section specfied. The implementation of this method can
144 /// assume that GO->hasSection() is true.
145 virtual MCSection *
146 getExplicitSectionGlobal(const GlobalObject *GO, SectionKind Kind,
147 const TargetMachine &TM) const = 0;
148
149 /// Return an MCExpr to use for a reference to the specified global variable
150 /// from exception handling information.
151 virtual const MCExpr *getTTypeGlobalReference(const GlobalValue *GV,
152 unsigned Encoding,
153 const TargetMachine &TM,
154 MachineModuleInfo *MMI,
155 MCStreamer &Streamer) const;
156
157 /// Return the MCSymbol for a private symbol with global value name as its
158 /// base, with the specified suffix.
159 MCSymbol *getSymbolWithGlobalValueBase(const GlobalValue *GV,
160 StringRef Suffix,
161 const TargetMachine &TM) const;
162
163 // The symbol that gets passed to .cfi_personality.
164 virtual MCSymbol *getCFIPersonalitySymbol(const GlobalValue *GV,
165 const TargetMachine &TM,
166 MachineModuleInfo *MMI) const;
167
168 unsigned getPersonalityEncoding() const { return PersonalityEncoding; }
169 unsigned getLSDAEncoding() const { return LSDAEncoding; }
170 unsigned getTTypeEncoding() const { return TTypeEncoding; }
171 unsigned getCallSiteEncoding() const;
172
173 const MCExpr *getTTypeReference(const MCSymbolRefExpr *Sym, unsigned Encoding,
174 MCStreamer &Streamer) const;
175
176 virtual MCSection *getStaticCtorSection(unsigned Priority,
177 const MCSymbol *KeySym) const {
178 return StaticCtorSection;
179 }
180
181 virtual MCSection *getStaticDtorSection(unsigned Priority,
182 const MCSymbol *KeySym) const {
183 return StaticDtorSection;
184 }
185
186 /// Create a symbol reference to describe the given TLS variable when
187 /// emitting the address in debug info.
188 virtual const MCExpr *getDebugThreadLocalSymbol(const MCSymbol *Sym) const;
189
190 virtual const MCExpr *lowerRelativeReference(const GlobalValue *LHS,
191 const GlobalValue *RHS,
192 const TargetMachine &TM) const {
193 return nullptr;
194 }
195
196 /// Target supports a native lowering of a dso_local_equivalent constant
197 /// without needing to replace it with equivalent IR.
198 bool supportDSOLocalEquivalentLowering() const {
199 return SupportDSOLocalEquivalentLowering;
200 }
201
202 virtual const MCExpr *lowerDSOLocalEquivalent(const DSOLocalEquivalent *Equiv,
203 const TargetMachine &TM) const {
204 return nullptr;
205 }
206
207 /// Target supports replacing a data "PC"-relative access to a symbol
208 /// through another symbol, by accessing the later via a GOT entry instead?
209 bool supportIndirectSymViaGOTPCRel() const {
210 return SupportIndirectSymViaGOTPCRel;
211 }
212
213 /// Target GOT "PC"-relative relocation supports encoding an additional
214 /// binary expression with an offset?
215 bool supportGOTPCRelWithOffset() const {
216 return SupportGOTPCRelWithOffset;
217 }
218
219 /// Target supports TLS offset relocation in debug section?
220 bool supportDebugThreadLocalLocation() const {
221 return SupportDebugThreadLocalLocation;
222 }
223
224 /// Returns the register used as static base in RWPI variants.
225 virtual MCRegister getStaticBase() const { return MCRegister::NoRegister; }
226
227 /// Get the target specific RWPI relocation.
228 virtual const MCExpr *getIndirectSymViaRWPI(const MCSymbol *Sym) const {
229 return nullptr;
230 }
231
232 /// Get the target specific PC relative GOT entry relocation
233 virtual const MCExpr *getIndirectSymViaGOTPCRel(const GlobalValue *GV,
234 const MCSymbol *Sym,
235 const MCValue &MV,
236 int64_t Offset,
237 MachineModuleInfo *MMI,
238 MCStreamer &Streamer) const {
239 return nullptr;
240 }
241
242 /// If supported, return the section to use for the llvm.commandline
243 /// metadata. Otherwise, return nullptr.
244 virtual MCSection *getSectionForCommandLines() const {
245 return nullptr;
246 }
247
248 /// On targets that use separate function descriptor symbols, return a section
249 /// for the descriptor given its symbol. Use only with defined functions.
250 virtual MCSection *
251 getSectionForFunctionDescriptor(const Function *F,
252 const TargetMachine &TM) const {
253 return nullptr;
254 }
255
256 /// On targets that support TOC entries, return a section for the entry given
257 /// the symbol it refers to.
258 /// TODO: Implement this interface for existing ELF targets.
259 virtual MCSection *getSectionForTOCEntry(const MCSymbol *S,
260 const TargetMachine &TM) const {
261 return nullptr;
262 }
263
264 /// On targets that associate external references with a section, return such
265 /// a section for the given external global.
266 virtual MCSection *
267 getSectionForExternalReference(const GlobalObject *GO,
268 const TargetMachine &TM) const {
269 return nullptr;
270 }
271
272 /// Targets that have a special convention for their symbols could use
273 /// this hook to return a specialized symbol.
274 virtual MCSymbol *getTargetSymbol(const GlobalValue *GV,
275 const TargetMachine &TM) const {
276 return nullptr;
277 }
278
279 /// If supported, return the function entry point symbol.
280 /// Otherwise, returns nullptr.
281 /// Func must be a function or an alias which has a function as base object.
282 virtual MCSymbol *getFunctionEntryPointSymbol(const GlobalValue *Func,
283 const TargetMachine &TM) const {
284 return nullptr;
285 }
286
287protected:
288 virtual MCSection *SelectSectionForGlobal(const GlobalObject *GO,
289 SectionKind Kind,
290 const TargetMachine &TM) const = 0;
291};
292
293} // end namespace llvm
294
295#endif // LLVM_TARGET_TARGETLOWERINGOBJECTFILE_H
296

source code of llvm/include/llvm/Target/TargetLoweringObjectFile.h