PLT.h revision 22add6ff3426df1a85089fe6a6e1597ee3b6f300
15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- PLT.h --------------------------------------------------------------===//
25460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
35460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//                     The MCLinker Project
45460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
55460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// This file is distributed under the University of Illinois Open Source
65460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// License. See LICENSE.TXT for details.
75460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
85460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===//
9cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#ifndef MCLD_PROCEDURE_LINKAGE_TABLE_H
10cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#define MCLD_PROCEDURE_LINKAGE_TABLE_H
115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifdef ENABLE_UNITTEST
125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <gtest.h>
135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif
145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
15cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <mcld/LD/LDSection.h>
1622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/SectionData.h>
1722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Fragment/TargetFragment.h>
18cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
1922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaonamespace mcld {
205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass LDSection;
225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass ResolveInfo;
235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/** \class PLT
2522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao *  \brief Procedure linkage table
265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */
2722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass PLT
285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic:
3022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  typedef SectionData::iterator iterator;
3122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  typedef SectionData::const_iterator const_iterator;
325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  class Entry : public TargetFragment
3422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  {
3522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  public:
3622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    Entry(size_t pSize, SectionData& pParent);
3722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    virtual ~Entry();
385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    size_t getEntrySize() const
4022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    { return m_EntrySize; }
415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    void setContent(unsigned char* pContent)
4322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    { m_pContent = pContent; }
445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    const unsigned char* getContent() const
4622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    { return m_pContent; }
475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    //Used by llvm::cast<>.
4922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    static bool classof(const Fragment *O)
5022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    { return true; }
515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
5222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    size_t size() const
5322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    { return m_EntrySize; }
545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
5522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  protected:
5622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    size_t m_EntrySize;
5722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    unsigned char* m_pContent;
5822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  };
595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
6022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaopublic:
6122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  PLT(LDSection& pSection);
625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
6322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  virtual ~PLT();
645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// reserveEntry - reseve the number of pNum of empty entries
665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// The empty entris are reserved for layout to adjust the fragment offset.
675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  virtual void reserveEntry(size_t pNum = 1) = 0;
685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
6922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // finalizeSectionSize - set LDSection size
7022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  virtual void finalizeSectionSize() = 0;
7122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
7222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  uint64_t addr() const { return m_Section.addr(); }
7322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
7422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const_iterator begin() const { return m_SectionData->begin(); }
7522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  iterator       begin()       { return m_SectionData->begin(); }
7622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const_iterator end  () const { return m_SectionData->end();   }
7722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  iterator       end  ()       { return m_SectionData->end();   }
785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprotected:
805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  LDSection& m_Section;
8122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  SectionData* m_SectionData;
825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao};
835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of mcld
855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif
875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
88