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