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//===----------------------------------------------------------------------===//
937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/SectionSymbolSet.h"
1022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
1137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Fragment/FragmentRef.h"
1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/EhFrame.h"
1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/LDFileFormat.h"
1437b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/LDSection.h"
1537b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/LDSymbol.h"
1637b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/NamePool.h"
1737b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/RelocData.h"
1837b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/ResolveInfo.h"
1937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/SectionData.h"
2022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
2137b74a387bb3993387029859c2d9d051c41c724eStephen Hinesnamespace mcld {
2222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
2322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===//
2422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// SectionSymbolSet
2522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===//
2622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
2737b74a387bb3993387029859c2d9d051c41c724eStephen HinesSectionSymbolSet::SectionSymbolSet() {
2822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  m_pSectionSymbolMap = new SectHashTableType(16);
2922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
3022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
3137b74a387bb3993387029859c2d9d051c41c724eStephen HinesSectionSymbolSet::~SectionSymbolSet() {
3222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  delete m_pSectionSymbolMap;
3322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
3422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
3537b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool SectionSymbolSet::add(LDSection& pOutSect, NamePool& pNamePool) {
3622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // create the resolveInfo for this section symbol
3722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  llvm::StringRef sym_name = llvm::StringRef(pOutSect.name());
3822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ResolveInfo* sym_info = pNamePool.createSymbol(sym_name,
3922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                                                 false,
4022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                                                 ResolveInfo::Section,
4122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                                                 ResolveInfo::Define,
4222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                                                 ResolveInfo::Local,
4337b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                                 0x0,  // size
4422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                                                 ResolveInfo::Default);
4522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
4622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // create the output section symbol and set its fragRef to the first fragment
4722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // of the section
4822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  LDSymbol* sym = LDSymbol::Create(*sym_info);
4922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  sym_info->setSymPtr(sym);
5022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
5122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // insert the symbol to the Section to Symbol hash map
5222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  bool exist = false;
5322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  SectHashTableType::entry_type* entry =
5437b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_pSectionSymbolMap->insert(&pOutSect, exist);
5522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  assert(!exist);
5622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  entry->setValue(sym);
5722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
5822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return true;
5922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
6022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
6122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool SectionSymbolSet::finalize(LDSection& pOutSect,
6237b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                SymbolTable& pSymTab,
6337b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                bool relocatable) {
64f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  if (!relocatable && pOutSect.size() == 0)
6537b74a387bb3993387029859c2d9d051c41c724eStephen Hines    return true;
66d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
6722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  LDSymbol* sym = get(pOutSect);
6837b74a387bb3993387029859c2d9d051c41c724eStephen Hines  assert(sym != NULL);
69f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  SectionData* data = NULL;
7022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  switch (pOutSect.kind()) {
7122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    case LDFileFormat::Relocation:
72d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao      // Relocation section should not have section symbol.
73d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao      return true;
7422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
7522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    case LDFileFormat::EhFrame:
7637b74a387bb3993387029859c2d9d051c41c724eStephen Hines      if (EhFrame* ehframe = pOutSect.getEhFrame())
7737b74a387bb3993387029859c2d9d051c41c724eStephen Hines        data = ehframe->getSectionData();
7822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      break;
7922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
8022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    default:
81f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines      data = pOutSect.getSectionData();
8222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      break;
8322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  }
84f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  FragmentRef* frag_ref;
85f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  if (data && !data->empty())
86f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    frag_ref = FragmentRef::Create(data->front(), 0x0);
87f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  else
88f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    frag_ref = FragmentRef::Null();
8922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  sym->setFragmentRef(frag_ref);
9022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // push symbol into output symbol table
9122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  pSymTab.add(*sym);
9222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
9322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return true;
9422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
9522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
9637b74a387bb3993387029859c2d9d051c41c724eStephen HinesLDSymbol* SectionSymbolSet::get(const LDSection& pOutSect) {
9722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  SectHashTableType::iterator entry = m_pSectionSymbolMap->find(&pOutSect);
9822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return entry.getEntry()->value();
9922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
10022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
10137b74a387bb3993387029859c2d9d051c41c724eStephen Hinesconst LDSymbol* SectionSymbolSet::get(const LDSection& pOutSect) const {
10222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  SectHashTableType::iterator entry = m_pSectionSymbolMap->find(&pOutSect);
10322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return entry.getEntry()->value();
10422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
10522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
10637b74a387bb3993387029859c2d9d051c41c724eStephen Hines}  // namespace mcld
107