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