15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- LDSection.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/LDSection.h" 105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/GCFactory.h" 1222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 1322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <llvm/Support/ManagedStatic.h> 1422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 1537b74a387bb3993387029859c2d9d051c41c724eStephen Hinesnamespace mcld { 165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaotypedef GCFactory<LDSection, MCLD_SECTIONS_PER_INPUT> SectionFactory; 1822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 1922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaostatic llvm::ManagedStatic<SectionFactory> g_SectFactory; 2022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 2122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 2222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// LDSection 2322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 2422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoLDSection::LDSection() 2537b74a387bb3993387029859c2d9d051c41c724eStephen Hines : m_Name(), 2637b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_Kind(LDFileFormat::Ignore), 2737b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_Type(0x0), 2837b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_Flag(0x0), 2937b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_Size(0), 3037b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_Offset(~uint64_t(0)), 3137b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_Addr(0x0), 3237b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_Align(0), 3337b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_Info(0), 3437b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_pLink(NULL), 3537b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_Index(0) { 3622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_Data.sect_data = NULL; 3722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 3822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoLDSection::LDSection(const std::string& pName, 405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao LDFileFormat::Kind pKind, 415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint32_t pType, 425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint32_t pFlag, 435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint64_t pSize, 445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint64_t pAddr) 4537b74a387bb3993387029859c2d9d051c41c724eStephen Hines : m_Name(pName), 4637b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_Kind(pKind), 4737b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_Type(pType), 4837b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_Flag(pFlag), 4937b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_Size(pSize), 5037b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_Offset(~uint64_t(0)), 5137b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_Addr(pAddr), 5237b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_Align(0), 5337b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_Info(0), 5437b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_pLink(NULL), 5537b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_Index(0) { 5622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_Data.sect_data = NULL; 5722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 5822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 5937b74a387bb3993387029859c2d9d051c41c724eStephen HinesLDSection::~LDSection() { 6022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 6122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 6237b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool LDSection::hasOffset() const { 6322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return (m_Offset != ~uint64_t(0)); 6422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 6522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 6622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoLDSection* LDSection::Create(const std::string& pName, 6722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao LDFileFormat::Kind pKind, 6822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao uint32_t pType, 6922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao uint32_t pFlag, 7022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao uint64_t pSize, 7137b74a387bb3993387029859c2d9d051c41c724eStephen Hines uint64_t pAddr) { 7222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao LDSection* result = g_SectFactory->allocate(); 7322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao new (result) LDSection(pName, pKind, pType, pFlag, pSize, pAddr); 7422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return result; 7522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 7622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 7737b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid LDSection::Destroy(LDSection*& pSection) { 7822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao g_SectFactory->destroy(pSection); 7922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao g_SectFactory->deallocate(pSection); 8022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao pSection = NULL; 8122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 8222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 8337b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid LDSection::Clear() { 8422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao g_SectFactory->clear(); 8522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 8622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 8737b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool LDSection::hasSectionData() const { 8822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao assert(LDFileFormat::Relocation != kind() && LDFileFormat::EhFrame != kind()); 8937b74a387bb3993387029859c2d9d051c41c724eStephen Hines return (m_Data.sect_data != NULL); 9022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 9122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 9237b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool LDSection::hasRelocData() const { 9322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao assert(LDFileFormat::Relocation == kind()); 9437b74a387bb3993387029859c2d9d051c41c724eStephen Hines return (m_Data.reloc_data != NULL); 9522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 9622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 9737b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool LDSection::hasEhFrame() const { 9822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao assert(LDFileFormat::EhFrame == kind()); 9937b74a387bb3993387029859c2d9d051c41c724eStephen Hines return (m_Data.eh_frame != NULL); 1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 10237b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool LDSection::hasDebugString() const { 10337b74a387bb3993387029859c2d9d051c41c724eStephen Hines assert(LDFileFormat::DebugString == kind()); 10437b74a387bb3993387029859c2d9d051c41c724eStephen Hines return (NULL != m_Data.debug_string); 10537b74a387bb3993387029859c2d9d051c41c724eStephen Hines} 10637b74a387bb3993387029859c2d9d051c41c724eStephen Hines 10737b74a387bb3993387029859c2d9d051c41c724eStephen Hines} // namespace mcld 108