Home | History | Annotate | Download | only in LD
      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