122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===- SectionSymbolSet.cpp -----------------------------------------------===// 222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// 322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// The MCLinker Project 422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// 522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// This file is distributed under the University of Illinois Open Source 622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// License. See LICENSE.TXT for details. 722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// 822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/SectionSymbolSet.h> 1022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/LDSection.h> 1122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/RelocData.h> 1222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/SectionData.h> 1322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/EhFrame.h> 1422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/ResolveInfo.h> 1522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/LDSymbol.h> 1622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/NamePool.h> 1722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Fragment/FragmentRef.h> 1822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/LDFileFormat.h> 1922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 2022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 2122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaousing namespace mcld; 2222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 2322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 2422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// SectionSymbolSet 2522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 2622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 2722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoSectionSymbolSet::SectionSymbolSet() 2822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 2922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_pSectionSymbolMap = new SectHashTableType(16); 3022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 3122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 3222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoSectionSymbolSet::~SectionSymbolSet() 3322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 3422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao delete m_pSectionSymbolMap; 3522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 3622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 3722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool SectionSymbolSet::add(LDSection& pOutSect, NamePool& pNamePool) 3822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 3922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // create the resolveInfo for this section symbol 4022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao llvm::StringRef sym_name = llvm::StringRef(pOutSect.name()); 4122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao ResolveInfo* sym_info = pNamePool.createSymbol(sym_name, 4222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao false, 4322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao ResolveInfo::Section, 4422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao ResolveInfo::Define, 4522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao ResolveInfo::Local, 4622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 0x0, // size 4722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao ResolveInfo::Default); 4822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 4922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // create the output section symbol and set its fragRef to the first fragment 5022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // of the section 5122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao LDSymbol* sym = LDSymbol::Create(*sym_info); 5222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao sym_info->setSymPtr(sym); 5322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 5422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // insert the symbol to the Section to Symbol hash map 5522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao bool exist = false; 5622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao SectHashTableType::entry_type* entry = 5722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_pSectionSymbolMap->insert(&pOutSect, exist); 5822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao assert(!exist); 5922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao entry->setValue(sym); 6022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 6122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return true; 6222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 6322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 6422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool SectionSymbolSet::finalize(LDSection& pOutSect, 65f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines SymbolTable& pSymTab, bool relocatable) 6622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 67f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (!relocatable && pOutSect.size() == 0) 68f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines return true; 69d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 7022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao LDSymbol* sym = get(pOutSect); 7122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao assert(NULL != sym); 72f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines SectionData* data = NULL; 7322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao switch (pOutSect.kind()) { 7422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao case LDFileFormat::Relocation: 75d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao // Relocation section should not have section symbol. 76d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao return true; 7722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 7822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao case LDFileFormat::EhFrame: 79f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (EhFrame *ehframe = pOutSect.getEhFrame()) 80f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines data = ehframe->getSectionData(); 8122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao break; 8222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 8322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao default: 84f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines data = pOutSect.getSectionData(); 8522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao break; 8622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 87f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines FragmentRef* frag_ref; 88f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (data && !data->empty()) 89f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines frag_ref = FragmentRef::Create(data->front(), 0x0); 90f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines else 91f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines frag_ref = FragmentRef::Null(); 9222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao sym->setFragmentRef(frag_ref); 9322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // push symbol into output symbol table 9422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao pSymTab.add(*sym); 9522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 9622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return true; 9722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 9822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 9922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoLDSymbol* SectionSymbolSet::get(const LDSection& pOutSect) 10022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 10122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao SectHashTableType::iterator entry = m_pSectionSymbolMap->find(&pOutSect); 10222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return entry.getEntry()->value(); 10322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 10422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 10522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoconst LDSymbol* SectionSymbolSet::get(const LDSection& pOutSect) const 10622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 10722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao SectHashTableType::iterator entry = m_pSectionSymbolMap->find(&pOutSect); 10822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return entry.getEntry()->value(); 10922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 11022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 111