• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
19 using namespace mcld;
20 
21 static GCFactory<Module::AliasList, MCLD_SECTIONS_PER_INPUT> gc_aliaslist_factory;
22 
23 //===----------------------------------------------------------------------===//
24 // Module
25 //===----------------------------------------------------------------------===//
Module(LinkerScript & pScript)26 Module::Module(LinkerScript& pScript)
27   : m_Script(pScript), m_NamePool(1024) {
28 }
29 
Module(const std::string & pName,LinkerScript & pScript)30 Module::Module(const std::string& pName, LinkerScript& pScript)
31   : m_Name(pName), m_Script(pScript), m_NamePool(1024) {
32 }
33 
~Module()34 Module::~Module()
35 {
36 }
37 
38 // Following two functions will be obsolette when we have new section merger.
getSection(const std::string & pName)39 LDSection* 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 
getSection(const std::string & pName) const49 const 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 
CreateAliasList(const ResolveInfo & pSym)59 void 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 
addAlias(const ResolveInfo & pAlias)67 void 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 
getAliasList(const ResolveInfo & pSym)74 Module::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