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
38public:
39  virtual ~TargetLoweringObjectFileELF() {}
40
41  void emitPersonalityValue(MCStreamer &Streamer, const TargetMachine &TM,
42                            const MCSymbol *Sym) const override;
43
44  /// Given a constant with the SectionKind, return a section that it should be
45  /// placed in.
46  const MCSection *getSectionForConstant(SectionKind Kind) const override;
47
48  const MCSection *getExplicitSectionGlobal(const GlobalValue *GV,
49                                        SectionKind Kind, Mangler &Mang,
50                                        const TargetMachine &TM) const override;
51
52  const MCSection *SelectSectionForGlobal(const GlobalValue *GV,
53                                        SectionKind Kind, Mangler &Mang,
54                                        const TargetMachine &TM) const override;
55
56  /// Return an MCExpr to use for a reference to the specified type info global
57  /// variable from exception handling information.
58  const MCExpr *
59  getTTypeGlobalReference(const GlobalValue *GV, unsigned Encoding,
60                          Mangler &Mang, const TargetMachine &TM,
61                          MachineModuleInfo *MMI,
62                          MCStreamer &Streamer) const override;
63
64  // The symbol that gets passed to .cfi_personality.
65  MCSymbol *getCFIPersonalitySymbol(const GlobalValue *GV, Mangler &Mang,
66                                    const TargetMachine &TM,
67                                    MachineModuleInfo *MMI) const override;
68
69  void InitializeELF(bool UseInitArray_);
70  const MCSection *getStaticCtorSection(unsigned Priority,
71                                        const MCSymbol *KeySym) const override;
72  const MCSection *getStaticDtorSection(unsigned Priority,
73                                        const MCSymbol *KeySym) const override;
74};
75
76
77
78class TargetLoweringObjectFileMachO : public TargetLoweringObjectFile {
79public:
80  virtual ~TargetLoweringObjectFileMachO() {}
81
82  /// Extract the dependent library name from a linker option string. Returns
83  /// StringRef() if the option does not specify a library.
84  StringRef getDepLibFromLinkerOpt(StringRef LinkerOption) const override;
85
86  /// Emit the module flags that specify the garbage collection information.
87  void emitModuleFlags(MCStreamer &Streamer,
88                       ArrayRef<Module::ModuleFlagEntry> ModuleFlags,
89                       Mangler &Mang, const TargetMachine &TM) const override;
90
91  bool isSectionAtomizableBySymbols(const MCSection &Section) const override;
92
93  const MCSection *
94    SelectSectionForGlobal(const GlobalValue *GV,
95                           SectionKind Kind, Mangler &Mang,
96                           const TargetMachine &TM) const override;
97
98  const MCSection *
99    getExplicitSectionGlobal(const GlobalValue *GV,
100                             SectionKind Kind, Mangler &Mang,
101                             const TargetMachine &TM) const override;
102
103  const MCSection *getSectionForConstant(SectionKind Kind) const override;
104
105  /// The mach-o version of this method defaults to returning a stub reference.
106  const MCExpr *
107  getTTypeGlobalReference(const GlobalValue *GV, unsigned Encoding,
108                          Mangler &Mang, const TargetMachine &TM,
109                          MachineModuleInfo *MMI,
110                          MCStreamer &Streamer) const override;
111
112  // The symbol that gets passed to .cfi_personality.
113  MCSymbol *getCFIPersonalitySymbol(const GlobalValue *GV, Mangler &Mang,
114                                    const TargetMachine &TM,
115                                    MachineModuleInfo *MMI) const override;
116};
117
118
119
120class TargetLoweringObjectFileCOFF : public TargetLoweringObjectFile {
121public:
122  virtual ~TargetLoweringObjectFileCOFF() {}
123
124  const MCSection *
125    getExplicitSectionGlobal(const GlobalValue *GV,
126                             SectionKind Kind, Mangler &Mang,
127                             const TargetMachine &TM) const override;
128
129  const MCSection *
130    SelectSectionForGlobal(const GlobalValue *GV,
131                           SectionKind Kind, Mangler &Mang,
132                           const TargetMachine &TM) const override;
133
134  /// Extract the dependent library name from a linker option string. Returns
135  /// StringRef() if the option does not specify a library.
136  StringRef getDepLibFromLinkerOpt(StringRef LinkerOption) const override;
137
138  /// Emit Obj-C garbage collection and linker options. Only linker option
139  /// emission is implemented for COFF.
140  void emitModuleFlags(MCStreamer &Streamer,
141                       ArrayRef<Module::ModuleFlagEntry> ModuleFlags,
142                       Mangler &Mang, const TargetMachine &TM) const override;
143
144  const MCSection *getStaticCtorSection(unsigned Priority,
145                                        const MCSymbol *KeySym) const override;
146  const MCSection *getStaticDtorSection(unsigned Priority,
147                                        const MCSymbol *KeySym) const override;
148};
149
150} // end namespace llvm
151
152#endif
153