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