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