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 115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/LDFileFormat.h> 12cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <mcld/LD/SectionData.h> 135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 14d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#include <llvm/Support/Casting.h> 155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaousing namespace mcld; 175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===// 196f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// X86_32GOT 20cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao//===----------------------------------------------------------------------===// 216f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen HinesX86_32GOT::X86_32GOT(LDSection& pSection) 22d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao : GOT(pSection), m_pLast(NULL) 235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 266f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen HinesX86_32GOT::~X86_32GOT() 275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 306f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesvoid X86_32GOT::reserve(size_t pNum) 31d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao{ 32d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao for (size_t i = 0; i < pNum; i++) { 336f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines new X86_32GOTEntry(0, m_SectionData); 34d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao } 35d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao} 36d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 376f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen HinesX86_32GOTEntry* X86_32GOT::consume() 38d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao{ 39d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao if (NULL == m_pLast) { 40d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao assert(!empty() && "Consume empty GOT entry!"); 416f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines m_pLast = llvm::cast<X86_32GOTEntry>(&m_SectionData->front()); 42d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao return m_pLast; 43d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao } 44d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 456f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines m_pLast = llvm::cast<X86_32GOTEntry>(m_pLast->getNextNode()); 466f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines return m_pLast; 476f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} 486f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 496f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===// 506f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// X86_64GOT 516f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===// 526f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen HinesX86_64GOT::X86_64GOT(LDSection& pSection) 536f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines : GOT(pSection), m_pLast(NULL) 546f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{ 556f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} 566f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 576f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen HinesX86_64GOT::~X86_64GOT() 586f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{ 596f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} 606f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 616f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesvoid X86_64GOT::reserve(size_t pNum) 626f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{ 636f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines for (size_t i = 0; i < pNum; i++) { 646f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines new X86_64GOTEntry(0, m_SectionData); 656f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines } 666f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} 676f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 686f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen HinesX86_64GOTEntry* X86_64GOT::consume() 696f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{ 706f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines if (NULL == m_pLast) { 716f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines assert(!empty() && "Consume empty GOT entry!"); 726f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines m_pLast = llvm::cast<X86_64GOTEntry>(&m_SectionData->front()); 736f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines return m_pLast; 746f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines } 756f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 766f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines m_pLast = llvm::cast<X86_64GOTEntry>(m_pLast->getNextNode()); 77d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao return m_pLast; 78d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao} 79d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 80