MachineModuleInfoImpls.h revision 203954
1//===-- llvm/CodeGen/MachineModuleInfoImpls.h -------------------*- 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 defines object-file format specific implementations of
11// MachineModuleInfoImpl.
12//
13//===----------------------------------------------------------------------===//
14
15#ifndef LLVM_CODEGEN_MACHINEMODULEINFOIMPLS_H
16#define LLVM_CODEGEN_MACHINEMODULEINFOIMPLS_H
17
18#include "llvm/CodeGen/MachineModuleInfo.h"
19
20namespace llvm {
21  class MCSymbol;
22
23  /// MachineModuleInfoMachO - This is a MachineModuleInfoImpl implementation
24  /// for MachO targets.
25  class MachineModuleInfoMachO : public MachineModuleInfoImpl {
26    /// FnStubs - Darwin '$stub' stubs.  The key is something like "Lfoo$stub",
27    /// the value is something like "_foo".
28    DenseMap<MCSymbol*, MCSymbol*> FnStubs;
29
30    /// GVStubs - Darwin '$non_lazy_ptr' stubs.  The key is something like
31    /// "Lfoo$non_lazy_ptr", the value is something like "_foo".
32    DenseMap<MCSymbol*, MCSymbol*> GVStubs;
33
34    /// HiddenGVStubs - Darwin '$non_lazy_ptr' stubs.  The key is something like
35    /// "Lfoo$non_lazy_ptr", the value is something like "_foo".  Unlike GVStubs
36    /// these are for things with hidden visibility.
37    DenseMap<MCSymbol*, MCSymbol*> HiddenGVStubs;
38
39    virtual void Anchor();  // Out of line virtual method.
40  public:
41    MachineModuleInfoMachO(const MachineModuleInfo &) {}
42
43    MCSymbol *&getFnStubEntry(MCSymbol *Sym) {
44      assert(Sym && "Key cannot be null");
45      return FnStubs[Sym];
46    }
47
48    MCSymbol *&getGVStubEntry(MCSymbol *Sym) {
49      assert(Sym && "Key cannot be null");
50      return GVStubs[Sym];
51    }
52
53    MCSymbol *&getHiddenGVStubEntry(MCSymbol *Sym) {
54      assert(Sym && "Key cannot be null");
55      return HiddenGVStubs[Sym];
56    }
57
58    /// Accessor methods to return the set of stubs in sorted order.
59    SymbolListTy GetFnStubList() const {
60      return GetSortedStubs(FnStubs);
61    }
62    SymbolListTy GetGVStubList() const {
63      return GetSortedStubs(GVStubs);
64    }
65    SymbolListTy GetHiddenGVStubList() const {
66      return GetSortedStubs(HiddenGVStubs);
67    }
68  };
69
70  /// MachineModuleInfoELF - This is a MachineModuleInfoImpl implementation
71  /// for ELF targets.
72  class MachineModuleInfoELF : public MachineModuleInfoImpl {
73    /// GVStubs - These stubs are used to materialize global addresses in PIC
74    /// mode.
75    DenseMap<MCSymbol*, MCSymbol*> GVStubs;
76
77    virtual void Anchor();  // Out of line virtual method.
78  public:
79    MachineModuleInfoELF(const MachineModuleInfo &) {}
80
81    MCSymbol *&getGVStubEntry(MCSymbol *Sym) {
82      assert(Sym && "Key cannot be null");
83      return GVStubs[Sym];
84    }
85
86    /// Accessor methods to return the set of stubs in sorted order.
87
88    SymbolListTy GetGVStubList() const {
89      return GetSortedStubs(GVStubs);
90    }
91  };
92
93} // end namespace llvm
94
95#endif
96