Coverage Report

Created: 2018-11-16 02:38

/Users/buildslave/jenkins/workspace/clang-stage2-coverage-R/llvm/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h
Line
Count
Source
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/IR/Module.h"
19
#include "llvm/MC/MCExpr.h"
20
#include "llvm/Target/TargetLoweringObjectFile.h"
21
22
namespace llvm {
23
24
class GlobalValue;
25
class MachineModuleInfo;
26
class Mangler;
27
class MCContext;
28
class MCSection;
29
class MCSymbol;
30
class TargetMachine;
31
32
class TargetLoweringObjectFileELF : public TargetLoweringObjectFile {
33
  bool UseInitArray = false;
34
  mutable unsigned NextUniqueID = 1;  // ID 0 is reserved for execute-only sections
35
36
protected:
37
  MCSymbolRefExpr::VariantKind PLTRelativeVariantKind =
38
      MCSymbolRefExpr::VK_None;
39
  const TargetMachine *TM;
40
41
public:
42
25.2k
  TargetLoweringObjectFileELF() = default;
43
24.9k
  ~TargetLoweringObjectFileELF() override = default;
44
45
  void Initialize(MCContext &Ctx, const TargetMachine &TM) override;
46
47
  /// Emit Obj-C garbage collection and linker options.
48
  void emitModuleMetadata(MCStreamer &Streamer, Module &M) const override;
49
50
  void emitPersonalityValue(MCStreamer &Streamer, const DataLayout &DL,
51
                            const MCSymbol *Sym) const override;
52
53
  /// Given a constant with the SectionKind, return a section that it should be
54
  /// placed in.
55
  MCSection *getSectionForConstant(const DataLayout &DL, SectionKind Kind,
56
                                   const Constant *C,
57
                                   unsigned &Align) const override;
58
59
  MCSection *getExplicitSectionGlobal(const GlobalObject *GO, SectionKind Kind,
60
                                      const TargetMachine &TM) const override;
61
62
  MCSection *SelectSectionForGlobal(const GlobalObject *GO, SectionKind Kind,
63
                                    const TargetMachine &TM) const override;
64
65
  MCSection *getSectionForJumpTable(const Function &F,
66
                                    const TargetMachine &TM) const override;
67
68
  bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference,
69
                                           const Function &F) const override;
70
71
  /// Return an MCExpr to use for a reference to the specified type info global
72
  /// variable from exception handling information.
73
  const MCExpr *getTTypeGlobalReference(const GlobalValue *GV,
74
                                        unsigned Encoding,
75
                                        const TargetMachine &TM,
76
                                        MachineModuleInfo *MMI,
77
                                        MCStreamer &Streamer) const override;
78
79
  // The symbol that gets passed to .cfi_personality.
80
  MCSymbol *getCFIPersonalitySymbol(const GlobalValue *GV,
81
                                    const TargetMachine &TM,
82
                                    MachineModuleInfo *MMI) const override;
83
84
  void InitializeELF(bool UseInitArray_);
85
  MCSection *getStaticCtorSection(unsigned Priority,
86
                                  const MCSymbol *KeySym) const override;
87
  MCSection *getStaticDtorSection(unsigned Priority,
88
                                  const MCSymbol *KeySym) const override;
89
90
  const MCExpr *lowerRelativeReference(const GlobalValue *LHS,
91
                                       const GlobalValue *RHS,
92
                                       const TargetMachine &TM) const override;
93
};
94
95
class TargetLoweringObjectFileMachO : public TargetLoweringObjectFile {
96
public:
97
  TargetLoweringObjectFileMachO();
98
7.33k
  ~TargetLoweringObjectFileMachO() override = default;
99
100
  void Initialize(MCContext &Ctx, const TargetMachine &TM) override;
101
102
  /// Emit the module flags that specify the garbage collection information.
103
  void emitModuleMetadata(MCStreamer &Streamer, Module &M) const override;
104
105
  MCSection *SelectSectionForGlobal(const GlobalObject *GO, SectionKind Kind,
106
                                    const TargetMachine &TM) const override;
107
108
  MCSection *getExplicitSectionGlobal(const GlobalObject *GO, SectionKind Kind,
109
                                      const TargetMachine &TM) const override;
110
111
  MCSection *getSectionForConstant(const DataLayout &DL, SectionKind Kind,
112
                                   const Constant *C,
113
                                   unsigned &Align) const override;
114
115
  /// The mach-o version of this method defaults to returning a stub reference.
116
  const MCExpr *getTTypeGlobalReference(const GlobalValue *GV,
117
                                        unsigned Encoding,
118
                                        const TargetMachine &TM,
119
                                        MachineModuleInfo *MMI,
120
                                        MCStreamer &Streamer) const override;
121
122
  // The symbol that gets passed to .cfi_personality.
123
  MCSymbol *getCFIPersonalitySymbol(const GlobalValue *GV,
124
                                    const TargetMachine &TM,
125
                                    MachineModuleInfo *MMI) const override;
126
127
  /// Get MachO PC relative GOT entry relocation
128
  const MCExpr *getIndirectSymViaGOTPCRel(const MCSymbol *Sym,
129
                                          const MCValue &MV, int64_t Offset,
130
                                          MachineModuleInfo *MMI,
131
                                          MCStreamer &Streamer) const override;
132
133
  void getNameWithPrefix(SmallVectorImpl<char> &OutName, const GlobalValue *GV,
134
                         const TargetMachine &TM) const override;
135
};
136
137
class TargetLoweringObjectFileCOFF : public TargetLoweringObjectFile {
138
  mutable unsigned NextUniqueID = 0;
139
140
public:
141
1.59k
  ~TargetLoweringObjectFileCOFF() override = default;
142
143
  void Initialize(MCContext &Ctx, const TargetMachine &TM) override;
144
  MCSection *getExplicitSectionGlobal(const GlobalObject *GO, SectionKind Kind,
145
                                      const TargetMachine &TM) const override;
146
147
  MCSection *SelectSectionForGlobal(const GlobalObject *GO, SectionKind Kind,
148
                                    const TargetMachine &TM) const override;
149
150
  void getNameWithPrefix(SmallVectorImpl<char> &OutName, const GlobalValue *GV,
151
                         const TargetMachine &TM) const override;
152
153
  MCSection *getSectionForJumpTable(const Function &F,
154
                                    const TargetMachine &TM) const override;
155
156
  /// Emit Obj-C garbage collection and linker options.
157
  void emitModuleMetadata(MCStreamer &Streamer, Module &M) const override;
158
159
  MCSection *getStaticCtorSection(unsigned Priority,
160
                                  const MCSymbol *KeySym) const override;
161
  MCSection *getStaticDtorSection(unsigned Priority,
162
                                  const MCSymbol *KeySym) const override;
163
164
  void emitLinkerFlagsForGlobal(raw_ostream &OS,
165
                                const GlobalValue *GV) const override;
166
167
  void emitLinkerFlagsForUsed(raw_ostream &OS,
168
                              const GlobalValue *GV) const override;
169
170
  const MCExpr *lowerRelativeReference(const GlobalValue *LHS,
171
                                       const GlobalValue *RHS,
172
                                       const TargetMachine &TM) const override;
173
174
  /// Given a mergeable constant with the specified size and relocation
175
  /// information, return a section that it should be placed in.
176
  MCSection *getSectionForConstant(const DataLayout &DL, SectionKind Kind,
177
                                   const Constant *C,
178
                                   unsigned &Align) const override;
179
};
180
181
class TargetLoweringObjectFileWasm : public TargetLoweringObjectFile {
182
  mutable unsigned NextUniqueID = 0;
183
184
public:
185
370
  TargetLoweringObjectFileWasm() = default;
186
361
  ~TargetLoweringObjectFileWasm() override = default;
187
188
  MCSection *getExplicitSectionGlobal(const GlobalObject *GO, SectionKind Kind,
189
                                      const TargetMachine &TM) const override;
190
191
  MCSection *SelectSectionForGlobal(const GlobalObject *GO, SectionKind Kind,
192
                                    const TargetMachine &TM) const override;
193
194
  bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference,
195
                                           const Function &F) const override;
196
197
  void InitializeWasm();
198
  MCSection *getStaticCtorSection(unsigned Priority,
199
                                  const MCSymbol *KeySym) const override;
200
  MCSection *getStaticDtorSection(unsigned Priority,
201
                                  const MCSymbol *KeySym) const override;
202
203
  const MCExpr *lowerRelativeReference(const GlobalValue *LHS,
204
                                       const GlobalValue *RHS,
205
                                       const TargetMachine &TM) const override;
206
};
207
208
} // end namespace llvm
209
210
#endif // LLVM_CODEGEN_TARGETLOWERINGOBJECTFILEIMPL_H