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