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//===----------------------------------------------------------------------===//
937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/LDSection.h"
105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/GCFactory.h"
1222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
1322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <llvm/Support/ManagedStatic.h>
1422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
1537b74a387bb3993387029859c2d9d051c41c724eStephen Hinesnamespace 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()
2537b74a387bb3993387029859c2d9d051c41c724eStephen Hines    : m_Name(),
2637b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_Kind(LDFileFormat::Ignore),
2737b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_Type(0x0),
2837b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_Flag(0x0),
2937b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_Size(0),
3037b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_Offset(~uint64_t(0)),
3137b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_Addr(0x0),
3237b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_Align(0),
3337b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_Info(0),
3437b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_pLink(NULL),
3537b74a387bb3993387029859c2d9d051c41c724eStephen Hines      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)
4537b74a387bb3993387029859c2d9d051c41c724eStephen Hines    : m_Name(pName),
4637b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_Kind(pKind),
4737b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_Type(pType),
4837b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_Flag(pFlag),
4937b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_Size(pSize),
5037b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_Offset(~uint64_t(0)),
5137b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_Addr(pAddr),
5237b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_Align(0),
5337b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_Info(0),
5437b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_pLink(NULL),
5537b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_Index(0) {
5622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  m_Data.sect_data = NULL;
5722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
5822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
5937b74a387bb3993387029859c2d9d051c41c724eStephen HinesLDSection::~LDSection() {
6022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
6122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
6237b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool LDSection::hasOffset() const {
6322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return (m_Offset != ~uint64_t(0));
6422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
6522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
6622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoLDSection* LDSection::Create(const std::string& pName,
6722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                             LDFileFormat::Kind pKind,
6822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                             uint32_t pType,
6922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                             uint32_t pFlag,
7022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                             uint64_t pSize,
7137b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             uint64_t pAddr) {
7222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  LDSection* result = g_SectFactory->allocate();
7322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  new (result) LDSection(pName, pKind, pType, pFlag, pSize, pAddr);
7422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return result;
7522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
7622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
7737b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid LDSection::Destroy(LDSection*& pSection) {
7822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  g_SectFactory->destroy(pSection);
7922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  g_SectFactory->deallocate(pSection);
8022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  pSection = NULL;
8122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
8222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
8337b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid LDSection::Clear() {
8422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  g_SectFactory->clear();
8522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
8622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
8737b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool LDSection::hasSectionData() const {
8822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  assert(LDFileFormat::Relocation != kind() && LDFileFormat::EhFrame != kind());
8937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  return (m_Data.sect_data != NULL);
9022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
9122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
9237b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool LDSection::hasRelocData() const {
9322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  assert(LDFileFormat::Relocation == kind());
9437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  return (m_Data.reloc_data != NULL);
9522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
9622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
9737b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool LDSection::hasEhFrame() const {
9822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  assert(LDFileFormat::EhFrame == kind());
9937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  return (m_Data.eh_frame != NULL);
1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
10237b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool LDSection::hasDebugString() const {
10337b74a387bb3993387029859c2d9d051c41c724eStephen Hines  assert(LDFileFormat::DebugString == kind());
10437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  return (NULL != m_Data.debug_string);
10537b74a387bb3993387029859c2d9d051c41c724eStephen Hines}
10637b74a387bb3993387029859c2d9d051c41c724eStephen Hines
10737b74a387bb3993387029859c2d9d051c41c724eStephen Hines}  // namespace mcld
108