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