1//===- LDSection.cpp ------------------------------------------------------===//
2//
3//                     The MCLinker Project
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9#include "mcld/LD/LDSection.h"
10
11#include "mcld/Support/GCFactory.h"
12
13#include <llvm/Support/ManagedStatic.h>
14
15namespace mcld {
16
17typedef GCFactory<LDSection, MCLD_SECTIONS_PER_INPUT> SectionFactory;
18
19static llvm::ManagedStatic<SectionFactory> g_SectFactory;
20
21//===----------------------------------------------------------------------===//
22// LDSection
23//===----------------------------------------------------------------------===//
24LDSection::LDSection()
25    : m_Name(),
26      m_Kind(LDFileFormat::Ignore),
27      m_Type(0x0),
28      m_Flag(0x0),
29      m_Size(0),
30      m_Offset(~uint64_t(0)),
31      m_Addr(0x0),
32      m_Align(0),
33      m_Info(0),
34      m_pLink(NULL),
35      m_Index(0) {
36  m_Data.sect_data = NULL;
37}
38
39LDSection::LDSection(const std::string& pName,
40                     LDFileFormat::Kind pKind,
41                     uint32_t pType,
42                     uint32_t pFlag,
43                     uint64_t pSize,
44                     uint64_t pAddr)
45    : m_Name(pName),
46      m_Kind(pKind),
47      m_Type(pType),
48      m_Flag(pFlag),
49      m_Size(pSize),
50      m_Offset(~uint64_t(0)),
51      m_Addr(pAddr),
52      m_Align(0),
53      m_Info(0),
54      m_pLink(NULL),
55      m_Index(0) {
56  m_Data.sect_data = NULL;
57}
58
59LDSection::~LDSection() {
60}
61
62bool LDSection::hasOffset() const {
63  return (m_Offset != ~uint64_t(0));
64}
65
66LDSection* LDSection::Create(const std::string& pName,
67                             LDFileFormat::Kind pKind,
68                             uint32_t pType,
69                             uint32_t pFlag,
70                             uint64_t pSize,
71                             uint64_t pAddr) {
72  LDSection* result = g_SectFactory->allocate();
73  new (result) LDSection(pName, pKind, pType, pFlag, pSize, pAddr);
74  return result;
75}
76
77void LDSection::Destroy(LDSection*& pSection) {
78  g_SectFactory->destroy(pSection);
79  g_SectFactory->deallocate(pSection);
80  pSection = NULL;
81}
82
83void LDSection::Clear() {
84  g_SectFactory->clear();
85}
86
87bool LDSection::hasSectionData() const {
88  assert(LDFileFormat::Relocation != kind() && LDFileFormat::EhFrame != kind());
89  return (m_Data.sect_data != NULL);
90}
91
92bool LDSection::hasRelocData() const {
93  assert(LDFileFormat::Relocation == kind());
94  return (m_Data.reloc_data != NULL);
95}
96
97bool LDSection::hasEhFrame() const {
98  assert(LDFileFormat::EhFrame == kind());
99  return (m_Data.eh_frame != NULL);
100}
101
102bool LDSection::hasDebugString() const {
103  assert(LDFileFormat::DebugString == kind());
104  return (NULL != m_Data.debug_string);
105}
106
107}  // namespace mcld
108