OutputRelocSection.cpp revision 87f34658dec9097d987d254a990ea7f311bfc95f
1//===- OutputRelocSection.cpp ---------------------------------------------===// 2// 3// The MCLinker Project 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9#include <mcld/Target/OutputRelocSection.h> 10 11#include <mcld/LD/LDSection.h> 12#include <mcld/LD/RelocationFactory.h> 13#include <mcld/Module.h> 14#include <mcld/Support/MsgHandling.h> 15#include <mcld/IRBuilder.h> 16 17#include <llvm/Support/Casting.h> 18 19using namespace mcld; 20 21//===----------------------------------------------------------------------===// 22// OutputRelocSection 23//===----------------------------------------------------------------------===// 24OutputRelocSection::OutputRelocSection(Module& pModule, LDSection& pSection) 25 : m_Module(pModule), 26 m_pRelocData(NULL), 27 m_isVisit(false), 28 m_ValidEntryIterator(){ 29 assert(!pSection.hasRelocData() && "Given section is not a relocation section"); 30 m_pRelocData = IRBuilder::CreateRelocData(pSection); 31} 32 33OutputRelocSection::~OutputRelocSection() 34{ 35} 36 37Relocation* OutputRelocSection::create() 38{ 39 Relocation* reloc = Relocation::Create(); 40 m_pRelocData->append(*reloc); 41 return reloc; 42} 43 44void OutputRelocSection::reserveEntry(size_t pNum) 45{ 46 for(size_t i=0; i<pNum; i++) 47 m_pRelocData->append(*Relocation::Create()); 48} 49 50Relocation* OutputRelocSection::consumeEntry() 51{ 52 // first time visit this function, set m_ValidEntryIterator to 53 // Fragments.begin() 54 if(!m_isVisit) { 55 assert(!m_pRelocData->getRelocationList().empty() && 56 "DynRelSection contains no entries."); 57 m_ValidEntryIterator = m_pRelocData->begin(); 58 m_isVisit = true; 59 } 60 else { 61 // Add m_ValidEntryIterator here instead of at the end of this function. 62 // We may reserve an entry and then consume it immediately, e.g. for COPY 63 // relocation, so we need to avoid setting this iterator to 64 // RelocData->end() in any case, or when reserve and consume again, 65 // ++m_ValidEntryIterator will still be RelocData->end(). 66 ++m_ValidEntryIterator; 67 } 68 assert(m_ValidEntryIterator != m_pRelocData->end() && 69 "No empty relocation entry for the incoming symbol."); 70 71 return &(*m_ValidEntryIterator); 72} 73 74size_t OutputRelocSection::numOfRelocs() 75{ 76 return m_pRelocData->size(); 77} 78 79bool OutputRelocSection::addSymbolToDynSym(LDSymbol& pSymbol) 80{ 81 m_Module.getSymbolTable().changeToDynamic(pSymbol); 82 return true; 83} 84 85