PLT.h revision 5460a1f25d9ddecb5c70667267d66d51af177a99
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//===----------------------------------------------------------------------===//
95460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifndef PROCEDURE_LINKAGE_TABLE_H
105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#define PROCEDURE_LINKAGE_TABLE_H
115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifdef ENABLE_UNITTEST
125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <gtest.h>
135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif
145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/LDSection.h>
165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/MC/MCTargetFragment.h>
175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/ADT/ilist.h>
185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace mcld
205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass ResolveInfo;
235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/** \class PLTEntry
255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */
265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass PLTEntry : public MCTargetFragment
275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic:
295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  PLTEntry(size_t pSize, llvm::MCSectionData* pParent);
305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  virtual ~PLTEntry();
315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size_t getEntrySize() const
335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { return m_EntrySize; }
345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  void setContent(unsigned char* pContent)
365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { m_pContent = pContent; }
375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  const unsigned char* getContent() const
395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { return m_pContent; }
405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  //Used by llvm::cast<>.
425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  static bool classof(const MCFragment *O)
435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { return true; }
445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size_t getSize() const
465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { return m_EntrySize; }
475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprotected:
495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size_t m_EntrySize;
505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  unsigned char* m_pContent;
515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao};
525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/** \class PLT
545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *  \brief Procedure linkage table
555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */
565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass PLT
575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic:
595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  PLT(LDSection& pSection, llvm::MCSectionData& pSectionData);
605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  virtual ~PLT();
615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  const LDSection& getSection() const
635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { return m_Section; }
645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  const llvm::MCSectionData& getSectionData() const
665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { return m_SectionData; }
675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic:
695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// reserveEntry - reseve the number of pNum of empty entries
705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// The empty entris are reserved for layout to adjust the fragment offset.
715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  virtual void reserveEntry(size_t pNum = 1) = 0;
725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// getPLTEntry - get an empty entry or an exitsted filled entry with pSymbol.
745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// @param pSymbol - the target symbol
755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// @param pExist - ture if the a filled entry with pSymbol existed, otherwise false.
765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  virtual PLTEntry* getPLTEntry(const ResolveInfo& pSymbol, bool& pExist) = 0;
775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprotected:
795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  LDSection& m_Section;
805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  llvm::MCSectionData& m_SectionData;
815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao};
825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of mcld
845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif
865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
87