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*, StubValueTy> 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". The extra bit
32    /// is true if this GV is external.
33    DenseMap<MCSymbol*, StubValueTy> GVStubs;
34
35    /// HiddenGVStubs - Darwin '$non_lazy_ptr' stubs.  The key is something like
36    /// "Lfoo$non_lazy_ptr", the value is something like "_foo".  Unlike GVStubs
37    /// these are for things with hidden visibility. The extra bit is true if
38    /// this GV is external.
39    DenseMap<MCSymbol*, StubValueTy> HiddenGVStubs;
40
41    virtual void anchor();  // Out of line virtual method.
42  public:
43    MachineModuleInfoMachO(const MachineModuleInfo &) {}
44
45    StubValueTy &getFnStubEntry(MCSymbol *Sym) {
46      assert(Sym && "Key cannot be null");
47      return FnStubs[Sym];
48    }
49
50    StubValueTy &getGVStubEntry(MCSymbol *Sym) {
51      assert(Sym && "Key cannot be null");
52      return GVStubs[Sym];
53    }
54
55    StubValueTy &getHiddenGVStubEntry(MCSymbol *Sym) {
56      assert(Sym && "Key cannot be null");
57      return HiddenGVStubs[Sym];
58    }
59
60    /// Accessor methods to return the set of stubs in sorted order.
61    SymbolListTy GetFnStubList() const {
62      return GetSortedStubs(FnStubs);
63    }
64    SymbolListTy GetGVStubList() const {
65      return GetSortedStubs(GVStubs);
66    }
67    SymbolListTy GetHiddenGVStubList() const {
68      return GetSortedStubs(HiddenGVStubs);
69    }
70  };
71
72  /// MachineModuleInfoELF - This is a MachineModuleInfoImpl implementation
73  /// for ELF targets.
74  class MachineModuleInfoELF : public MachineModuleInfoImpl {
75    /// GVStubs - These stubs are used to materialize global addresses in PIC
76    /// mode.
77    DenseMap<MCSymbol*, StubValueTy> GVStubs;
78
79    virtual void anchor();  // Out of line virtual method.
80  public:
81    MachineModuleInfoELF(const MachineModuleInfo &) {}
82
83    StubValueTy &getGVStubEntry(MCSymbol *Sym) {
84      assert(Sym && "Key cannot be null");
85      return GVStubs[Sym];
86    }
87
88    /// Accessor methods to return the set of stubs in sorted order.
89
90    SymbolListTy GetGVStubList() const {
91      return GetSortedStubs(GVStubs);
92    }
93  };
94
95} // end namespace llvm
96
97#endif
98