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
15 using namespace mcld;
16
17 typedef GCFactory<LDSection, MCLD_SECTIONS_PER_INPUT> SectionFactory;
18
19 static llvm::ManagedStatic<SectionFactory> g_SectFactory;
20
21 //===----------------------------------------------------------------------===//
22 // LDSection
23 //===----------------------------------------------------------------------===//
LDSection()24 LDSection::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
LDSection(const std::string & pName,LDFileFormat::Kind pKind,uint32_t pType,uint32_t pFlag,uint64_t pSize,uint64_t pAddr)39 LDSection::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
~LDSection()59 LDSection::~LDSection()
60 {
61 }
62
hasOffset() const63 bool LDSection::hasOffset() const
64 {
65 return (m_Offset != ~uint64_t(0));
66 }
67
Create(const std::string & pName,LDFileFormat::Kind pKind,uint32_t pType,uint32_t pFlag,uint64_t pSize,uint64_t pAddr)68 LDSection* LDSection::Create(const std::string& pName,
69 LDFileFormat::Kind pKind,
70 uint32_t pType,
71 uint32_t pFlag,
72 uint64_t pSize,
73 uint64_t pAddr)
74 {
75 LDSection* result = g_SectFactory->allocate();
76 new (result) LDSection(pName, pKind, pType, pFlag, pSize, pAddr);
77 return result;
78 }
79
Destroy(LDSection * & pSection)80 void LDSection::Destroy(LDSection*& pSection)
81 {
82 g_SectFactory->destroy(pSection);
83 g_SectFactory->deallocate(pSection);
84 pSection = NULL;
85 }
86
Clear()87 void LDSection::Clear()
88 {
89 g_SectFactory->clear();
90 }
91
hasSectionData() const92 bool LDSection::hasSectionData() const
93 {
94 assert(LDFileFormat::Relocation != kind() && LDFileFormat::EhFrame != kind());
95 return (NULL != m_Data.sect_data);
96 }
97
hasRelocData() const98 bool LDSection::hasRelocData() const
99 {
100 assert(LDFileFormat::Relocation == kind());
101 return (NULL != m_Data.reloc_data);
102 }
103
hasEhFrame() const104 bool LDSection::hasEhFrame() const
105 {
106 assert(LDFileFormat::EhFrame == kind());
107 return (NULL != m_Data.eh_frame);
108 }
109
110