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