OutputRelocSection.cpp revision 22add6ff3426df1a85089fe6a6e1597ee3b6f300
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//===----------------------------------------------------------------------===//
9cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
10cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <llvm/Support/Casting.h>
11cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
12cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <mcld/LD/LDSection.h>
1322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/RelocationFactory.h>
1422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Module.h>
15affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/Support/MsgHandling.h>
1622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Target/OutputRelocSection.h>
1722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/IRBuilder.h>
185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaousing namespace mcld;
205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
21cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao//===----------------------------------------------------------------------===//
225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// OutputRelocSection
23cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao//===----------------------------------------------------------------------===//
2422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoOutputRelocSection::OutputRelocSection(Module& pModule,
2522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                                       LDSection& pSection,
265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                       unsigned int pEntrySize)
2722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  : m_Module(pModule),
2822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    m_pSection(&pSection),
2922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    m_pRelocData(NULL),
305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_EntryBytes(pEntrySize),
315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_isVisit(false),
325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_ValidEntryIterator(){
3322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  assert(!pSection.hasRelocData() && "Given section is not a relocation section");
3422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  m_pRelocData = IRBuilder::CreateRelocData(pSection);
355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoOutputRelocSection::~OutputRelocSection()
385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid OutputRelocSection::reserveEntry(RelocationFactory& pRelFactory,
425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                      size_t pNum)
435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  for(size_t i=0; i<pNum; i++) {
4522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    m_pRelocData->getFragmentList().push_back(
4622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                                              pRelFactory.produceEmptyEntry());
475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    // update section size
485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_pSection->setSize(m_pSection->size() + m_EntryBytes);
495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
5222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoRelocation* OutputRelocSection::consumeEntry()
535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // first time visit this function, set m_ValidEntryIterator to
555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // Fragments.begin()
565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if(!m_isVisit) {
5722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    assert(!m_pRelocData->getFragmentList().empty() &&
585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao             "DynRelSection contains no entries.");
5922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    m_ValidEntryIterator = m_pRelocData->getFragmentList().begin();
605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_isVisit = true;
615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  else {
6322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    // Add m_ValidEntryIterator here instead of at the end of this function.
6422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    // We may reserve an entry and then consume it immediately, e.g. for COPY
6522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    // relocation, so we need to avoid setting this iterator to
6622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    // RelocData->end() in any case, or when reserve and consume again,
6722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    // ++m_ValidEntryIterator will still be RelocData->end().
685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    ++m_ValidEntryIterator;
695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
7022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  assert(m_ValidEntryIterator != m_pRelocData->end() &&
7122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao         "No empty relocation entry for the incoming symbol.");
7222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
7322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Relocation* result = &llvm::cast<Relocation>(*m_ValidEntryIterator);
745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  return result;
755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
7722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaovoid OutputRelocSection::finalizeSectionSize()
7822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
7922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  m_pSection->setSize(m_pRelocData->size() * m_EntryBytes);
8022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
8122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
8222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool OutputRelocSection::addSymbolToDynSym(LDSymbol& pSymbol)
8322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
8422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  m_Module.getSymbolTable().changeLocalToTLS(pSymbol);
8522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return true;
8622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
87