122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===- Module.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/Module.h" 1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Fragment/FragmentRef.h" 1137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/EhFrame.h" 1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/LDSection.h" 1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/LDSymbol.h" 1437b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/NamePool.h" 1537b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/ResolveInfo.h" 1637b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/SectionData.h" 1737b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/StaticResolver.h" 1822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 1937b74a387bb3993387029859c2d9d051c41c724eStephen Hinesnamespace mcld { 2022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 2137b74a387bb3993387029859c2d9d051c41c724eStephen Hinesstatic GCFactory<Module::AliasList, MCLD_SECTIONS_PER_INPUT> 2237b74a387bb3993387029859c2d9d051c41c724eStephen Hines gc_aliaslist_factory; 23f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 2422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 2522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// Module 2622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 2737b74a387bb3993387029859c2d9d051c41c724eStephen HinesModule::Module(LinkerScript& pScript) : m_Script(pScript), m_NamePool(1024) { 2822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 2922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 30f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen HinesModule::Module(const std::string& pName, LinkerScript& pScript) 3137b74a387bb3993387029859c2d9d051c41c724eStephen Hines : m_Name(pName), m_Script(pScript), m_NamePool(1024) { 3222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 3322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 3437b74a387bb3993387029859c2d9d051c41c724eStephen HinesModule::~Module() { 3522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 3622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 3722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// Following two functions will be obsolette when we have new section merger. 3837b74a387bb3993387029859c2d9d051c41c724eStephen HinesLDSection* Module::getSection(const std::string& pName) { 3922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao iterator sect, sectEnd = end(); 4022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao for (sect = begin(); sect != sectEnd; ++sect) { 4122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if ((*sect)->name() == pName) 4222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return *sect; 4322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 4422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return NULL; 4522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 4622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 4737b74a387bb3993387029859c2d9d051c41c724eStephen Hinesconst LDSection* Module::getSection(const std::string& pName) const { 4822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const_iterator sect, sectEnd = end(); 4922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao for (sect = begin(); sect != sectEnd; ++sect) { 5022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if ((*sect)->name() == pName) 5122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return *sect; 5222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 5322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return NULL; 5422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 5522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 5637b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid Module::CreateAliasList(const ResolveInfo& pSym) { 57f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines AliasList* result = gc_aliaslist_factory.allocate(); 58f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines new (result) AliasList(); 59f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines m_AliasLists.push_back(result); 60f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines result->push_back(&pSym); 61f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines} 62f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 6337b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid Module::addAlias(const ResolveInfo& pAlias) { 6437b74a387bb3993387029859c2d9d051c41c724eStephen Hines assert(m_AliasLists.size() != 0); 6537b74a387bb3993387029859c2d9d051c41c724eStephen Hines uint32_t last_pos = m_AliasLists.size() - 1; 66f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines m_AliasLists[last_pos]->push_back(&pAlias); 67f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines} 68f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 6937b74a387bb3993387029859c2d9d051c41c724eStephen HinesModule::AliasList* Module::getAliasList(const ResolveInfo& pSym) { 7037b74a387bb3993387029859c2d9d051c41c724eStephen Hines std::vector<AliasList*>::iterator list_it, list_it_e = m_AliasLists.end(); 7137b74a387bb3993387029859c2d9d051c41c724eStephen Hines for (list_it = m_AliasLists.begin(); list_it != list_it_e; ++list_it) { 72f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines AliasList& list = **list_it; 7337b74a387bb3993387029859c2d9d051c41c724eStephen Hines alias_iterator alias_it, alias_it_e = list.end(); 7437b74a387bb3993387029859c2d9d051c41c724eStephen Hines for (alias_it = list.begin(); alias_it != alias_it_e; ++alias_it) { 7537b74a387bb3993387029859c2d9d051c41c724eStephen Hines if (strcmp((*alias_it)->name(), pSym.name()) == 0) { 76f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines return &list; 77f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 78f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 79f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 80f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines return NULL; 81f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines} 82f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 8337b74a387bb3993387029859c2d9d051c41c724eStephen Hines} // namespace mcld 84