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