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