1203954Srdivacky//==-- llvm/CodeGen/TargetLoweringObjectFileImpl.h - Object Info -*- C++ -*-==//
2203954Srdivacky//
3203954Srdivacky//                     The LLVM Compiler Infrastructure
4203954Srdivacky//
5203954Srdivacky// This file is distributed under the University of Illinois Open Source
6203954Srdivacky// License. See LICENSE.TXT for details.
7203954Srdivacky//
8203954Srdivacky//===----------------------------------------------------------------------===//
9203954Srdivacky//
10203954Srdivacky// This file implements classes used to handle lowerings specific to common
11203954Srdivacky// object file formats.
12203954Srdivacky//
13203954Srdivacky//===----------------------------------------------------------------------===//
14203954Srdivacky
15203954Srdivacky#ifndef LLVM_CODEGEN_TARGETLOWERINGOBJECTFILEIMPL_H
16203954Srdivacky#define LLVM_CODEGEN_TARGETLOWERINGOBJECTFILEIMPL_H
17203954Srdivacky
18249423Sdim#include "llvm/ADT/StringRef.h"
19203954Srdivacky#include "llvm/MC/SectionKind.h"
20203954Srdivacky#include "llvm/Target/TargetLoweringObjectFile.h"
21203954Srdivacky
22203954Srdivackynamespace llvm {
23203954Srdivacky  class MachineModuleInfo;
24203954Srdivacky  class Mangler;
25203954Srdivacky  class MCAsmInfo;
26203954Srdivacky  class MCExpr;
27203954Srdivacky  class MCSection;
28203954Srdivacky  class MCSectionMachO;
29203954Srdivacky  class MCSymbol;
30203954Srdivacky  class MCContext;
31203954Srdivacky  class GlobalValue;
32203954Srdivacky  class TargetMachine;
33203954Srdivacky
34203954Srdivacky
35203954Srdivackyclass TargetLoweringObjectFileELF : public TargetLoweringObjectFile {
36239462Sdim  bool UseInitArray;
37239462Sdim
38203954Srdivackypublic:
39226633Sdim  virtual ~TargetLoweringObjectFileELF() {}
40203954Srdivacky
41221345Sdim  virtual void emitPersonalityValue(MCStreamer &Streamer,
42221345Sdim                                    const TargetMachine &TM,
43221345Sdim                                    const MCSymbol *Sym) const;
44221345Sdim
45203954Srdivacky  /// getSectionForConstant - Given a constant with the SectionKind, return a
46203954Srdivacky  /// section that it should be placed in.
47203954Srdivacky  virtual const MCSection *getSectionForConstant(SectionKind Kind) const;
48203954Srdivacky
49203954Srdivacky
50203954Srdivacky  virtual const MCSection *
51203954Srdivacky  getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
52203954Srdivacky                           Mangler *Mang, const TargetMachine &TM) const;
53203954Srdivacky
54203954Srdivacky  virtual const MCSection *
55203954Srdivacky  SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
56203954Srdivacky                         Mangler *Mang, const TargetMachine &TM) const;
57203954Srdivacky
58249423Sdim  /// getTTypeGlobalReference - Return an MCExpr to use for a reference to the
59249423Sdim  /// specified type info global variable from exception handling information.
60203954Srdivacky  virtual const MCExpr *
61249423Sdim  getTTypeGlobalReference(const GlobalValue *GV, Mangler *Mang,
62249423Sdim                          MachineModuleInfo *MMI, unsigned Encoding,
63249423Sdim                          MCStreamer &Streamer) const;
64221345Sdim
65221345Sdim  // getCFIPersonalitySymbol - The symbol that gets passed to .cfi_personality.
66221345Sdim  virtual MCSymbol *
67221345Sdim  getCFIPersonalitySymbol(const GlobalValue *GV, Mangler *Mang,
68221345Sdim                          MachineModuleInfo *MMI) const;
69234353Sdim
70239462Sdim  void InitializeELF(bool UseInitArray_);
71234353Sdim  virtual const MCSection *
72234353Sdim  getStaticCtorSection(unsigned Priority = 65535) const;
73234353Sdim  virtual const MCSection *
74234353Sdim  getStaticDtorSection(unsigned Priority = 65535) const;
75203954Srdivacky};
76203954Srdivacky
77203954Srdivacky
78203954Srdivacky
79203954Srdivackyclass TargetLoweringObjectFileMachO : public TargetLoweringObjectFile {
80203954Srdivackypublic:
81226633Sdim  virtual ~TargetLoweringObjectFileMachO() {}
82203954Srdivacky
83234353Sdim  /// emitModuleFlags - Emit the module flags that specify the garbage
84234353Sdim  /// collection information.
85234353Sdim  virtual void emitModuleFlags(MCStreamer &Streamer,
86234353Sdim                               ArrayRef<Module::ModuleFlagEntry> ModuleFlags,
87234353Sdim                               Mangler *Mang, const TargetMachine &TM) const;
88234353Sdim
89203954Srdivacky  virtual const MCSection *
90203954Srdivacky  SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
91203954Srdivacky                         Mangler *Mang, const TargetMachine &TM) const;
92203954Srdivacky
93203954Srdivacky  virtual const MCSection *
94203954Srdivacky  getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
95203954Srdivacky                           Mangler *Mang, const TargetMachine &TM) const;
96203954Srdivacky
97203954Srdivacky  virtual const MCSection *getSectionForConstant(SectionKind Kind) const;
98203954Srdivacky
99203954Srdivacky  /// shouldEmitUsedDirectiveFor - This hook allows targets to selectively
100203954Srdivacky  /// decide not to emit the UsedDirective for some symbols in llvm.used.
101203954Srdivacky  /// FIXME: REMOVE this (rdar://7071300)
102203954Srdivacky  virtual bool shouldEmitUsedDirectiveFor(const GlobalValue *GV,
103203954Srdivacky                                          Mangler *) const;
104203954Srdivacky
105249423Sdim  /// getTTypeGlobalReference - The mach-o version of this method
106203954Srdivacky  /// defaults to returning a stub reference.
107203954Srdivacky  virtual const MCExpr *
108249423Sdim  getTTypeGlobalReference(const GlobalValue *GV, Mangler *Mang,
109249423Sdim                          MachineModuleInfo *MMI, unsigned Encoding,
110249423Sdim                          MCStreamer &Streamer) const;
111204642Srdivacky
112221345Sdim  // getCFIPersonalitySymbol - The symbol that gets passed to .cfi_personality.
113221345Sdim  virtual MCSymbol *
114221345Sdim  getCFIPersonalitySymbol(const GlobalValue *GV, Mangler *Mang,
115221345Sdim                          MachineModuleInfo *MMI) const;
116203954Srdivacky};
117203954Srdivacky
118203954Srdivacky
119203954Srdivacky
120203954Srdivackyclass TargetLoweringObjectFileCOFF : public TargetLoweringObjectFile {
121203954Srdivackypublic:
122226633Sdim  virtual ~TargetLoweringObjectFileCOFF() {}
123203954Srdivacky
124203954Srdivacky  virtual const MCSection *
125203954Srdivacky  getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
126203954Srdivacky                           Mangler *Mang, const TargetMachine &TM) const;
127203954Srdivacky
128203954Srdivacky  virtual const MCSection *
129203954Srdivacky  SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
130203954Srdivacky                         Mangler *Mang, const TargetMachine &TM) const;
131251662Sdim
132251662Sdim  /// emitModuleFlags - Emit Obj-C garbage collection and linker options.  Only
133251662Sdim  /// linker option emission is implemented for COFF.
134251662Sdim  virtual void emitModuleFlags(MCStreamer &Streamer,
135251662Sdim                               ArrayRef<Module::ModuleFlagEntry> ModuleFlags,
136251662Sdim                               Mangler *Mang, const TargetMachine &TM) const;
137203954Srdivacky};
138203954Srdivacky
139203954Srdivacky} // end namespace llvm
140203954Srdivacky
141203954Srdivacky#endif
142