122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===- SectionSymbolSet.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//===----------------------------------------------------------------------===//
922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/SectionSymbolSet.h>
1022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/LDSection.h>
1122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/RelocData.h>
1222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/SectionData.h>
1322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/EhFrame.h>
1422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/ResolveInfo.h>
1522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/LDSymbol.h>
1622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/NamePool.h>
1722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Fragment/FragmentRef.h>
1822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/LDFileFormat.h>
1922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
2022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
2122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaousing namespace mcld;
2222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
2322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===//
2422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// SectionSymbolSet
2522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===//
2622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
2722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoSectionSymbolSet::SectionSymbolSet()
2822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
2922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  m_pSectionSymbolMap = new SectHashTableType(16);
3022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
3122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
3222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoSectionSymbolSet::~SectionSymbolSet()
3322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
3422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  delete m_pSectionSymbolMap;
3522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
3622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
3722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool SectionSymbolSet::add(LDSection& pOutSect, NamePool& pNamePool)
3822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
3922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // create the resolveInfo for this section symbol
4022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  llvm::StringRef sym_name = llvm::StringRef(pOutSect.name());
4122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ResolveInfo* sym_info = pNamePool.createSymbol(sym_name,
4222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                                                 false,
4322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                                                 ResolveInfo::Section,
4422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                                                 ResolveInfo::Define,
4522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                                                 ResolveInfo::Local,
4622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                                                 0x0, // size
4722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                                                 ResolveInfo::Default);
4822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
4922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // create the output section symbol and set its fragRef to the first fragment
5022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // of the section
5122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  LDSymbol* sym = LDSymbol::Create(*sym_info);
5222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  sym_info->setSymPtr(sym);
5322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
5422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // insert the symbol to the Section to Symbol hash map
5522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  bool exist = false;
5622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  SectHashTableType::entry_type* entry =
5722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                            m_pSectionSymbolMap->insert(&pOutSect, exist);
5822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  assert(!exist);
5922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  entry->setValue(sym);
6022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
6122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return true;
6222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
6322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
6422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool SectionSymbolSet::finalize(LDSection& pOutSect,
65f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                                SymbolTable& pSymTab, bool relocatable)
6622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
67f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  if (!relocatable && pOutSect.size() == 0)
68f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines      return true;
69d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
7022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  LDSymbol* sym = get(pOutSect);
7122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  assert(NULL != sym);
72f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  SectionData* data = NULL;
7322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  switch (pOutSect.kind()) {
7422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    case LDFileFormat::Relocation:
75d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao      // Relocation section should not have section symbol.
76d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao      return true;
7722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
7822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    case LDFileFormat::EhFrame:
79f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines      if (EhFrame *ehframe = pOutSect.getEhFrame())
80f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines          data = ehframe->getSectionData();
8122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      break;
8222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
8322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    default:
84f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines      data = pOutSect.getSectionData();
8522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      break;
8622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  }
87f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  FragmentRef* frag_ref;
88f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  if (data && !data->empty())
89f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    frag_ref = FragmentRef::Create(data->front(), 0x0);
90f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  else
91f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    frag_ref = FragmentRef::Null();
9222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  sym->setFragmentRef(frag_ref);
9322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // push symbol into output symbol table
9422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  pSymTab.add(*sym);
9522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
9622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return true;
9722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
9822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
9922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoLDSymbol* SectionSymbolSet::get(const LDSection& pOutSect)
10022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
10122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  SectHashTableType::iterator entry = m_pSectionSymbolMap->find(&pOutSect);
10222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return entry.getEntry()->value();
10322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
10422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
10522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoconst LDSymbol* SectionSymbolSet::get(const LDSection& pOutSect) const
10622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
10722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  SectHashTableType::iterator entry = m_pSectionSymbolMap->find(&pOutSect);
10822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return entry.getEntry()->value();
10922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
11022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
111