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