• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===- ELFSegment.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/ELFSegment.h>
10 #include <mcld/LD/LDSection.h>
11 #include <mcld/Support/GCFactory.h>
12 #include <mcld/Config/Config.h>
13 #include <llvm/Support/ManagedStatic.h>
14 #include <cassert>
15 
16 using namespace mcld;
17 
18 typedef GCFactory<ELFSegment, MCLD_SEGMENTS_PER_OUTPUT> ELFSegmentFactory;
19 static llvm::ManagedStatic<ELFSegmentFactory> g_ELFSegmentFactory;
20 
21 //===----------------------------------------------------------------------===//
22 // ELFSegment
23 //===----------------------------------------------------------------------===//
ELFSegment()24 ELFSegment::ELFSegment()
25   : m_Type(llvm::ELF::PT_NULL),
26     m_Flag(llvm::ELF::PF_R),
27     m_Offset(0x0),
28     m_Vaddr(0x0),
29     m_Paddr(0x0),
30     m_Filesz(0x0),
31     m_Memsz(0x0),
32     m_Align(0x0),
33     m_MaxSectionAlign(0x0)
34 {
35 }
36 
ELFSegment(uint32_t pType,uint32_t pFlag)37 ELFSegment::ELFSegment(uint32_t pType, uint32_t pFlag)
38   : m_Type(pType),
39     m_Flag(pFlag),
40     m_Offset(0x0),
41     m_Vaddr(0x0),
42     m_Paddr(0x0),
43     m_Filesz(0x0),
44     m_Memsz(0x0),
45     m_Align(0x0),
46     m_MaxSectionAlign(0x0)
47 {
48 }
49 
~ELFSegment()50 ELFSegment::~ELFSegment()
51 {
52 }
53 
isLoadSegment() const54 bool ELFSegment::isLoadSegment() const
55 {
56   return type() == llvm::ELF::PT_LOAD;
57 }
58 
isDataSegment() const59 bool ELFSegment::isDataSegment() const
60 {
61   return (type() == llvm::ELF::PT_LOAD) && ((flag() & llvm::ELF::PF_W) != 0x0);
62 }
63 
isBssSegment() const64 bool ELFSegment::isBssSegment() const
65 {
66   if (!isDataSegment())
67     return false;
68   for (const_iterator it = begin(), ie = end(); it != ie; ++it) {
69     if ((*it)->kind() != LDFileFormat::BSS)
70       return false;
71   }
72   return true;
73 }
74 
insert(ELFSegment::iterator pPos,LDSection * pSection)75 ELFSegment::iterator ELFSegment::insert(ELFSegment::iterator pPos,
76                                         LDSection* pSection)
77 {
78   return m_SectionList.insert(pPos, pSection);
79 }
80 
append(LDSection * pSection)81 void ELFSegment::append(LDSection* pSection)
82 {
83   assert(NULL != pSection);
84   if (pSection->align() > m_MaxSectionAlign)
85     m_MaxSectionAlign = pSection->align();
86   m_SectionList.push_back(pSection);
87 }
88 
Create(uint32_t pType,uint32_t pFlag)89 ELFSegment* ELFSegment::Create(uint32_t pType, uint32_t pFlag)
90 {
91   ELFSegment* seg = g_ELFSegmentFactory->allocate();
92   new (seg) ELFSegment(pType, pFlag);
93   return seg;
94 }
95 
Destroy(ELFSegment * & pSegment)96 void ELFSegment::Destroy(ELFSegment*& pSegment)
97 {
98   g_ELFSegmentFactory->destroy(pSegment);
99   g_ELFSegmentFactory->deallocate(pSegment);
100   pSegment = NULL;
101 }
102 
Clear()103 void ELFSegment::Clear()
104 {
105   g_ELFSegmentFactory->clear();
106 }
107