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