Home | History | Annotate | Download | only in LD
      1 //===- StubFactory.h ------------------------------------------------------===//
      2 //
      3 //                     The MCLinker Project
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 #ifndef MCLD_LD_STUBFACTORY_H_
     10 #define MCLD_LD_STUBFACTORY_H_
     11 
     12 #include <llvm/Support/DataTypes.h>
     13 
     14 #include <vector>
     15 
     16 namespace mcld {
     17 
     18 class BranchIslandFactory;
     19 class IRBuilder;
     20 class FragmentRef;
     21 class Relocation;
     22 class Stub;
     23 
     24 /** \class StubFactory
     25  *  \brief the clone factory of Stub
     26  *
     27  */
     28 class StubFactory {
     29  public:
     30   ~StubFactory();
     31 
     32   /// addPrototype - register a stub prototype
     33   void addPrototype(Stub* pPrototype);
     34 
     35   /// create - create a stub if needed, otherwise return NULL
     36   Stub* create(Relocation& pReloc,
     37                uint64_t pTargetSymValue,
     38                IRBuilder& pBuilder,
     39                BranchIslandFactory& pBRIslandFactory);
     40 
     41   Stub* create(FragmentRef& pFragRef,
     42                IRBuilder& pBuilder,
     43                BranchIslandFactory& pBRIslandFactory);
     44 
     45  private:
     46   /// findPrototype - find if there is a registered stub prototype for the given
     47   ///                 relocation
     48   Stub* findPrototype(const Relocation& pReloc,
     49                       const uint64_t pSource,
     50                       uint64_t pTargetSymValue) const;
     51 
     52   Stub* findPrototype(const FragmentRef& pFragRef) const;
     53 
     54  private:
     55   typedef std::vector<Stub*> StubPoolType;
     56 
     57  private:
     58   StubPoolType m_StubPool;  // stub pool
     59 };
     60 
     61 }  // namespace mcld
     62 
     63 #endif  // MCLD_LD_STUBFACTORY_H_
     64