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