• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===- Stub.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 
10 #ifndef MCLD_FRAGMENT_STUB_H
11 #define MCLD_FRAGMENT_STUB_H
12 #ifdef ENABLE_UNITTEST
13 #include <gtest.h>
14 #endif
15 
16 #include <llvm/Support/DataTypes.h>
17 #include <mcld/Fragment/Fragment.h>
18 #include <mcld/Fragment/Relocation.h>
19 #include <vector>
20 #include <string>
21 
22 namespace mcld
23 {
24 
25 class Relocation;
26 class ResolveInfo;
27 
28 class Stub: public Fragment
29 {
30 public:
31   typedef Relocation::DWord DWord;
32   typedef Relocation::SWord SWord;
33   typedef Relocation::Type  Type;
34 
35   class Fixup
36   {
37   public:
Fixup(DWord pOffset,SWord pAddend,Type pType)38     Fixup(DWord pOffset, SWord pAddend, Type pType)
39      : m_Offset(pOffset), m_Addend(pAddend), m_Type(pType)
40     { }
41 
~Fixup()42     ~Fixup()
43     { }
44 
offset()45     DWord offset() const { return m_Offset; }
46 
addend()47     SWord addend() const { return m_Addend; }
48 
type()49     Type  type() const   { return m_Type; }
50 
51   private:
52     DWord m_Offset;
53     SWord m_Addend;
54     Type  m_Type;
55   };
56 
57 public:
58   typedef std::vector<Fixup*> FixupListType;
59   typedef FixupListType::iterator fixup_iterator;
60   typedef FixupListType::const_iterator const_fixup_iterator;
61 
62 public:
63   Stub();
64 
65   virtual ~Stub();
66 
67   /// clone - clone function for stub factory to create the corresponding stub
clone()68   Stub* clone() { return doClone(); }
69 
70   /// isMyDuty - return true when the pReloc is problematic and the stub is able
71   /// to fix it!
72   virtual bool isMyDuty(const class Relocation& pReloc,
73                         uint64_t pSource,
74                         uint64_t pTargetSymValue) const = 0;
75 
76   /// name - name of this stub
77   virtual const std::string& name() const = 0;
78 
79   /// getContent - content of the stub
80   virtual const uint8_t* getContent() const = 0;
81 
82   /// size - size of the stub
83   virtual size_t size() const = 0;
84 
85   /// alignment - alignment of the stub
86   virtual size_t alignment() const = 0;
87 
88   /// symInfo - ResolveInfo of this Stub
symInfo()89   ResolveInfo* symInfo()             { return m_pSymInfo; }
90 
symInfo()91   const ResolveInfo* symInfo() const { return m_pSymInfo; }
92 
93   /// symValue - initial value for stub's symbol
initSymValue()94   virtual uint64_t initSymValue() const  { return 0x0; }
95 
96   ///  -----  Fixup  -----  ///
fixup_begin()97   fixup_iterator       fixup_begin()       { return m_FixupList.begin(); }
98 
fixup_begin()99   const_fixup_iterator fixup_begin() const { return m_FixupList.begin(); }
100 
fixup_end()101   fixup_iterator       fixup_end()         { return m_FixupList.end();   }
102 
fixup_end()103   const_fixup_iterator fixup_end()   const { return m_FixupList.end();   }
104 
105   /// ----- modifiers ----- ///
106   void setSymInfo(ResolveInfo* pSymInfo);
107 
108   // Stub is a kind of Fragment with type of Stub
classof(const Fragment * F)109   static bool classof(const Fragment *F)
110   { return F->getKind() == Fragment::Stub; }
111 
classof(const Stub *)112   static bool classof(const Stub *)
113   { return true; }
114 
115 protected:
116   /// addFixup - add a fixup for this stub to build a relocation
117   void addFixup(DWord pOffset, SWord pAddend, Type pType);
118 
119   /// addFixup - add a fixup from a existing fixup of the prototype
120   void addFixup(const Fixup& pFixup);
121 
122 private:
123   /// doClone - when adding a backend stub, we should implement this function
124   virtual Stub* doClone() = 0;
125 
126 private:
127   ResolveInfo* m_pSymInfo;
128   FixupListType m_FixupList;
129 };
130 
131 } // namespace of mcld
132 
133 #endif
134 
135