122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===- Stub.h -------------------------------------------------------------===// 222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// 322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// The MCLinker Project 422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// 522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// This file is distributed under the University of Illinois Open Source 622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// License. See LICENSE.TXT for details. 722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// 822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 1022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#ifndef MCLD_FRAGMENT_STUB_H 1122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#define MCLD_FRAGMENT_STUB_H 1222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 1322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <llvm/Support/DataTypes.h> 1422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Fragment/Fragment.h> 1522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Fragment/Relocation.h> 1622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <vector> 1722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <string> 1822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 1922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaonamespace mcld 2022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 2122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 2222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass Relocation; 2322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass ResolveInfo; 2422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 2522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass Stub: public Fragment 2622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 2722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaopublic: 2822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao typedef Relocation::DWord DWord; 2922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao typedef Relocation::SWord SWord; 3022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao typedef Relocation::Type Type; 3122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 3222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao class Fixup 3322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao { 3422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao public: 3522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao Fixup(DWord pOffset, SWord pAddend, Type pType) 3622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao : m_Offset(pOffset), m_Addend(pAddend), m_Type(pType) 3722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao { } 3822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 3922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao ~Fixup() 4022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao { } 4122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 4222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao DWord offset() const { return m_Offset; } 4322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 4422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao SWord addend() const { return m_Addend; } 4522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 4622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao Type type() const { return m_Type; } 4722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 4822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao private: 4922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao DWord m_Offset; 5022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao SWord m_Addend; 5122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao Type m_Type; 5222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao }; 5322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 5422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaopublic: 5522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao typedef std::vector<Fixup*> FixupListType; 5622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao typedef FixupListType::iterator fixup_iterator; 5722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao typedef FixupListType::const_iterator const_fixup_iterator; 5822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 5922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaopublic: 6022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao Stub(); 6122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 6222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao virtual ~Stub(); 6322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 6422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// clone - clone function for stub factory to create the corresponding stub 6522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao Stub* clone() { return doClone(); } 6622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 6722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// isMyDuty - return true when the pReloc is problematic and the stub is able 6822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// to fix it! 6922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao virtual bool isMyDuty(const class Relocation& pReloc, 7022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao uint64_t pSource, 7122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao uint64_t pTargetSymValue) const = 0; 7222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 7322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// name - name of this stub 7422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao virtual const std::string& name() const = 0; 7522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 7622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// getContent - content of the stub 7722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao virtual const uint8_t* getContent() const = 0; 7822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 7922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// size - size of the stub 8022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao virtual size_t size() const = 0; 8122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 8222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// alignment - alignment of the stub 8322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao virtual size_t alignment() const = 0; 8422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 8522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// symInfo - ResolveInfo of this Stub 8622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao ResolveInfo* symInfo() { return m_pSymInfo; } 8722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 8822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const ResolveInfo* symInfo() const { return m_pSymInfo; } 8922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 9022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// symValue - initial value for stub's symbol 9122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao virtual uint64_t initSymValue() const { return 0x0; } 9222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 9322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// ----- Fixup ----- /// 9422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao fixup_iterator fixup_begin() { return m_FixupList.begin(); } 9522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 9622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const_fixup_iterator fixup_begin() const { return m_FixupList.begin(); } 9722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 9822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao fixup_iterator fixup_end() { return m_FixupList.end(); } 9922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 10022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const_fixup_iterator fixup_end() const { return m_FixupList.end(); } 10122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 10222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// ----- modifiers ----- /// 10322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao void setSymInfo(ResolveInfo* pSymInfo); 10422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 10522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // Stub is a kind of Fragment with type of Stub 10622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao static bool classof(const Fragment *F) 10722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao { return F->getKind() == Fragment::Stub; } 10822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 10922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao static bool classof(const Stub *) 11022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao { return true; } 11122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 11222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoprotected: 11322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// addFixup - add a fixup for this stub to build a relocation 11422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao void addFixup(DWord pOffset, SWord pAddend, Type pType); 11522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 11622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// addFixup - add a fixup from a existing fixup of the prototype 11722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao void addFixup(const Fixup& pFixup); 11822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 11922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoprivate: 12022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// doClone - when adding a backend stub, we should implement this function 12122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao virtual Stub* doClone() = 0; 12222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 12322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoprivate: 12422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao ResolveInfo* m_pSymInfo; 12522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao FixupListType m_FixupList; 12622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}; 12722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 12822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} // namespace of mcld 12922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 13022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#endif 13122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 132