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