Home | History | Annotate | Download | only in Core
      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/EhFrame.h"
     12 #include "mcld/LD/LDSection.h"
     13 #include "mcld/LD/LDSymbol.h"
     14 #include "mcld/LD/NamePool.h"
     15 #include "mcld/LD/ResolveInfo.h"
     16 #include "mcld/LD/SectionData.h"
     17 #include "mcld/LD/StaticResolver.h"
     18 
     19 namespace mcld {
     20 
     21 static GCFactory<Module::AliasList, MCLD_SECTIONS_PER_INPUT>
     22     gc_aliaslist_factory;
     23 
     24 //===----------------------------------------------------------------------===//
     25 // Module
     26 //===----------------------------------------------------------------------===//
     27 Module::Module(LinkerScript& pScript) : m_Script(pScript), m_NamePool(1024) {
     28 }
     29 
     30 Module::Module(const std::string& pName, LinkerScript& pScript)
     31     : m_Name(pName), m_Script(pScript), m_NamePool(1024) {
     32 }
     33 
     34 Module::~Module() {
     35 }
     36 
     37 // Following two functions will be obsolette when we have new section merger.
     38 LDSection* Module::getSection(const std::string& pName) {
     39   iterator sect, sectEnd = end();
     40   for (sect = begin(); sect != sectEnd; ++sect) {
     41     if ((*sect)->name() == pName)
     42       return *sect;
     43   }
     44   return NULL;
     45 }
     46 
     47 const LDSection* Module::getSection(const std::string& pName) const {
     48   const_iterator sect, sectEnd = end();
     49   for (sect = begin(); sect != sectEnd; ++sect) {
     50     if ((*sect)->name() == pName)
     51       return *sect;
     52   }
     53   return NULL;
     54 }
     55 
     56 void Module::CreateAliasList(const ResolveInfo& pSym) {
     57   AliasList* result = gc_aliaslist_factory.allocate();
     58   new (result) AliasList();
     59   m_AliasLists.push_back(result);
     60   result->push_back(&pSym);
     61 }
     62 
     63 void Module::addAlias(const ResolveInfo& pAlias) {
     64   assert(m_AliasLists.size() != 0);
     65   uint32_t last_pos = m_AliasLists.size() - 1;
     66   m_AliasLists[last_pos]->push_back(&pAlias);
     67 }
     68 
     69 Module::AliasList* Module::getAliasList(const ResolveInfo& pSym) {
     70   std::vector<AliasList*>::iterator list_it, list_it_e = m_AliasLists.end();
     71   for (list_it = m_AliasLists.begin(); list_it != list_it_e; ++list_it) {
     72     AliasList& list = **list_it;
     73     alias_iterator alias_it, alias_it_e = list.end();
     74     for (alias_it = list.begin(); alias_it != alias_it_e; ++alias_it) {
     75       if (strcmp((*alias_it)->name(), pSym.name()) == 0) {
     76         return &list;
     77       }
     78     }
     79   }
     80   return NULL;
     81 }
     82 
     83 }  // namespace mcld
     84