1//===- Module.cpp ---------------------------------------------------------===// 2// 3// The MCLinker Project 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9#include <mcld/Module.h> 10#include <mcld/Fragment/FragmentRef.h> 11#include <mcld/LD/LDSection.h> 12#include <mcld/LD/LDSymbol.h> 13#include <mcld/LD/NamePool.h> 14#include <mcld/LD/ResolveInfo.h> 15#include <mcld/LD/SectionData.h> 16#include <mcld/LD/EhFrame.h> 17#include <mcld/LD/StaticResolver.h> 18 19using namespace mcld; 20 21static GCFactory<Module::AliasList, MCLD_SECTIONS_PER_INPUT> gc_aliaslist_factory; 22 23//===----------------------------------------------------------------------===// 24// Module 25//===----------------------------------------------------------------------===// 26Module::Module(LinkerScript& pScript) 27 : m_Script(pScript), m_NamePool(1024) { 28} 29 30Module::Module(const std::string& pName, LinkerScript& pScript) 31 : m_Name(pName), m_Script(pScript), m_NamePool(1024) { 32} 33 34Module::~Module() 35{ 36} 37 38// Following two functions will be obsolette when we have new section merger. 39LDSection* Module::getSection(const std::string& pName) 40{ 41 iterator sect, sectEnd = end(); 42 for (sect = begin(); sect != sectEnd; ++sect) { 43 if ((*sect)->name() == pName) 44 return *sect; 45 } 46 return NULL; 47} 48 49const LDSection* Module::getSection(const std::string& pName) const 50{ 51 const_iterator sect, sectEnd = end(); 52 for (sect = begin(); sect != sectEnd; ++sect) { 53 if ((*sect)->name() == pName) 54 return *sect; 55 } 56 return NULL; 57} 58 59void Module::CreateAliasList(const ResolveInfo& pSym) 60{ 61 AliasList* result = gc_aliaslist_factory.allocate(); 62 new (result) AliasList(); 63 m_AliasLists.push_back(result); 64 result->push_back(&pSym); 65} 66 67void Module::addAlias(const ResolveInfo& pAlias) 68{ 69 assert(0!=m_AliasLists.size()); 70 uint32_t last_pos = m_AliasLists.size()-1; 71 m_AliasLists[last_pos]->push_back(&pAlias); 72} 73 74Module::AliasList* Module::getAliasList(const ResolveInfo& pSym) 75{ 76 std::vector<AliasList*>::iterator list_it, list_it_e=m_AliasLists.end(); 77 for (list_it=m_AliasLists.begin(); list_it!=list_it_e; ++list_it) { 78 AliasList& list = **list_it; 79 alias_iterator alias_it, alias_it_e=list.end(); 80 for (alias_it=list.begin(); alias_it!=alias_it_e; ++alias_it) { 81 if ( 0==strcmp((*alias_it)->name(), pSym.name()) ) { 82 return &list; 83 } 84 } 85 } 86 return NULL; 87} 88 89