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//===----------------------------------------------------------------------===//
987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#ifndef MCLD_TARGET_PLT_H
1087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#define MCLD_TARGET_PLT_H
115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
12cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <mcld/LD/LDSection.h>
1322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/SectionData.h>
1422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Fragment/TargetFragment.h>
15cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
1622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaonamespace mcld {
175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass LDSection;
195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass ResolveInfo;
205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
21d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao/** \class PLTEntryDefaultBase
2287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines *  \brief PLTEntryDefaultBase provides the default interface for PLT Entry
23d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao */
24d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaoclass PLTEntryBase : public TargetFragment
25d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao{
26d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaopublic:
27d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  PLTEntryBase(SectionData& pParent)
28d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao    : TargetFragment(Fragment::Target, &pParent), m_pValue(NULL)
29d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  {}
30d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
31d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  virtual ~PLTEntryBase()
32d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  {
3387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    free(m_pValue);
34d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  }
35d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
36d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  void setValue(unsigned char* pValue)
37d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  { m_pValue = pValue; }
38d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
39d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  const unsigned char* getValue() const
40d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  { return m_pValue; }
41d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
42d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  //Used by llvm::cast<>.
43d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  static bool classof(const Fragment *O)
44d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  { return true; }
45d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
46d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaoprotected:
47d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  unsigned char* m_pValue;
48d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao};
49d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
5022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/** \class PLT
5122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao *  \brief Procedure linkage table
525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */
5322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass PLT
545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic:
5622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  typedef SectionData::iterator iterator;
5722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  typedef SectionData::const_iterator const_iterator;
585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
59d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  template<size_t SIZE, typename EntryBase = PLTEntryBase>
60d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  class Entry : public EntryBase
6122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  {
6222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  public:
63d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao    enum { EntrySize = SIZE };
645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
65d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  public:
66d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao    Entry(SectionData& pParent)
67d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao      : EntryBase(pParent)
68d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao    {}
695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
70d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao    virtual ~Entry() {}
715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
7222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    size_t size() const
73d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao    { return EntrySize; }
7422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  };
755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
7622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaopublic:
7722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  PLT(LDSection& pSection);
785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
7922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  virtual ~PLT();
805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
8122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // finalizeSectionSize - set LDSection size
8222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  virtual void finalizeSectionSize() = 0;
8322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
8422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  uint64_t addr() const { return m_Section.addr(); }
8522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
86551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  const_iterator begin() const { return m_pSectionData->begin(); }
87551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  iterator       begin()       { return m_pSectionData->begin(); }
88551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  const_iterator end  () const { return m_pSectionData->end();   }
89551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  iterator       end  ()       { return m_pSectionData->end();   }
905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprotected:
925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  LDSection& m_Section;
93551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  SectionData* m_pSectionData;
945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao};
955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of mcld
975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif
995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
100