Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
14 pmbaty 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
 
21
namespace llvm {
22
 
23
struct Align;
24
class Constant;
25
class DataLayout;
26
class Function;
27
class GlobalObject;
28
class GlobalValue;
29
class MachineBasicBlock;
30
class MachineModuleInfo;
31
class Mangler;
32
class MCContext;
33
class MCExpr;
34
class MCSection;
35
class MCSymbol;
36
class MCSymbolRefExpr;
37
class MCStreamer;
38
class MCValue;
39
class Module;
40
class SectionKind;
41
class StringRef;
42
class TargetMachine;
43
class DSOLocalEquivalent;
44
 
45
class TargetLoweringObjectFile : public MCObjectFileInfo {
46
  /// Name-mangler for global names.
47
  Mangler *Mang = nullptr;
48
 
49
protected:
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
 
70
public:
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
 
287
protected:
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