Module.cpp revision f7ac0f19a1c8d0ad14bcf6456ce368b830fea886
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