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//===----------------------------------------------------------------------===// 937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/SectionSymbolSet.h" 1022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 1137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Fragment/FragmentRef.h" 1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/EhFrame.h" 1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/LDFileFormat.h" 1437b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/LDSection.h" 1537b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/LDSymbol.h" 1637b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/NamePool.h" 1737b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/RelocData.h" 1837b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/ResolveInfo.h" 1937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/SectionData.h" 2022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 2137b74a387bb3993387029859c2d9d051c41c724eStephen Hinesnamespace mcld { 2222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 2322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 2422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// SectionSymbolSet 2522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 2622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 2737b74a387bb3993387029859c2d9d051c41c724eStephen HinesSectionSymbolSet::SectionSymbolSet() { 2822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_pSectionSymbolMap = new SectHashTableType(16); 2922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 3022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 3137b74a387bb3993387029859c2d9d051c41c724eStephen HinesSectionSymbolSet::~SectionSymbolSet() { 3222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao delete m_pSectionSymbolMap; 3322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 3422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 3537b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool SectionSymbolSet::add(LDSection& pOutSect, NamePool& pNamePool) { 3622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // create the resolveInfo for this section symbol 3722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao llvm::StringRef sym_name = llvm::StringRef(pOutSect.name()); 3822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao ResolveInfo* sym_info = pNamePool.createSymbol(sym_name, 3922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao false, 4022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao ResolveInfo::Section, 4122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao ResolveInfo::Define, 4222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao ResolveInfo::Local, 4337b74a387bb3993387029859c2d9d051c41c724eStephen Hines 0x0, // size 4422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao ResolveInfo::Default); 4522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 4622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // create the output section symbol and set its fragRef to the first fragment 4722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // of the section 4822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao LDSymbol* sym = LDSymbol::Create(*sym_info); 4922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao sym_info->setSymPtr(sym); 5022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 5122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // insert the symbol to the Section to Symbol hash map 5222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao bool exist = false; 5322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao SectHashTableType::entry_type* entry = 5437b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_pSectionSymbolMap->insert(&pOutSect, exist); 5522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao assert(!exist); 5622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao entry->setValue(sym); 5722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 5822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return true; 5922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 6022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 6122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool SectionSymbolSet::finalize(LDSection& pOutSect, 6237b74a387bb3993387029859c2d9d051c41c724eStephen Hines SymbolTable& pSymTab, 6337b74a387bb3993387029859c2d9d051c41c724eStephen Hines bool relocatable) { 64f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (!relocatable && pOutSect.size() == 0) 6537b74a387bb3993387029859c2d9d051c41c724eStephen Hines return true; 66d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 6722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao LDSymbol* sym = get(pOutSect); 6837b74a387bb3993387029859c2d9d051c41c724eStephen Hines assert(sym != NULL); 69f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines SectionData* data = NULL; 7022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao switch (pOutSect.kind()) { 7122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao case LDFileFormat::Relocation: 72d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao // Relocation section should not have section symbol. 73d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao return true; 7422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 7522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao case LDFileFormat::EhFrame: 7637b74a387bb3993387029859c2d9d051c41c724eStephen Hines if (EhFrame* ehframe = pOutSect.getEhFrame()) 7737b74a387bb3993387029859c2d9d051c41c724eStephen Hines data = ehframe->getSectionData(); 7822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao break; 7922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 8022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao default: 81f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines data = pOutSect.getSectionData(); 8222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao break; 8322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 84f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines FragmentRef* frag_ref; 85f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (data && !data->empty()) 86f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines frag_ref = FragmentRef::Create(data->front(), 0x0); 87f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines else 88f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines frag_ref = FragmentRef::Null(); 8922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao sym->setFragmentRef(frag_ref); 9022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // push symbol into output symbol table 9122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao pSymTab.add(*sym); 9222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 9322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return true; 9422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 9522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 9637b74a387bb3993387029859c2d9d051c41c724eStephen HinesLDSymbol* SectionSymbolSet::get(const LDSection& pOutSect) { 9722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao SectHashTableType::iterator entry = m_pSectionSymbolMap->find(&pOutSect); 9822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return entry.getEntry()->value(); 9922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 10022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 10137b74a387bb3993387029859c2d9d051c41c724eStephen Hinesconst LDSymbol* SectionSymbolSet::get(const LDSection& pOutSect) const { 10222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao SectHashTableType::iterator entry = m_pSectionSymbolMap->find(&pOutSect); 10322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return entry.getEntry()->value(); 10422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 10522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 10637b74a387bb3993387029859c2d9d051c41c724eStephen Hines} // namespace mcld 107