Home | History | Annotate | Download | only in CodeGen
      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 
     20 namespace 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