//===- 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>

using namespace mcld;

//==========================
// ELFSegment
ELFSegment::ELFSegment(uint32_t pType,
                       uint32_t pFlag,
                       uint64_t pOffset,
                       uint64_t pVaddr,
                       uint64_t pPaddr,
                       uint64_t pFilesz,
                       uint64_t pMemsz,
                       uint64_t pAlign,
                       uint64_t pMaxSectAlign)
  : m_Type(pType),
    m_Flag(pFlag),
    m_Offset(pOffset),
    m_Vaddr(pVaddr),
    m_Paddr(pPaddr),
    m_Filesz(pFilesz),
    m_Memsz(pMemsz),
    m_Align(pAlign),
    m_MaxSectionAlign(pMaxSectAlign) {
}

ELFSegment::~ELFSegment()
{
}

bool ELFSegment::isDataSegment() const
{
  bool result = false;
  if ((type() == llvm::ELF::PT_LOAD) && (flag() & llvm::ELF::PF_W) != 0x0) {
    for (const_sect_iterator it = begin(), ie = end(); it != ie; ++it) {
      if ((*it)->kind() != LDFileFormat::BSS) {
        result = true;
        break;
      }
    }
  }
  return result;
}

bool ELFSegment::isBssSegment() const
{
  bool result = false;
  if ((type() == llvm::ELF::PT_LOAD) && (flag() & llvm::ELF::PF_W) != 0x0) {
    const_sect_iterator it = begin(), ie = end();
    for (; it != ie; ++it) {
      if ((*it)->kind() != LDFileFormat::BSS)
        break;
    }
    if (it == ie)
      result = true;
  }
  return result;
}