1//==-- llvm/CodeGen/TargetLoweringObjectFileImpl.h - Object Info -*- C++ -*-==//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file implements classes used to handle lowerings specific to common
11// object file formats.
12//
13//===----------------------------------------------------------------------===//
14
15#ifndef LLVM_CODEGEN_TARGETLOWERINGOBJECTFILEIMPL_H
16#define LLVM_CODEGEN_TARGETLOWERINGOBJECTFILEIMPL_H
17
18#include "llvm/ADT/StringRef.h"
19#include "llvm/MC/SectionKind.h"
20#include "llvm/Target/TargetLoweringObjectFile.h"
21
22namespace llvm {
23  class MachineModuleInfo;
24  class Mangler;
25  class MCAsmInfo;
26  class MCExpr;
27  class MCSection;
28  class MCSectionMachO;
29  class MCSymbol;
30  class MCContext;
31  class GlobalValue;
32  class TargetMachine;
33
34
35class TargetLoweringObjectFileELF : public TargetLoweringObjectFile {
36  bool UseInitArray;
37  mutable unsigned NextUniqueID = 0;
38
39public:
40  TargetLoweringObjectFileELF() : UseInitArray(false) {}
41
42  ~TargetLoweringObjectFileELF() override {}
43
44  void emitPersonalityValue(MCStreamer &Streamer, const TargetMachine &TM,
45                            const MCSymbol *Sym) const override;
46
47  /// Given a constant with the SectionKind, return a section that it should be
48  /// placed in.
49  const MCSection *getSectionForConstant(SectionKind Kind,
50                                         const Constant *C) const override;
51
52  const MCSection *getExplicitSectionGlobal(const GlobalValue *GV,
53                                        SectionKind Kind, Mangler &Mang,
54                                        const TargetMachine &TM) const override;
55
56  const MCSection *SelectSectionForGlobal(const GlobalValue *GV,
57                                        SectionKind Kind, Mangler &Mang,
58                                        const TargetMachine &TM) const override;
59
60  const MCSection *
61  getSectionForJumpTable(const Function &F, Mangler &Mang,
62                         const TargetMachine &TM) const override;
63
64  bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference,
65                                           const Function &F) const override;
66
67  /// Return an MCExpr to use for a reference to the specified type info global
68  /// variable from exception handling information.
69  const MCExpr *
70  getTTypeGlobalReference(const GlobalValue *GV, unsigned Encoding,
71                          Mangler &Mang, const TargetMachine &TM,
72                          MachineModuleInfo *MMI,
73                          MCStreamer &Streamer) const override;
74
75  // The symbol that gets passed to .cfi_personality.
76  MCSymbol *getCFIPersonalitySymbol(const GlobalValue *GV, Mangler &Mang,
77                                    const TargetMachine &TM,
78                                    MachineModuleInfo *MMI) const override;
79
80  void InitializeELF(bool UseInitArray_);
81  const MCSection *getStaticCtorSection(unsigned Priority,
82                                        const MCSymbol *KeySym) const override;
83  const MCSection *getStaticDtorSection(unsigned Priority,
84                                        const MCSymbol *KeySym) const override;
85};
86
87
88
89class TargetLoweringObjectFileMachO : public TargetLoweringObjectFile {
90public:
91  ~TargetLoweringObjectFileMachO() override {}
92  TargetLoweringObjectFileMachO();
93
94  /// Extract the dependent library name from a linker option string. Returns
95  /// StringRef() if the option does not specify a library.
96  StringRef getDepLibFromLinkerOpt(StringRef LinkerOption) const override;
97
98  /// Emit the module flags that specify the garbage collection information.
99  void emitModuleFlags(MCStreamer &Streamer,
100                       ArrayRef<Module::ModuleFlagEntry> ModuleFlags,
101                       Mangler &Mang, const TargetMachine &TM) const override;
102
103  const MCSection *
104    SelectSectionForGlobal(const GlobalValue *GV,
105                           SectionKind Kind, Mangler &Mang,
106                           const TargetMachine &TM) const override;
107
108  const MCSection *
109    getExplicitSectionGlobal(const GlobalValue *GV,
110                             SectionKind Kind, Mangler &Mang,
111                             const TargetMachine &TM) const override;
112
113  const MCSection *getSectionForConstant(SectionKind Kind,
114                                         const Constant *C) const override;
115
116  /// The mach-o version of this method defaults to returning a stub reference.
117  const MCExpr *
118  getTTypeGlobalReference(const GlobalValue *GV, unsigned Encoding,
119                          Mangler &Mang, const TargetMachine &TM,
120                          MachineModuleInfo *MMI,
121                          MCStreamer &Streamer) const override;
122
123  // The symbol that gets passed to .cfi_personality.
124  MCSymbol *getCFIPersonalitySymbol(const GlobalValue *GV, Mangler &Mang,
125                                    const TargetMachine &TM,
126                                    MachineModuleInfo *MMI) const override;
127
128  /// Get MachO PC relative GOT entry relocation
129  const MCExpr *getIndirectSymViaGOTPCRel(const MCSymbol *Sym,
130                                          const MCValue &MV, int64_t Offset,
131                                          MachineModuleInfo *MMI,
132                                          MCStreamer &Streamer) const override;
133};
134
135
136
137class TargetLoweringObjectFileCOFF : public TargetLoweringObjectFile {
138public:
139  ~TargetLoweringObjectFileCOFF() override {}
140
141  const MCSection *
142    getExplicitSectionGlobal(const GlobalValue *GV,
143                             SectionKind Kind, Mangler &Mang,
144                             const TargetMachine &TM) const override;
145
146  const MCSection *
147    SelectSectionForGlobal(const GlobalValue *GV,
148                           SectionKind Kind, Mangler &Mang,
149                           const TargetMachine &TM) const override;
150
151  void getNameWithPrefix(SmallVectorImpl<char> &OutName, const GlobalValue *GV,
152                         bool CannotUsePrivateLabel, Mangler &Mang,
153                         const TargetMachine &TM) const override;
154
155  const MCSection *
156  getSectionForJumpTable(const Function &F, Mangler &Mang,
157                         const TargetMachine &TM) const override;
158
159  /// Extract the dependent library name from a linker option string. Returns
160  /// StringRef() if the option does not specify a library.
161  StringRef getDepLibFromLinkerOpt(StringRef LinkerOption) const override;
162
163  /// Emit Obj-C garbage collection and linker options. Only linker option
164  /// emission is implemented for COFF.
165  void emitModuleFlags(MCStreamer &Streamer,
166                       ArrayRef<Module::ModuleFlagEntry> ModuleFlags,
167                       Mangler &Mang, const TargetMachine &TM) const override;
168
169  const MCSection *getStaticCtorSection(unsigned Priority,
170                                        const MCSymbol *KeySym) const override;
171  const MCSection *getStaticDtorSection(unsigned Priority,
172                                        const MCSymbol *KeySym) const override;
173};
174
175} // end namespace llvm
176
177#endif
178