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 //===----------------------------------------------------------------------===// 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 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 50 ELFSegment::~ELFSegment() 51 { 52 } 53 54 bool ELFSegment::isLoadSegment() const 55 { 56 return type() == llvm::ELF::PT_LOAD; 57 } 58 59 bool ELFSegment::isDataSegment() const 60 { 61 return (type() == llvm::ELF::PT_LOAD) && ((flag() & llvm::ELF::PF_W) != 0x0); 62 } 63 64 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 75 ELFSegment::iterator ELFSegment::insert(ELFSegment::iterator pPos, 76 LDSection* pSection) 77 { 78 return m_SectionList.insert(pPos, pSection); 79 } 80 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 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 96 void ELFSegment::Destroy(ELFSegment*& pSegment) 97 { 98 g_ELFSegmentFactory->destroy(pSegment); 99 g_ELFSegmentFactory->deallocate(pSegment); 100 pSegment = NULL; 101 } 102 103 void ELFSegment::Clear() 104 { 105 g_ELFSegmentFactory->clear(); 106 } 107