15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- ELFSegment.cpp -----------------------------------------------------===//
25460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
35460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//                     The MCLinker Project
45460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
55460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// This file is distributed under the University of Illinois Open Source
65460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// License. See LICENSE.TXT for details.
75460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
85460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===//
937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/ELFSegment.h"
1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines
1137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Config/Config.h"
1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/LDSection.h"
1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/GCFactory.h"
1437b74a387bb3993387029859c2d9d051c41c724eStephen Hines
15f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <llvm/Support/ManagedStatic.h>
1637b74a387bb3993387029859c2d9d051c41c724eStephen Hines
17f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <cassert>
185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1937b74a387bb3993387029859c2d9d051c41c724eStephen Hinesnamespace mcld {
205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
21f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestypedef GCFactory<ELFSegment, MCLD_SEGMENTS_PER_OUTPUT> ELFSegmentFactory;
22f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinesstatic llvm::ManagedStatic<ELFSegmentFactory> g_ELFSegmentFactory;
23f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
24f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===----------------------------------------------------------------------===//
255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// ELFSegment
26f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===----------------------------------------------------------------------===//
27f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesELFSegment::ELFSegment()
2837b74a387bb3993387029859c2d9d051c41c724eStephen Hines    : m_Type(llvm::ELF::PT_NULL),
2937b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_Flag(llvm::ELF::PF_R),
3037b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_Offset(0x0),
3137b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_Vaddr(0x0),
3237b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_Paddr(0x0),
3337b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_Filesz(0x0),
3437b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_Memsz(0x0),
3537b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_Align(0x0),
3637b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_MaxSectionAlign(0x0) {
37f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
38f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
39f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesELFSegment::ELFSegment(uint32_t pType, uint32_t pFlag)
4037b74a387bb3993387029859c2d9d051c41c724eStephen Hines    : m_Type(pType),
4137b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_Flag(pFlag),
4237b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_Offset(0x0),
4337b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_Vaddr(0x0),
4437b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_Paddr(0x0),
4537b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_Filesz(0x0),
4637b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_Memsz(0x0),
4737b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_Align(0x0),
4837b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_MaxSectionAlign(0x0) {
495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
5137b74a387bb3993387029859c2d9d051c41c724eStephen HinesELFSegment::~ELFSegment() {
525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
5322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
5437b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool ELFSegment::isLoadSegment() const {
55f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return type() == llvm::ELF::PT_LOAD;
56f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
57f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
5837b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool ELFSegment::isDataSegment() const {
59f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return (type() == llvm::ELF::PT_LOAD) && ((flag() & llvm::ELF::PF_W) != 0x0);
6022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
6122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
6237b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool ELFSegment::isBssSegment() const {
63f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  if (!isDataSegment())
64f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    return false;
65f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  for (const_iterator it = begin(), ie = end(); it != ie; ++it) {
66f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    if ((*it)->kind() != LDFileFormat::BSS)
67f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines      return false;
6822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  }
69f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return true;
7022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
7122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
72f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesELFSegment::iterator ELFSegment::insert(ELFSegment::iterator pPos,
7337b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                        LDSection* pSection) {
74f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return m_SectionList.insert(pPos, pSection);
75f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
76f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
7737b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid ELFSegment::append(LDSection* pSection) {
7837b74a387bb3993387029859c2d9d051c41c724eStephen Hines  assert(pSection != NULL);
79f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  if (pSection->align() > m_MaxSectionAlign)
80f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    m_MaxSectionAlign = pSection->align();
81f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  m_SectionList.push_back(pSection);
82f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
83f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
8437b74a387bb3993387029859c2d9d051c41c724eStephen HinesELFSegment* ELFSegment::Create(uint32_t pType, uint32_t pFlag) {
85f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  ELFSegment* seg = g_ELFSegmentFactory->allocate();
86f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  new (seg) ELFSegment(pType, pFlag);
87f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return seg;
88f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
89f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
9037b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid ELFSegment::Destroy(ELFSegment*& pSegment) {
91f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  g_ELFSegmentFactory->destroy(pSegment);
92f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  g_ELFSegmentFactory->deallocate(pSegment);
93f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  pSegment = NULL;
94f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
95f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
9637b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid ELFSegment::Clear() {
97f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  g_ELFSegmentFactory->clear();
98f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
9937b74a387bb3993387029859c2d9d051c41c724eStephen Hines
10037b74a387bb3993387029859c2d9d051c41c724eStephen Hines}  // namespace mcld
101