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