RelocationFactory.h revision d0fbbb227051be16931a1aa9b4a7722ac039c698
1//===- Relocation.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_RELOCATION_FACTORY_H
10#define MCLD_LD_RELOCATION_FACTORY_H
11#ifdef ENABLE_UNITTEST
12#include <gtest.h>
13#endif
14#include <mcld/Config/Config.h>
15#include <mcld/Support/GCFactory.h>
16#include <mcld/Fragment/Relocation.h>
17
18namespace mcld {
19
20class FragmentRef;
21class LinkerConfig;
22
23/** \class RelocationFactory
24 *  \brief RelocationFactory provides the interface for generating target
25 *  relocation
26 *
27 */
28class RelocationFactory : public GCFactory<Relocation, MCLD_RELOCATIONS_PER_INPUT>
29{
30public:
31  typedef Relocation::Type Type;
32  typedef Relocation::Address Address;
33  typedef Relocation::DWord DWord;
34  typedef Relocation::SWord SWord;
35
36public:
37  explicit RelocationFactory();
38
39  void setConfig(const LinkerConfig& pConfig);
40
41  // ----- production ----- //
42  /// produce - produce a relocation entry
43  /// @param pType - the type of the relocation entry
44  /// @param pFragRef - the place to apply the relocation
45  /// @param pAddend - the addend of the relocation entry
46  Relocation* produce(Type pType,
47                      FragmentRef& pFragRef,
48                      Address pAddend = 0);
49
50  /// produceEmptyEntry - produce an empty relocation which
51  /// occupied memory space but all contents set to zero.
52  Relocation* produceEmptyEntry();
53
54  void destroy(Relocation* pRelocation);
55
56private:
57  const LinkerConfig* m_pConfig;
58};
59
60} // namespace of mcld
61
62#endif
63
64