1336809Sdim//===-- llvm/Target/TargetLoweringObjectFile.h - Object Info ----*- C++ -*-===//
2336809Sdim//
3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4353358Sdim// See https://llvm.org/LICENSE.txt for license information.
5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6336809Sdim//
7336809Sdim//===----------------------------------------------------------------------===//
8336809Sdim//
9336809Sdim// This file implements classes used to handle lowerings specific to common
10336809Sdim// object file formats.
11336809Sdim//
12336809Sdim//===----------------------------------------------------------------------===//
13336809Sdim
14336809Sdim#ifndef LLVM_CODEGEN_TARGETLOWERINGOBJECTFILE_H
15336809Sdim#define LLVM_CODEGEN_TARGETLOWERINGOBJECTFILE_H
16336809Sdim
17336809Sdim#include "llvm/ADT/ArrayRef.h"
18336809Sdim#include "llvm/ADT/StringRef.h"
19336809Sdim#include "llvm/IR/Module.h"
20336809Sdim#include "llvm/MC/MCObjectFileInfo.h"
21336809Sdim#include "llvm/MC/SectionKind.h"
22336809Sdim#include <cstdint>
23336809Sdim
24336809Sdimnamespace llvm {
25336809Sdim
26336809Sdimclass GlobalValue;
27336809Sdimclass MachineModuleInfo;
28336809Sdimclass Mangler;
29336809Sdimclass MCContext;
30336809Sdimclass MCExpr;
31336809Sdimclass MCSection;
32336809Sdimclass MCSymbol;
33336809Sdimclass MCSymbolRefExpr;
34336809Sdimclass MCStreamer;
35336809Sdimclass MCValue;
36336809Sdimclass TargetMachine;
37336809Sdim
38336809Sdimclass TargetLoweringObjectFile : public MCObjectFileInfo {
39336809Sdim  MCContext *Ctx = nullptr;
40336809Sdim
41336809Sdim  /// Name-mangler for global names.
42336809Sdim  Mangler *Mang = nullptr;
43336809Sdim
44336809Sdimprotected:
45336809Sdim  bool SupportIndirectSymViaGOTPCRel = false;
46336809Sdim  bool SupportGOTPCRelWithOffset = true;
47344779Sdim  bool SupportDebugThreadLocalLocation = true;
48336809Sdim
49344779Sdim  /// PersonalityEncoding, LSDAEncoding, TTypeEncoding - Some encoding values
50344779Sdim  /// for EH.
51344779Sdim  unsigned PersonalityEncoding = 0;
52344779Sdim  unsigned LSDAEncoding = 0;
53344779Sdim  unsigned TTypeEncoding = 0;
54353358Sdim  unsigned CallSiteEncoding = 0;
55344779Sdim
56336809Sdim  /// This section contains the static constructor pointer list.
57336809Sdim  MCSection *StaticCtorSection = nullptr;
58336809Sdim
59336809Sdim  /// This section contains the static destructor pointer list.
60336809Sdim  MCSection *StaticDtorSection = nullptr;
61336809Sdim
62336809Sdimpublic:
63336809Sdim  TargetLoweringObjectFile() = default;
64336809Sdim  TargetLoweringObjectFile(const TargetLoweringObjectFile &) = delete;
65336809Sdim  TargetLoweringObjectFile &
66336809Sdim  operator=(const TargetLoweringObjectFile &) = delete;
67336809Sdim  virtual ~TargetLoweringObjectFile();
68336809Sdim
69336809Sdim  MCContext &getContext() const { return *Ctx; }
70336809Sdim  Mangler &getMangler() const { return *Mang; }
71336809Sdim
72336809Sdim  /// This method must be called before any actual lowering is done.  This
73336809Sdim  /// specifies the current context for codegen, and gives the lowering
74336809Sdim  /// implementations a chance to set up their default sections.
75336809Sdim  virtual void Initialize(MCContext &ctx, const TargetMachine &TM);
76336809Sdim
77336809Sdim  virtual void emitPersonalityValue(MCStreamer &Streamer, const DataLayout &TM,
78336809Sdim                                    const MCSymbol *Sym) const;
79336809Sdim
80336809Sdim  /// Emit the module-level metadata that the platform cares about.
81336809Sdim  virtual void emitModuleMetadata(MCStreamer &Streamer, Module &M) const {}
82336809Sdim
83353358Sdim  /// Get the module-level metadata that the platform cares about.
84353358Sdim  virtual void getModuleMetadata(Module &M) {}
85353358Sdim
86336809Sdim  /// Given a constant with the SectionKind, return a section that it should be
87336809Sdim  /// placed in.
88336809Sdim  virtual MCSection *getSectionForConstant(const DataLayout &DL,
89336809Sdim                                           SectionKind Kind,
90336809Sdim                                           const Constant *C,
91336809Sdim                                           unsigned &Align) const;
92336809Sdim
93336809Sdim  /// Classify the specified global variable into a set of target independent
94336809Sdim  /// categories embodied in SectionKind.
95336809Sdim  static SectionKind getKindForGlobal(const GlobalObject *GO,
96336809Sdim                                      const TargetMachine &TM);
97336809Sdim
98336809Sdim  /// This method computes the appropriate section to emit the specified global
99336809Sdim  /// variable or function definition. This should not be passed external (or
100336809Sdim  /// available externally) globals.
101336809Sdim  MCSection *SectionForGlobal(const GlobalObject *GO, SectionKind Kind,
102336809Sdim                              const TargetMachine &TM) const;
103336809Sdim
104336809Sdim  /// This method computes the appropriate section to emit the specified global
105336809Sdim  /// variable or function definition. This should not be passed external (or
106336809Sdim  /// available externally) globals.
107336809Sdim  MCSection *SectionForGlobal(const GlobalObject *GO,
108336809Sdim                              const TargetMachine &TM) const {
109336809Sdim    return SectionForGlobal(GO, getKindForGlobal(GO, TM), TM);
110336809Sdim  }
111336809Sdim
112336809Sdim  virtual void getNameWithPrefix(SmallVectorImpl<char> &OutName,
113336809Sdim                                 const GlobalValue *GV,
114336809Sdim                                 const TargetMachine &TM) const;
115336809Sdim
116336809Sdim  virtual MCSection *getSectionForJumpTable(const Function &F,
117336809Sdim                                            const TargetMachine &TM) const;
118336809Sdim
119336809Sdim  virtual bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference,
120336809Sdim                                                   const Function &F) const;
121336809Sdim
122336809Sdim  /// Targets should implement this method to assign a section to globals with
123336809Sdim  /// an explicit section specfied. The implementation of this method can
124336809Sdim  /// assume that GO->hasSection() is true.
125336809Sdim  virtual MCSection *
126336809Sdim  getExplicitSectionGlobal(const GlobalObject *GO, SectionKind Kind,
127336809Sdim                           const TargetMachine &TM) const = 0;
128336809Sdim
129336809Sdim  /// Return an MCExpr to use for a reference to the specified global variable
130336809Sdim  /// from exception handling information.
131336809Sdim  virtual const MCExpr *getTTypeGlobalReference(const GlobalValue *GV,
132336809Sdim                                                unsigned Encoding,
133336809Sdim                                                const TargetMachine &TM,
134336809Sdim                                                MachineModuleInfo *MMI,
135336809Sdim                                                MCStreamer &Streamer) const;
136336809Sdim
137336809Sdim  /// Return the MCSymbol for a private symbol with global value name as its
138336809Sdim  /// base, with the specified suffix.
139336809Sdim  MCSymbol *getSymbolWithGlobalValueBase(const GlobalValue *GV,
140336809Sdim                                         StringRef Suffix,
141336809Sdim                                         const TargetMachine &TM) const;
142336809Sdim
143336809Sdim  // The symbol that gets passed to .cfi_personality.
144336809Sdim  virtual MCSymbol *getCFIPersonalitySymbol(const GlobalValue *GV,
145336809Sdim                                            const TargetMachine &TM,
146336809Sdim                                            MachineModuleInfo *MMI) const;
147336809Sdim
148344779Sdim  unsigned getPersonalityEncoding() const { return PersonalityEncoding; }
149344779Sdim  unsigned getLSDAEncoding() const { return LSDAEncoding; }
150344779Sdim  unsigned getTTypeEncoding() const { return TTypeEncoding; }
151353358Sdim  unsigned getCallSiteEncoding() const { return CallSiteEncoding; }
152344779Sdim
153336809Sdim  const MCExpr *getTTypeReference(const MCSymbolRefExpr *Sym, unsigned Encoding,
154336809Sdim                                  MCStreamer &Streamer) const;
155336809Sdim
156336809Sdim  virtual MCSection *getStaticCtorSection(unsigned Priority,
157336809Sdim                                          const MCSymbol *KeySym) const {
158336809Sdim    return StaticCtorSection;
159336809Sdim  }
160336809Sdim
161336809Sdim  virtual MCSection *getStaticDtorSection(unsigned Priority,
162336809Sdim                                          const MCSymbol *KeySym) const {
163336809Sdim    return StaticDtorSection;
164336809Sdim  }
165336809Sdim
166336809Sdim  /// Create a symbol reference to describe the given TLS variable when
167336809Sdim  /// emitting the address in debug info.
168336809Sdim  virtual const MCExpr *getDebugThreadLocalSymbol(const MCSymbol *Sym) const;
169336809Sdim
170336809Sdim  virtual const MCExpr *lowerRelativeReference(const GlobalValue *LHS,
171336809Sdim                                               const GlobalValue *RHS,
172336809Sdim                                               const TargetMachine &TM) const {
173336809Sdim    return nullptr;
174336809Sdim  }
175336809Sdim
176336809Sdim  /// Target supports replacing a data "PC"-relative access to a symbol
177336809Sdim  /// through another symbol, by accessing the later via a GOT entry instead?
178336809Sdim  bool supportIndirectSymViaGOTPCRel() const {
179336809Sdim    return SupportIndirectSymViaGOTPCRel;
180336809Sdim  }
181336809Sdim
182336809Sdim  /// Target GOT "PC"-relative relocation supports encoding an additional
183336809Sdim  /// binary expression with an offset?
184336809Sdim  bool supportGOTPCRelWithOffset() const {
185336809Sdim    return SupportGOTPCRelWithOffset;
186336809Sdim  }
187336809Sdim
188344779Sdim  /// Target supports TLS offset relocation in debug section?
189344779Sdim  bool supportDebugThreadLocalLocation() const {
190344779Sdim    return SupportDebugThreadLocalLocation;
191344779Sdim  }
192344779Sdim
193336809Sdim  /// Get the target specific PC relative GOT entry relocation
194360784Sdim  virtual const MCExpr *getIndirectSymViaGOTPCRel(const GlobalValue *GV,
195360784Sdim                                                  const MCSymbol *Sym,
196336809Sdim                                                  const MCValue &MV,
197336809Sdim                                                  int64_t Offset,
198336809Sdim                                                  MachineModuleInfo *MMI,
199336809Sdim                                                  MCStreamer &Streamer) const {
200336809Sdim    return nullptr;
201336809Sdim  }
202336809Sdim
203336809Sdim  virtual void emitLinkerFlagsForGlobal(raw_ostream &OS,
204336809Sdim                                        const GlobalValue *GV) const {}
205336809Sdim
206336809Sdim  virtual void emitLinkerFlagsForUsed(raw_ostream &OS,
207336809Sdim                                      const GlobalValue *GV) const {}
208336809Sdim
209344779Sdim  /// If supported, return the section to use for the llvm.commandline
210344779Sdim  /// metadata. Otherwise, return nullptr.
211344779Sdim  virtual MCSection *getSectionForCommandLines() const {
212344779Sdim    return nullptr;
213344779Sdim  }
214344779Sdim
215336809Sdimprotected:
216336809Sdim  virtual MCSection *SelectSectionForGlobal(const GlobalObject *GO,
217336809Sdim                                            SectionKind Kind,
218336809Sdim                                            const TargetMachine &TM) const = 0;
219336809Sdim};
220336809Sdim
221336809Sdim} // end namespace llvm
222336809Sdim
223336809Sdim#endif // LLVM_CODEGEN_TARGETLOWERINGOBJECTFILE_H
224