15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- LDSection.cpp ------------------------------------------------------===//
25460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
35460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//                     The MCLinker Project
45460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
55460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// This file is distributed under the University of Illinois Open Source
65460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// License. See LICENSE.TXT for details.
75460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
85460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===//
95460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/LDSection.h>
105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Support/GCFactory.h>
1222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
1322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <llvm/Support/ManagedStatic.h>
1422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaousing namespace mcld;
165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaotypedef GCFactory<LDSection, MCLD_SECTIONS_PER_INPUT> SectionFactory;
1822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
1922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaostatic llvm::ManagedStatic<SectionFactory> g_SectFactory;
2022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
2122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===//
2222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// LDSection
2322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===//
2422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoLDSection::LDSection()
2522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  : m_Name(),
2622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    m_Kind(LDFileFormat::Ignore),
2722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    m_Type(0x0),
2822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    m_Flag(0x0),
2922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    m_Size(0),
3022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    m_Offset(~uint64_t(0)),
3122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    m_Addr(0x0),
3222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    m_Align(0),
3322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    m_Info(0),
3422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    m_pLink(NULL),
3522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    m_Index(0) {
3622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  m_Data.sect_data = NULL;
3722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
3822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoLDSection::LDSection(const std::string& pName,
405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                     LDFileFormat::Kind pKind,
415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                     uint32_t pType,
425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                     uint32_t pFlag,
435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                     uint64_t pSize,
445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                     uint64_t pAddr)
45cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  : m_Name(pName),
465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_Kind(pKind),
475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_Type(pType),
485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_Flag(pFlag),
495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_Size(pSize),
5022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    m_Offset(~uint64_t(0)),
515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_Addr(pAddr),
525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_Align(0),
535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_Info(0),
545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_pLink(NULL),
555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_Index(0) {
5622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  m_Data.sect_data = NULL;
5722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
5822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
5922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoLDSection::~LDSection()
6022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
6122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
6222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
6322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool LDSection::hasOffset() const
6422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
6522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return (m_Offset != ~uint64_t(0));
6622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
6722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
6822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoLDSection* LDSection::Create(const std::string& pName,
6922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                             LDFileFormat::Kind pKind,
7022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                             uint32_t pType,
7122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                             uint32_t pFlag,
7222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                             uint64_t pSize,
7322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                             uint64_t pAddr)
7422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
7522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  LDSection* result = g_SectFactory->allocate();
7622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  new (result) LDSection(pName, pKind, pType, pFlag, pSize, pAddr);
7722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return result;
7822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
7922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
8022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaovoid LDSection::Destroy(LDSection*& pSection)
8122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
8222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  g_SectFactory->destroy(pSection);
8322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  g_SectFactory->deallocate(pSection);
8422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  pSection = NULL;
8522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
8622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
8722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaovoid LDSection::Clear()
8822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
8922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  g_SectFactory->clear();
9022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
9122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
9222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool LDSection::hasSectionData() const
9322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
9422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  assert(LDFileFormat::Relocation != kind() && LDFileFormat::EhFrame != kind());
9522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return (NULL != m_Data.sect_data);
9622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
9722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
9822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool LDSection::hasRelocData() const
9922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
10022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  assert(LDFileFormat::Relocation == kind());
10122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return (NULL != m_Data.reloc_data);
10222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
10322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
10422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool LDSection::hasEhFrame() const
10522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
10622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  assert(LDFileFormat::EhFrame == kind());
10722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return (NULL != m_Data.eh_frame);
1085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
1095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
110