PLT.h revision 551ae4ebd3e9d137ea668fb83ae4a55b8cfba451
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#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
24d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao/** \class PLTEntryDefaultBase
2587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines *  \brief PLTEntryDefaultBase provides the default interface for PLT Entry
26d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao */
27d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaoclass PLTEntryBase : public TargetFragment
28d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao{
29d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaopublic:
30d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  PLTEntryBase(SectionData& pParent)
31d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao    : TargetFragment(Fragment::Target, &pParent), m_pValue(NULL)
32d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  {}
33d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
34d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  virtual ~PLTEntryBase()
35d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  {
3687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    free(m_pValue);
37d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  }
38d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
39d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  void setValue(unsigned char* pValue)
40d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  { m_pValue = pValue; }
41d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
42d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  const unsigned char* getValue() const
43d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  { return m_pValue; }
44d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
45d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  //Used by llvm::cast<>.
46d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  static bool classof(const Fragment *O)
47d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  { return true; }
48d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
49d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaoprotected:
50d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  unsigned char* m_pValue;
51d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao};
52d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
5322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/** \class PLT
5422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao *  \brief Procedure linkage table
555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */
5622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass PLT
575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic:
5922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  typedef SectionData::iterator iterator;
6022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  typedef SectionData::const_iterator const_iterator;
615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
62d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  template<size_t SIZE, typename EntryBase = PLTEntryBase>
63d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  class Entry : public EntryBase
6422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  {
6522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  public:
66d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao    enum { EntrySize = SIZE };
675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
68d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  public:
69d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao    Entry(SectionData& pParent)
70d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao      : EntryBase(pParent)
71d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao    {}
725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
73d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao    virtual ~Entry() {}
745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
7522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    size_t size() const
76d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao    { return EntrySize; }
7722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  };
785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
7922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaopublic:
8022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  PLT(LDSection& pSection);
815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
8222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  virtual ~PLT();
835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
8422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // finalizeSectionSize - set LDSection size
8522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  virtual void finalizeSectionSize() = 0;
8622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
8722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  uint64_t addr() const { return m_Section.addr(); }
8822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
89551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  const_iterator begin() const { return m_pSectionData->begin(); }
90551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  iterator       begin()       { return m_pSectionData->begin(); }
91551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  const_iterator end  () const { return m_pSectionData->end();   }
92551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  iterator       end  ()       { return m_pSectionData->end();   }
935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprotected:
955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  LDSection& m_Section;
96551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  SectionData* m_pSectionData;
975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao};
985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of mcld
1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif
1025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
103