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 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 //===----------------------------------------------------------------------===// 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 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 59 LDSection::~LDSection() { 60 } 61 62 bool LDSection::hasOffset() const { 63 return (m_Offset != ~uint64_t(0)); 64 } 65 66 LDSection* 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 77 void LDSection::Destroy(LDSection*& pSection) { 78 g_SectFactory->destroy(pSection); 79 g_SectFactory->deallocate(pSection); 80 pSection = NULL; 81 } 82 83 void LDSection::Clear() { 84 g_SectFactory->clear(); 85 } 86 87 bool LDSection::hasSectionData() const { 88 assert(LDFileFormat::Relocation != kind() && LDFileFormat::EhFrame != kind()); 89 return (m_Data.sect_data != NULL); 90 } 91 92 bool LDSection::hasRelocData() const { 93 assert(LDFileFormat::Relocation == kind()); 94 return (m_Data.reloc_data != NULL); 95 } 96 97 bool LDSection::hasEhFrame() const { 98 assert(LDFileFormat::EhFrame == kind()); 99 return (m_Data.eh_frame != NULL); 100 } 101 102 bool LDSection::hasDebugString() const { 103 assert(LDFileFormat::DebugString == kind()); 104 return (NULL != m_Data.debug_string); 105 } 106 107 } // namespace mcld 108