• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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/Support/GCFactory.h>
15 #include <mcld/LD/Relocation.h>
16 
17 namespace mcld
18 {
19 
20 class LDSymbol;
21 class ResolveInfo;
22 class FragmentRef;
23 class Layout;
24 class GOT;
25 class TargetLDBackend;
26 class MCLDInfo;
27 
28 /** \class RelocationFactory
29  *  \brief RelocationFactory provides the interface for generating target
30  *  relocation
31  *
32  */
33 class RelocationFactory : public GCFactory<Relocation, 0>
34 {
35 public:
36   typedef Relocation::Type Type;
37   typedef Relocation::Address Address;
38   typedef Relocation::DWord DWord;
39 
40   enum Result {
41     OK,
42     BadReloc,
43     Overflow,
44     Unsupport,
45     Unknown
46   };
47 
48 public:
49   explicit RelocationFactory(size_t pNum);
50 
51   virtual ~RelocationFactory();
52 
53   /// apply - general apply function
54   virtual Result applyRelocation(Relocation& pRelocation,
55                                  const MCLDInfo& pLDInfo) = 0;
56 
57   // ----- production ----- //
58   /// produce - produce a relocation entry
59   /// @param pType - the type of the relocation entry
60   /// @param pFragRef - the place to apply the relocation
61   /// @param pAddend - the addend of the relocation entry
62   Relocation* produce(Type pType,
63                       FragmentRef& pFragRef,
64                       Address pAddend = 0);
65 
66   /// produceEmptyEntry - produce an empty relocation which
67   /// occupied memory space but all contents set to zero.
68   Relocation* produceEmptyEntry();
69 
70   void destroy(Relocation* pRelocation);
71 
72   void setLayout(const Layout& pLayout);
73 
74   // ------ observers -----//
75   const Layout& getLayout() const;
76 
77   virtual TargetLDBackend& getTarget() = 0;
78 
79   virtual const TargetLDBackend& getTarget() const = 0;
80 
81   virtual const char* getName(Type pType) const = 0;
82 
83 private:
84   const Layout* m_pLayout;
85 
86 };
87 
88 } // namespace of mcld
89 
90 #endif
91 
92