C++程序  |  107行  |  2.51 KB

//===- ELFSegment.cpp -----------------------------------------------------===//
//
//                     The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include <mcld/LD/ELFSegment.h>
#include <mcld/LD/LDSection.h>
#include <mcld/Support/GCFactory.h>
#include <mcld/Config/Config.h>
#include <llvm/Support/ManagedStatic.h>
#include <cassert>

using namespace mcld;

typedef GCFactory<ELFSegment, MCLD_SEGMENTS_PER_OUTPUT> ELFSegmentFactory;
static llvm::ManagedStatic<ELFSegmentFactory> g_ELFSegmentFactory;

//===----------------------------------------------------------------------===//
// ELFSegment
//===----------------------------------------------------------------------===//
ELFSegment::ELFSegment()
  : m_Type(llvm::ELF::PT_NULL),
    m_Flag(llvm::ELF::PF_R),
    m_Offset(0x0),
    m_Vaddr(0x0),
    m_Paddr(0x0),
    m_Filesz(0x0),
    m_Memsz(0x0),
    m_Align(0x0),
    m_MaxSectionAlign(0x0)
{
}

ELFSegment::ELFSegment(uint32_t pType, uint32_t pFlag)
  : m_Type(pType),
    m_Flag(pFlag),
    m_Offset(0x0),
    m_Vaddr(0x0),
    m_Paddr(0x0),
    m_Filesz(0x0),
    m_Memsz(0x0),
    m_Align(0x0),
    m_MaxSectionAlign(0x0)
{
}

ELFSegment::~ELFSegment()
{
}

bool ELFSegment::isLoadSegment() const
{
  return type() == llvm::ELF::PT_LOAD;
}

bool ELFSegment::isDataSegment() const
{
  return (type() == llvm::ELF::PT_LOAD) && ((flag() & llvm::ELF::PF_W) != 0x0);
}

bool ELFSegment::isBssSegment() const
{
  if (!isDataSegment())
    return false;
  for (const_iterator it = begin(), ie = end(); it != ie; ++it) {
    if ((*it)->kind() != LDFileFormat::BSS)
      return false;
  }
  return true;
}

ELFSegment::iterator ELFSegment::insert(ELFSegment::iterator pPos,
                                        LDSection* pSection)
{
  return m_SectionList.insert(pPos, pSection);
}

void ELFSegment::append(LDSection* pSection)
{
  assert(NULL != pSection);
  if (pSection->align() > m_MaxSectionAlign)
    m_MaxSectionAlign = pSection->align();
  m_SectionList.push_back(pSection);
}

ELFSegment* ELFSegment::Create(uint32_t pType, uint32_t pFlag)
{
  ELFSegment* seg = g_ELFSegmentFactory->allocate();
  new (seg) ELFSegment(pType, pFlag);
  return seg;
}

void ELFSegment::Destroy(ELFSegment*& pSegment)
{
  g_ELFSegmentFactory->destroy(pSegment);
  g_ELFSegmentFactory->deallocate(pSegment);
  pSegment = NULL;
}

void ELFSegment::Clear()
{
  g_ELFSegmentFactory->clear();
}