| //===- Module.cpp ---------------------------------------------------------===// |
| // |
| // The MCLinker Project |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| #include "mcld/Module.h" |
| #include "mcld/Fragment/FragmentRef.h" |
| #include "mcld/LD/EhFrame.h" |
| #include "mcld/LD/LDSection.h" |
| #include "mcld/LD/LDSymbol.h" |
| #include "mcld/LD/NamePool.h" |
| #include "mcld/LD/ResolveInfo.h" |
| #include "mcld/LD/SectionData.h" |
| #include "mcld/LD/StaticResolver.h" |
| |
| namespace mcld { |
| |
| static GCFactory<Module::AliasList, MCLD_SECTIONS_PER_INPUT> |
| gc_aliaslist_factory; |
| |
| //===----------------------------------------------------------------------===// |
| // Module |
| //===----------------------------------------------------------------------===// |
| Module::Module(LinkerScript& pScript) : m_Script(pScript), m_NamePool(1024) { |
| } |
| |
| Module::Module(const std::string& pName, LinkerScript& pScript) |
| : m_Name(pName), m_Script(pScript), m_NamePool(1024) { |
| } |
| |
| Module::~Module() { |
| } |
| |
| // Following two functions will be obsolette when we have new section merger. |
| LDSection* Module::getSection(const std::string& pName) { |
| iterator sect, sectEnd = end(); |
| for (sect = begin(); sect != sectEnd; ++sect) { |
| if ((*sect)->name() == pName) |
| return *sect; |
| } |
| return NULL; |
| } |
| |
| const LDSection* Module::getSection(const std::string& pName) const { |
| const_iterator sect, sectEnd = end(); |
| for (sect = begin(); sect != sectEnd; ++sect) { |
| if ((*sect)->name() == pName) |
| return *sect; |
| } |
| return NULL; |
| } |
| |
| void Module::CreateAliasList(const ResolveInfo& pSym) { |
| AliasList* result = gc_aliaslist_factory.allocate(); |
| new (result) AliasList(); |
| m_AliasLists.push_back(result); |
| result->push_back(&pSym); |
| } |
| |
| void Module::addAlias(const ResolveInfo& pAlias) { |
| assert(m_AliasLists.size() != 0); |
| uint32_t last_pos = m_AliasLists.size() - 1; |
| m_AliasLists[last_pos]->push_back(&pAlias); |
| } |
| |
| Module::AliasList* Module::getAliasList(const ResolveInfo& pSym) { |
| std::vector<AliasList*>::iterator list_it, list_it_e = m_AliasLists.end(); |
| for (list_it = m_AliasLists.begin(); list_it != list_it_e; ++list_it) { |
| AliasList& list = **list_it; |
| alias_iterator alias_it, alias_it_e = list.end(); |
| for (alias_it = list.begin(); alias_it != alias_it_e; ++alias_it) { |
| if (strcmp((*alias_it)->name(), pSym.name()) == 0) { |
| return &list; |
| } |
| } |
| } |
| return NULL; |
| } |
| |
| } // namespace mcld |