MachineModuleInfoImpls.h revision 203954
1198090Srdivacky//===-- llvm/CodeGen/MachineModuleInfoImpls.h -------------------*- C++ -*-===//
2198090Srdivacky//
3198090Srdivacky//                     The LLVM Compiler Infrastructure
4198090Srdivacky//
5198090Srdivacky// This file is distributed under the University of Illinois Open Source
6198090Srdivacky// License. See LICENSE.TXT for details.
7198090Srdivacky//
8198090Srdivacky//===----------------------------------------------------------------------===//
9198090Srdivacky//
10198090Srdivacky// This file defines object-file format specific implementations of
11198090Srdivacky// MachineModuleInfoImpl.
12198090Srdivacky//
13198090Srdivacky//===----------------------------------------------------------------------===//
14198090Srdivacky
15198090Srdivacky#ifndef LLVM_CODEGEN_MACHINEMODULEINFOIMPLS_H
16198090Srdivacky#define LLVM_CODEGEN_MACHINEMODULEINFOIMPLS_H
17198090Srdivacky
18198090Srdivacky#include "llvm/CodeGen/MachineModuleInfo.h"
19198090Srdivacky
20198090Srdivackynamespace llvm {
21198090Srdivacky  class MCSymbol;
22203954Srdivacky
23198090Srdivacky  /// MachineModuleInfoMachO - This is a MachineModuleInfoImpl implementation
24198090Srdivacky  /// for MachO targets.
25198090Srdivacky  class MachineModuleInfoMachO : public MachineModuleInfoImpl {
26198090Srdivacky    /// FnStubs - Darwin '$stub' stubs.  The key is something like "Lfoo$stub",
27198090Srdivacky    /// the value is something like "_foo".
28203954Srdivacky    DenseMap<MCSymbol*, MCSymbol*> FnStubs;
29198090Srdivacky
30198090Srdivacky    /// GVStubs - Darwin '$non_lazy_ptr' stubs.  The key is something like
31198090Srdivacky    /// "Lfoo$non_lazy_ptr", the value is something like "_foo".
32203954Srdivacky    DenseMap<MCSymbol*, MCSymbol*> GVStubs;
33198090Srdivacky
34198090Srdivacky    /// HiddenGVStubs - Darwin '$non_lazy_ptr' stubs.  The key is something like
35198090Srdivacky    /// "Lfoo$non_lazy_ptr", the value is something like "_foo".  Unlike GVStubs
36198090Srdivacky    /// these are for things with hidden visibility.
37203954Srdivacky    DenseMap<MCSymbol*, MCSymbol*> HiddenGVStubs;
38198090Srdivacky
39198090Srdivacky    virtual void Anchor();  // Out of line virtual method.
40198090Srdivacky  public:
41198090Srdivacky    MachineModuleInfoMachO(const MachineModuleInfo &) {}
42198090Srdivacky
43203954Srdivacky    MCSymbol *&getFnStubEntry(MCSymbol *Sym) {
44198090Srdivacky      assert(Sym && "Key cannot be null");
45198090Srdivacky      return FnStubs[Sym];
46198090Srdivacky    }
47198090Srdivacky
48203954Srdivacky    MCSymbol *&getGVStubEntry(MCSymbol *Sym) {
49198090Srdivacky      assert(Sym && "Key cannot be null");
50198090Srdivacky      return GVStubs[Sym];
51198090Srdivacky    }
52198090Srdivacky
53203954Srdivacky    MCSymbol *&getHiddenGVStubEntry(MCSymbol *Sym) {
54198090Srdivacky      assert(Sym && "Key cannot be null");
55198090Srdivacky      return HiddenGVStubs[Sym];
56198090Srdivacky    }
57203954Srdivacky
58198090Srdivacky    /// Accessor methods to return the set of stubs in sorted order.
59198090Srdivacky    SymbolListTy GetFnStubList() const {
60198090Srdivacky      return GetSortedStubs(FnStubs);
61198090Srdivacky    }
62198090Srdivacky    SymbolListTy GetGVStubList() const {
63198090Srdivacky      return GetSortedStubs(GVStubs);
64198090Srdivacky    }
65198090Srdivacky    SymbolListTy GetHiddenGVStubList() const {
66198090Srdivacky      return GetSortedStubs(HiddenGVStubs);
67198090Srdivacky    }
68198090Srdivacky  };
69203954Srdivacky
70203954Srdivacky  /// MachineModuleInfoELF - This is a MachineModuleInfoImpl implementation
71203954Srdivacky  /// for ELF targets.
72203954Srdivacky  class MachineModuleInfoELF : public MachineModuleInfoImpl {
73203954Srdivacky    /// GVStubs - These stubs are used to materialize global addresses in PIC
74203954Srdivacky    /// mode.
75203954Srdivacky    DenseMap<MCSymbol*, MCSymbol*> GVStubs;
76203954Srdivacky
77203954Srdivacky    virtual void Anchor();  // Out of line virtual method.
78203954Srdivacky  public:
79203954Srdivacky    MachineModuleInfoELF(const MachineModuleInfo &) {}
80203954Srdivacky
81203954Srdivacky    MCSymbol *&getGVStubEntry(MCSymbol *Sym) {
82203954Srdivacky      assert(Sym && "Key cannot be null");
83203954Srdivacky      return GVStubs[Sym];
84203954Srdivacky    }
85203954Srdivacky
86203954Srdivacky    /// Accessor methods to return the set of stubs in sorted order.
87203954Srdivacky
88203954Srdivacky    SymbolListTy GetGVStubList() const {
89203954Srdivacky      return GetSortedStubs(GVStubs);
90203954Srdivacky    }
91203954Srdivacky  };
92203954Srdivacky
93198090Srdivacky} // end namespace llvm
94198090Srdivacky
95198090Srdivacky#endif
96