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 105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/Target/OutputRelocSection.h> 11cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 12cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <llvm/Support/Casting.h> 13cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 14cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <mcld/LD/LDSection.h> 15affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/Support/MsgHandling.h> 165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaousing namespace mcld; 185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 19cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao//===----------------------------------------------------------------------===// 205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// OutputRelocSection 21cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao//===----------------------------------------------------------------------===// 225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoOutputRelocSection::OutputRelocSection(LDSection& pSection, 23cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao SectionData& pSectionData, 245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao unsigned int pEntrySize) 255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao : m_pSection(&pSection), 265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_pSectionData(&pSectionData), 275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_EntryBytes(pEntrySize), 285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_isVisit(false), 295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_ValidEntryIterator(){ 305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoOutputRelocSection::~OutputRelocSection() 335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid OutputRelocSection::reserveEntry(RelocationFactory& pRelFactory, 375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_t pNum) 385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao for(size_t i=0; i<pNum; i++) { 405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_pSectionData->getFragmentList().push_back(pRelFactory.produceEmptyEntry()); 415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // update section size 425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_pSection->setSize(m_pSection->size() + m_EntryBytes); 435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoRelocation* OutputRelocSection::getEntry(const ResolveInfo& pSymbol, 475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool isForGOT, 485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool& pExist) 495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // first time visit this function, set m_ValidEntryIterator to 515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // Fragments.begin() 525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if(!m_isVisit) { 535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao assert( !m_pSectionData->getFragmentList().empty() && 545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao "DynRelSection contains no entries."); 555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_ValidEntryIterator = m_pSectionData->getFragmentList().begin(); 565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_isVisit = true; 575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao assert(m_ValidEntryIterator != m_pSectionData->end() && 605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao "No empty relocation entry for the incoming symbol."); 615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // if this relocation is used to relocate GOT (.got or .got.plt), 635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // check if we've gotten an entry for this symbol before. If yes, 645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // return the found entry in map. 655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // Otherwise, this relocation is used to relocate general section 665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // (data or text section), return an empty entry directly. 675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Relocation* result; 685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if(isForGOT) { 705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // get or create entry in m_SymRelMap 71affc150dc44fab1911775a49636d0ce85333b634Zonr Chang Relocation *&entry = m_SymRelMap[&pSymbol]; 72affc150dc44fab1911775a49636d0ce85333b634Zonr Chang pExist = true; 735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 74affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if(NULL == entry) { 75affc150dc44fab1911775a49636d0ce85333b634Zonr Chang pExist = false; 76affc150dc44fab1911775a49636d0ce85333b634Zonr Chang entry = llvm::cast<Relocation>(&(*m_ValidEntryIterator)); 775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ++m_ValidEntryIterator; 785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 79affc150dc44fab1911775a49636d0ce85333b634Zonr Chang result = entry; 805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao else { 82affc150dc44fab1911775a49636d0ce85333b634Zonr Chang pExist = false; 835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao result = llvm::cast<Relocation>(&(*m_ValidEntryIterator)); 845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ++m_ValidEntryIterator; 855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return result; 875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 89