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() { return getSortedStubs(FnStubs); }
     62   SymbolListTy GetGVStubList() { return getSortedStubs(GVStubs); }
     63   SymbolListTy GetHiddenGVStubList() { return getSortedStubs(HiddenGVStubs); }
     64 };
     65 
     66 /// MachineModuleInfoELF - This is a MachineModuleInfoImpl implementation
     67 /// for ELF targets.
     68 class MachineModuleInfoELF : public MachineModuleInfoImpl {
     69   /// GVStubs - These stubs are used to materialize global addresses in PIC
     70   /// mode.
     71   DenseMap<MCSymbol *, StubValueTy> GVStubs;
     72 
     73   virtual void anchor(); // Out of line virtual method.
     74 public:
     75   MachineModuleInfoELF(const MachineModuleInfo &) {}
     76 
     77   StubValueTy &getGVStubEntry(MCSymbol *Sym) {
     78     assert(Sym && "Key cannot be null");
     79     return GVStubs[Sym];
     80   }
     81 
     82   /// Accessor methods to return the set of stubs in sorted order.
     83 
     84   SymbolListTy GetGVStubList() { return getSortedStubs(GVStubs); }
     85 };
     86 
     87 } // end namespace llvm
     88 
     89 #endif
     90