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 15using namespace mcld; 16 17typedef GCFactory<LDSection, MCLD_SECTIONS_PER_INPUT> SectionFactory; 18 19static llvm::ManagedStatic<SectionFactory> g_SectFactory; 20 21//===----------------------------------------------------------------------===// 22// LDSection 23//===----------------------------------------------------------------------===// 24LDSection::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 39LDSection::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 59LDSection::~LDSection() 60{ 61} 62 63bool LDSection::hasOffset() const 64{ 65 return (m_Offset != ~uint64_t(0)); 66} 67 68LDSection* 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 80void LDSection::Destroy(LDSection*& pSection) 81{ 82 g_SectFactory->destroy(pSection); 83 g_SectFactory->deallocate(pSection); 84 pSection = NULL; 85} 86 87void LDSection::Clear() 88{ 89 g_SectFactory->clear(); 90} 91 92bool LDSection::hasSectionData() const 93{ 94 assert(LDFileFormat::Relocation != kind() && LDFileFormat::EhFrame != kind()); 95 return (NULL != m_Data.sect_data); 96} 97 98bool LDSection::hasRelocData() const 99{ 100 assert(LDFileFormat::Relocation == kind()); 101 return (NULL != m_Data.reloc_data); 102} 103 104bool LDSection::hasEhFrame() const 105{ 106 assert(LDFileFormat::EhFrame == kind()); 107 return (NULL != m_Data.eh_frame); 108} 109 110