X86GOT.cpp revision cedee4b38f4786845183be7f5916dd520a170ae0
15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- impl.cpp -----------------------------------------------------------===// 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#include "X86GOT.h" 10cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 11cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <new> 12cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 13cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <llvm/Support/Casting.h> 14cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/LDFileFormat.h> 16cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <mcld/LD/SectionData.h> 17affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/Support/MsgHandling.h> 185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace { 205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const size_t X86GOTEntrySize = 4; 215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaousing namespace mcld; 245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===// 265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// X86GOT 27cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao//===----------------------------------------------------------------------===// 28cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei LiaoX86GOT::X86GOT(LDSection& pSection, SectionData& pSectionData) 295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao : GOT(pSection, pSectionData, X86GOTEntrySize), 30affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_GOTIterator(), m_fIsVisit(false) 315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoX86GOT::~X86GOT() 355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid X86GOT::reserveEntry(size_t pNum) 395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao GOTEntry* Entry = 0; 415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao for (size_t i = 0; i < pNum; i++) { 435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Entry = new (std::nothrow) GOTEntry(0, X86GOTEntrySize, 445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao &m_SectionData); 455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (!Entry) 47cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao fatal(diag::fail_allocate_memory_got); 485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_Section.setSize(m_Section.size() + X86GOTEntrySize); 505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoGOTEntry* X86GOT::getEntry(const ResolveInfo& pInfo, bool& pExist) 555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 56affc150dc44fab1911775a49636d0ce85333b634Zonr Chang // first time visit this function, set m_GOTIterator 57affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if(!m_fIsVisit) { 58affc150dc44fab1911775a49636d0ce85333b634Zonr Chang assert( !m_SectionData.getFragmentList().empty() && 59affc150dc44fab1911775a49636d0ce85333b634Zonr Chang "DynRelSection contains no entries."); 60affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_GOTIterator = m_SectionData.getFragmentList().begin(); 61affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_fIsVisit = true; 62affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 63affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 64affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 65affc150dc44fab1911775a49636d0ce85333b634Zonr Chang GOTEntry *&Entry = m_GOTMap[&pInfo]; 665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao pExist = 1; 675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (!Entry) { 695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao pExist = 0; 70affc150dc44fab1911775a49636d0ce85333b634Zonr Chang assert(m_GOTIterator != m_SectionData.getFragmentList().end() 71affc150dc44fab1911775a49636d0ce85333b634Zonr Chang && "The number of GOT Entries and ResolveInfo doesn't match!"); 72affc150dc44fab1911775a49636d0ce85333b634Zonr Chang Entry = llvm::cast<GOTEntry>(&(*m_GOTIterator)); 73affc150dc44fab1911775a49636d0ce85333b634Zonr Chang ++m_GOTIterator; 745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return Entry; 765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoX86GOT::iterator X86GOT::begin() 795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return m_SectionData.getFragmentList().begin(); 815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoX86GOT::const_iterator X86GOT::begin() const 845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return m_SectionData.getFragmentList().begin(); 865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoX86GOT::iterator X86GOT::end() 895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return m_SectionData.getFragmentList().end(); 915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoX86GOT::const_iterator X86GOT::end() const 945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return m_SectionData.getFragmentList().end(); 965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 98