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