15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- MipsGOT.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_MIPS_GOT_H
105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#define MCLD_MIPS_GOT_H
115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifdef ENABLE_UNITTEST
125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <gtest.h>
135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif
145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
15cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <llvm/ADT/DenseMap.h>
16cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/Target/GOT.h>
18cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <mcld/LD/SectionData.h>
195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace mcld
215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass LDSection;
235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass MemoryRegion;
245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/** \class MipsGOT
265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *  \brief Mips Global Offset Table.
275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */
285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass MipsGOT : public GOT
295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate:
315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  typedef llvm::DenseMap<const ResolveInfo*, GOTEntry*> SymbolIndexMapType;
32affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  typedef llvm::DenseMap<const ResolveInfo*, bool> SymbolTypeMapType;
335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic:
35cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  typedef SectionData::iterator iterator;
36cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  typedef SectionData::const_iterator const_iterator;
375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic:
39cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  MipsGOT(LDSection& pSection, SectionData& pSectionData);
405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  iterator begin();
425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  iterator end();
435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  const_iterator begin() const;
455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  const_iterator end() const;
465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  uint64_t emit(MemoryRegion& pRegion);
485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  void reserveLocalEntry();
505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  void reserveGlobalEntry();
515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  GOTEntry* getEntry(const ResolveInfo& pInfo, bool& pExist);
535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size_t getTotalNum() const;
555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size_t getLocalNum() const;
565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
57affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  void setLocal(const ResolveInfo* pInfo) {
58affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    m_GOTTypeMap[pInfo] = false;
59affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  }
60affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
61affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  void setGlobal(const ResolveInfo* pInfo) {
62affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    m_GOTTypeMap[pInfo] = true;
63affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  }
64affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
65affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  bool isLocal(const ResolveInfo* pInfo) {
66affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    return m_GOTTypeMap[pInfo] == false;
67affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  }
68affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
69affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  bool isGlobal(const ResolveInfo* pInfo) {
70affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    return m_GOTTypeMap[pInfo] == true;
71affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  }
72affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate:
74affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  SymbolIndexMapType m_GeneralGOTMap; // Map ResolveInfo* to GOTEntry *.
75affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  SymbolTypeMapType m_GOTTypeMap;
76affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  iterator m_LocalGOTIterator;  // last local GOT entries
785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  iterator m_GlobalGOTIterator; // last global GOT entries
795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size_t m_pLocalNum;
805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate:
825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // Use reserveLocalEntry()/reserveGlobalEntry() instead of this routine.
835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  void reserveEntry(size_t pNum = 1);
845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao};
855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of mcld
875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif
89affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
90