OutputRelocSection.cpp revision 5460a1f25d9ddecb5c70667267d66d51af177a99
15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- OutputRelocSection.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 <mcld/LD/LDSection.h>
105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/Target/OutputRelocSection.h>
115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaousing namespace mcld;
135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//==========================
155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// OutputRelocSection
165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoOutputRelocSection::OutputRelocSection(LDSection& pSection,
195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                       llvm::MCSectionData& pSectionData,
205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                       unsigned int pEntrySize)
215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  : m_pSection(&pSection),
225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_pSectionData(&pSectionData),
235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_EntryBytes(pEntrySize),
245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_isVisit(false),
255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_ValidEntryIterator(){
265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoOutputRelocSection::~OutputRelocSection()
295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid OutputRelocSection::reserveEntry(RelocationFactory& pRelFactory,
335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                      size_t pNum)
345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  for(size_t i=0; i<pNum; i++) {
365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_pSectionData->getFragmentList().push_back(pRelFactory.produceEmptyEntry());
375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    // update section size
385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_pSection->setSize(m_pSection->size() + m_EntryBytes);
395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoRelocation* OutputRelocSection::getEntry(const ResolveInfo& pSymbol,
435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                         bool isForGOT,
445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                         bool& pExist)
455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // first time visit this function, set m_ValidEntryIterator to
475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // Fragments.begin()
485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if(!m_isVisit) {
495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    assert( !m_pSectionData->getFragmentList().empty() &&
505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao             "DynRelSection contains no entries.");
515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_ValidEntryIterator = m_pSectionData->getFragmentList().begin();
525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_isVisit = true;
535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  assert(m_ValidEntryIterator != m_pSectionData->end() &&
565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao         "No empty relocation entry for the incoming symbol.");
575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // if this relocation is used to relocate GOT (.got or .got.plt),
595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // check if we've gotten an entry for this symbol before. If yes,
605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // return the found entry in map.
615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // Otherwise, this relocation is used to relocate general section
625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // (data or text section), return an empty entry directly.
635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Relocation* result;
645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if(isForGOT) {
665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    // get or create entry in m_SymRelMap
675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    Relocation *&Entry = m_SymRelMap[&pSymbol];
685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    pExist = 1;
695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    if(!Entry) {
715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      pExist = 0;
725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      Entry = llvm::cast<Relocation>(&(*m_ValidEntryIterator));
735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      ++m_ValidEntryIterator;
745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    }
755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    result = Entry;
765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  else {
785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    pExist = 0;
795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    result = llvm::cast<Relocation>(&(*m_ValidEntryIterator));
805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    ++m_ValidEntryIterator;
815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  return result;
835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
85