1 //===-- llvm/Target/TargetLoweringObjectFile.h - Object Info ----*- C++ -*-===//
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
7 //===----------------------------------------------------------------------===//
9 // This file implements classes used to handle lowerings specific to common
10 // object file formats.
12 //===----------------------------------------------------------------------===//
14 #ifndef LLVM_CODEGEN_TARGETLOWERINGOBJECTFILE_H
15 #define LLVM_CODEGEN_TARGETLOWERINGOBJECTFILE_H
17 #include "llvm/ADT/ArrayRef.h"
18 #include "llvm/ADT/StringRef.h"
19 #include "llvm/IR/Module.h"
20 #include "llvm/MC/MCObjectFileInfo.h"
21 #include "llvm/MC/SectionKind.h"
27 class MachineModuleInfo
;
33 class MCSymbolRefExpr
;
38 class TargetLoweringObjectFile
: public MCObjectFileInfo
{
39 MCContext
*Ctx
= nullptr;
41 /// Name-mangler for global names.
42 Mangler
*Mang
= nullptr;
45 bool SupportIndirectSymViaGOTPCRel
= false;
46 bool SupportGOTPCRelWithOffset
= true;
47 bool SupportDebugThreadLocalLocation
= true;
49 /// PersonalityEncoding, LSDAEncoding, TTypeEncoding - Some encoding values
51 unsigned PersonalityEncoding
= 0;
52 unsigned LSDAEncoding
= 0;
53 unsigned TTypeEncoding
= 0;
55 /// This section contains the static constructor pointer list.
56 MCSection
*StaticCtorSection
= nullptr;
58 /// This section contains the static destructor pointer list.
59 MCSection
*StaticDtorSection
= nullptr;
62 TargetLoweringObjectFile() = default;
63 TargetLoweringObjectFile(const TargetLoweringObjectFile
&) = delete;
64 TargetLoweringObjectFile
&
65 operator=(const TargetLoweringObjectFile
&) = delete;
66 virtual ~TargetLoweringObjectFile();
68 MCContext
&getContext() const { return *Ctx
; }
69 Mangler
&getMangler() const { return *Mang
; }
71 /// This method must be called before any actual lowering is done. This
72 /// specifies the current context for codegen, and gives the lowering
73 /// implementations a chance to set up their default sections.
74 virtual void Initialize(MCContext
&ctx
, const TargetMachine
&TM
);
76 virtual void emitPersonalityValue(MCStreamer
&Streamer
, const DataLayout
&TM
,
77 const MCSymbol
*Sym
) const;
79 /// Emit the module-level metadata that the platform cares about.
80 virtual void emitModuleMetadata(MCStreamer
&Streamer
, Module
&M
) const {}
82 /// Get the module-level metadata that the platform cares about.
83 virtual void getModuleMetadata(Module
&M
) {}
85 /// Given a constant with the SectionKind, return a section that it should be
87 virtual MCSection
*getSectionForConstant(const DataLayout
&DL
,
90 unsigned &Align
) const;
92 /// Classify the specified global variable into a set of target independent
93 /// categories embodied in SectionKind.
94 static SectionKind
getKindForGlobal(const GlobalObject
*GO
,
95 const TargetMachine
&TM
);
97 /// This method computes the appropriate section to emit the specified global
98 /// variable or function definition. This should not be passed external (or
99 /// available externally) globals.
100 MCSection
*SectionForGlobal(const GlobalObject
*GO
, SectionKind Kind
,
101 const TargetMachine
&TM
) const;
103 /// This method computes the appropriate section to emit the specified global
104 /// variable or function definition. This should not be passed external (or
105 /// available externally) globals.
106 MCSection
*SectionForGlobal(const GlobalObject
*GO
,
107 const TargetMachine
&TM
) const {
108 return SectionForGlobal(GO
, getKindForGlobal(GO
, TM
), TM
);
111 virtual void getNameWithPrefix(SmallVectorImpl
<char> &OutName
,
112 const GlobalValue
*GV
,
113 const TargetMachine
&TM
) const;
115 virtual MCSection
*getSectionForJumpTable(const Function
&F
,
116 const TargetMachine
&TM
) const;
118 virtual bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference
,
119 const Function
&F
) const;
121 /// Targets should implement this method to assign a section to globals with
122 /// an explicit section specfied. The implementation of this method can
123 /// assume that GO->hasSection() is true.
125 getExplicitSectionGlobal(const GlobalObject
*GO
, SectionKind Kind
,
126 const TargetMachine
&TM
) const = 0;
128 /// Return an MCExpr to use for a reference to the specified global variable
129 /// from exception handling information.
130 virtual const MCExpr
*getTTypeGlobalReference(const GlobalValue
*GV
,
132 const TargetMachine
&TM
,
133 MachineModuleInfo
*MMI
,
134 MCStreamer
&Streamer
) const;
136 /// Return the MCSymbol for a private symbol with global value name as its
137 /// base, with the specified suffix.
138 MCSymbol
*getSymbolWithGlobalValueBase(const GlobalValue
*GV
,
140 const TargetMachine
&TM
) const;
142 // The symbol that gets passed to .cfi_personality.
143 virtual MCSymbol
*getCFIPersonalitySymbol(const GlobalValue
*GV
,
144 const TargetMachine
&TM
,
145 MachineModuleInfo
*MMI
) const;
147 unsigned getPersonalityEncoding() const { return PersonalityEncoding
; }
148 unsigned getLSDAEncoding() const { return LSDAEncoding
; }
149 unsigned getTTypeEncoding() const { return TTypeEncoding
; }
151 const MCExpr
*getTTypeReference(const MCSymbolRefExpr
*Sym
, unsigned Encoding
,
152 MCStreamer
&Streamer
) const;
154 virtual MCSection
*getStaticCtorSection(unsigned Priority
,
155 const MCSymbol
*KeySym
) const {
156 return StaticCtorSection
;
159 virtual MCSection
*getStaticDtorSection(unsigned Priority
,
160 const MCSymbol
*KeySym
) const {
161 return StaticDtorSection
;
164 /// Create a symbol reference to describe the given TLS variable when
165 /// emitting the address in debug info.
166 virtual const MCExpr
*getDebugThreadLocalSymbol(const MCSymbol
*Sym
) const;
168 virtual const MCExpr
*lowerRelativeReference(const GlobalValue
*LHS
,
169 const GlobalValue
*RHS
,
170 const TargetMachine
&TM
) const {
174 /// Target supports replacing a data "PC"-relative access to a symbol
175 /// through another symbol, by accessing the later via a GOT entry instead?
176 bool supportIndirectSymViaGOTPCRel() const {
177 return SupportIndirectSymViaGOTPCRel
;
180 /// Target GOT "PC"-relative relocation supports encoding an additional
181 /// binary expression with an offset?
182 bool supportGOTPCRelWithOffset() const {
183 return SupportGOTPCRelWithOffset
;
186 /// Target supports TLS offset relocation in debug section?
187 bool supportDebugThreadLocalLocation() const {
188 return SupportDebugThreadLocalLocation
;
191 /// Get the target specific PC relative GOT entry relocation
192 virtual const MCExpr
*getIndirectSymViaGOTPCRel(const MCSymbol
*Sym
,
195 MachineModuleInfo
*MMI
,
196 MCStreamer
&Streamer
) const {
200 virtual void emitLinkerFlagsForGlobal(raw_ostream
&OS
,
201 const GlobalValue
*GV
) const {}
203 virtual void emitLinkerFlagsForUsed(raw_ostream
&OS
,
204 const GlobalValue
*GV
) const {}
206 /// If supported, return the section to use for the llvm.commandline
207 /// metadata. Otherwise, return nullptr.
208 virtual MCSection
*getSectionForCommandLines() const {
213 virtual MCSection
*SelectSectionForGlobal(const GlobalObject
*GO
,
215 const TargetMachine
&TM
) const = 0;
218 } // end namespace llvm
220 #endif // LLVM_CODEGEN_TARGETLOWERINGOBJECTFILE_H