15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- GOT.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_GLOBAL_OFFSET_TABLE_H
10cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#define MCLD_GLOBAL_OFFSET_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>
16cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <mcld/LD/TargetFragment.h>
175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace mcld
195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass GOT;
225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass ResolveInfo;
23cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoclass SectionData;
245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/** \class GOTEntry
265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *  \brief The entry of Global Offset Table
275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */
28cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoclass GOTEntry : public TargetFragment
295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic:
315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  explicit GOTEntry(uint64_t pContent, size_t pEntrySize,
32cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao                    SectionData* pParent);
335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  virtual ~GOTEntry();
355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  uint64_t& getContent()
375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { return f_Content; }
385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  uint64_t getContent() const
405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { return f_Content; }
415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  void setContent(uint64_t pValue)
435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { f_Content = pValue; }
445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
45cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  static bool classof(const Fragment *pFrag)
46cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  { return pFrag->getKind() == Fragment::Target; }
475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  static bool classof(const GOTEntry* pFrag)
495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { return true; }
505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // Override pure virtual function
525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size_t getSize() const
535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { return m_EntrySize; }
545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprotected:
565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  uint64_t f_Content;
575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size_t m_EntrySize;
585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao};
595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/** \class GOT
615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *  \brief The Global Offset Table
625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */
635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass GOT
645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprotected:
66cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  GOT(LDSection& pSection, SectionData& pSectionData, size_t pEntrySize);
675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic:
695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  virtual ~GOT();
705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// entrySize - the number of bytes per entry
725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size_t getEntrySize() const;
735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  const LDSection& getSection() const
755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { return m_Section; }
765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
77cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  SectionData& getSectionData()
785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { return m_SectionData; }
795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
80cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  const SectionData& getSectionData() const
815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { return m_SectionData; }
825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic:
845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// reserveEntry - reseve number of pNum of empty entries
855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// Before layout, we scan all relocations to determine if GOT entries are
865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// needed. If an entry is needed, the empty entry is reserved for layout
875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// to adjust the fragment offset. After that, we fill up the entries when
885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// applying relocations.
895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  virtual void reserveEntry(size_t pNum = 1) = 0;
905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// getEntry - get an empty entry or an exitsted filled entry with pSymbol.
925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// @param pSymbol - the target symbol
935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// @param pExist - ture if a filled entry with pSymbol existed, otherwise false.
945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  virtual GOTEntry* getEntry(const ResolveInfo& pSymbol, bool& pExist) = 0;
955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprotected:
975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  LDSection& m_Section;
98cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  SectionData& m_SectionData;
995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size_t f_EntrySize;
1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao};
1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of mcld
1035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif
1055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
106