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
16namespace mcld {
17
18class BranchIslandFactory;
19class IRBuilder;
20class FragmentRef;
21class Relocation;
22class Stub;
23
24/** \class StubFactory
25 *  \brief the clone factory of Stub
26 *
27 */
28class 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