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