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//===----------------------------------------------------------------------===//
937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#ifndef MCLD_TARGET_PLT_H_
1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#define MCLD_TARGET_PLT_H_
115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Fragment/TargetFragment.h"
1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/LDSection.h"
1437b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/SectionData.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 */
2437b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass PLTEntryBase : public TargetFragment {
2537b74a387bb3993387029859c2d9d051c41c724eStephen Hines public:
2637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  explicit PLTEntryBase(SectionData& pParent)
2737b74a387bb3993387029859c2d9d051c41c724eStephen Hines      : TargetFragment(Fragment::Target, &pParent), m_pValue(NULL) {}
28d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
2937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  virtual ~PLTEntryBase() { free(m_pValue); }
30d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
3137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  void setValue(unsigned char* pValue) { m_pValue = pValue; }
32d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
3337b74a387bb3993387029859c2d9d051c41c724eStephen Hines  const unsigned char* getValue() const { return m_pValue; }
34d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
3537b74a387bb3993387029859c2d9d051c41c724eStephen Hines  // Used by llvm::cast<>.
3637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  static bool classof(const Fragment* O) { return true; }
37d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
3837b74a387bb3993387029859c2d9d051c41c724eStephen Hines protected:
39d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  unsigned char* m_pValue;
40d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao};
41d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
4222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/** \class PLT
4322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao *  \brief Procedure linkage table
445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */
4537b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass PLT {
4637b74a387bb3993387029859c2d9d051c41c724eStephen Hines public:
4722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  typedef SectionData::iterator iterator;
4822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  typedef SectionData::const_iterator const_iterator;
495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
5037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  template <size_t SIZE, typename EntryBase = PLTEntryBase>
5137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  class Entry : public EntryBase {
5237b74a387bb3993387029859c2d9d051c41c724eStephen Hines   public:
53d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao    enum { EntrySize = SIZE };
545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
5537b74a387bb3993387029859c2d9d051c41c724eStephen Hines   public:
5637b74a387bb3993387029859c2d9d051c41c724eStephen Hines    explicit Entry(SectionData& pParent) : EntryBase(pParent) {}
575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
58d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao    virtual ~Entry() {}
595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
6037b74a387bb3993387029859c2d9d051c41c724eStephen Hines    size_t size() const { return EntrySize; }
6122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  };
625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
6337b74a387bb3993387029859c2d9d051c41c724eStephen Hines public:
6437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  explicit PLT(LDSection& pSection);
655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
6622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  virtual ~PLT();
675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
6822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // finalizeSectionSize - set LDSection size
6922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  virtual void finalizeSectionSize() = 0;
7022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
7122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  uint64_t addr() const { return m_Section.addr(); }
7222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
73551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  const_iterator begin() const { return m_pSectionData->begin(); }
7437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  iterator begin() { return m_pSectionData->begin(); }
7537b74a387bb3993387029859c2d9d051c41c724eStephen Hines  const_iterator end() const { return m_pSectionData->end(); }
7637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  iterator end() { return m_pSectionData->end(); }
775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
7837b74a387bb3993387029859c2d9d051c41c724eStephen Hines protected:
795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  LDSection& m_Section;
80551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  SectionData* m_pSectionData;
815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao};
825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
8337b74a387bb3993387029859c2d9d051c41c724eStephen Hines}  // namespace mcld
845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
8537b74a387bb3993387029859c2d9d051c41c724eStephen Hines#endif  // MCLD_TARGET_PLT_H_
86