15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- ELFSegment.h -------------------------------------------------------===// 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#ifndef MCLD_LD_ELFSEGMENT_H_ 1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#define MCLD_LD_ELFSEGMENT_H_ 1137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Config/Config.h" 1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/Allocators.h" 1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines 145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/Support/DataTypes.h> 1537b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include <llvm/Support/ELF.h> 1637b74a387bb3993387029859c2d9d051c41c724eStephen Hines 175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <vector> 185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1937b74a387bb3993387029859c2d9d051c41c724eStephen Hinesnamespace mcld { 205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2187f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass LDSection; 2287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/** \class ELFSegment 245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * \brief decribe the program header for ELF executable or shared object 255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */ 2637b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass ELFSegment { 2737b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 2887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef std::vector<LDSection*> SectionList; 2987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef SectionList::iterator iterator; 3087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef SectionList::const_iterator const_iterator; 3187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef SectionList::reverse_iterator reverse_iterator; 3287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef SectionList::const_reverse_iterator const_reverse_iterator; 3387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 3437b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 3587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines friend class Chunk<ELFSegment, MCLD_SEGMENTS_PER_OUTPUT>; 3687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines ELFSegment(); 3737b74a387bb3993387029859c2d9d051c41c724eStephen Hines explicit ELFSegment(uint32_t pType, uint32_t pFlag = llvm::ELF::PF_R); 3887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 3937b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ~ELFSegment(); 415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// ----- iterators ----- /// 4337b74a387bb3993387029859c2d9d051c41c724eStephen Hines iterator begin() { return m_SectionList.begin(); } 4487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const_iterator begin() const { return m_SectionList.begin(); } 4537b74a387bb3993387029859c2d9d051c41c724eStephen Hines iterator end() { return m_SectionList.end(); } 4637b74a387bb3993387029859c2d9d051c41c724eStephen Hines const_iterator end() const { return m_SectionList.end(); } 4787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 4837b74a387bb3993387029859c2d9d051c41c724eStephen Hines reverse_iterator rbegin() { return m_SectionList.rbegin(); } 4987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const_reverse_iterator rbegin() const { return m_SectionList.rbegin(); } 5037b74a387bb3993387029859c2d9d051c41c724eStephen Hines reverse_iterator rend() { return m_SectionList.rend(); } 5137b74a387bb3993387029859c2d9d051c41c724eStephen Hines const_reverse_iterator rend() const { return m_SectionList.rend(); } 525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 5337b74a387bb3993387029859c2d9d051c41c724eStephen Hines LDSection* front() { return m_SectionList.front(); } 5422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const LDSection* front() const { return m_SectionList.front(); } 5537b74a387bb3993387029859c2d9d051c41c724eStephen Hines LDSection* back() { return m_SectionList.back(); } 5637b74a387bb3993387029859c2d9d051c41c724eStephen Hines const LDSection* back() const { return m_SectionList.back(); } 575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// ----- observers ----- /// 5937b74a387bb3993387029859c2d9d051c41c724eStephen Hines uint32_t type() const { return m_Type; } 6087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines uint64_t offset() const { return m_Offset; } 6137b74a387bb3993387029859c2d9d051c41c724eStephen Hines uint64_t vaddr() const { return m_Vaddr; } 6237b74a387bb3993387029859c2d9d051c41c724eStephen Hines uint64_t paddr() const { return m_Paddr; } 6387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines uint64_t filesz() const { return m_Filesz; } 6437b74a387bb3993387029859c2d9d051c41c724eStephen Hines uint64_t memsz() const { return m_Memsz; } 6537b74a387bb3993387029859c2d9d051c41c724eStephen Hines uint32_t flag() const { return m_Flag; } 6637b74a387bb3993387029859c2d9d051c41c724eStephen Hines uint64_t align() const { return std::max(m_Align, m_MaxSectionAlign); } 6787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 6887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines size_t size() const { return m_SectionList.size(); } 6937b74a387bb3993387029859c2d9d051c41c724eStephen Hines bool empty() const { return m_SectionList.empty(); } 7087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 7187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines bool isLoadSegment() const; 7222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao bool isDataSegment() const; 7322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao bool isBssSegment() const; 7422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// ----- modifiers ----- /// 7637b74a387bb3993387029859c2d9d051c41c724eStephen Hines void setOffset(uint64_t pOffset) { m_Offset = pOffset; } 775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 7837b74a387bb3993387029859c2d9d051c41c724eStephen Hines void setVaddr(uint64_t pVaddr) { m_Vaddr = pVaddr; } 795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 8037b74a387bb3993387029859c2d9d051c41c724eStephen Hines void setPaddr(uint64_t pPaddr) { m_Paddr = pPaddr; } 815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 8237b74a387bb3993387029859c2d9d051c41c724eStephen Hines void setFilesz(uint64_t pFilesz) { m_Filesz = pFilesz; } 835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 8437b74a387bb3993387029859c2d9d051c41c724eStephen Hines void setMemsz(uint64_t pMemsz) { m_Memsz = pMemsz; } 855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 8637b74a387bb3993387029859c2d9d051c41c724eStephen Hines void setFlag(uint32_t pFlag) { m_Flag = pFlag; } 875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 8837b74a387bb3993387029859c2d9d051c41c724eStephen Hines void updateFlag(uint32_t pFlag) { 895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // PT_TLS segment should be PF_R 905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (llvm::ELF::PT_TLS != m_Type) 915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_Flag |= pFlag; 925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 9437b74a387bb3993387029859c2d9d051c41c724eStephen Hines void setAlign(uint64_t pAlign) { m_Align = pAlign; } 955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 9687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines iterator insert(iterator pPos, LDSection* pSection); 9787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 9887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void append(LDSection* pSection); 9987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 10087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /* factory methods */ 10187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines static ELFSegment* Create(uint32_t pType, uint32_t pFlag = llvm::ELF::PF_R); 10287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines static void Destroy(ELFSegment*& pSegment); 10387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines static void Clear(); 1045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 10537b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 10637b74a387bb3993387029859c2d9d051c41c724eStephen Hines uint32_t m_Type; // Type of segment 10737b74a387bb3993387029859c2d9d051c41c724eStephen Hines uint32_t m_Flag; // Segment flags 10837b74a387bb3993387029859c2d9d051c41c724eStephen Hines uint64_t m_Offset; // File offset where segment is located, in bytes 10937b74a387bb3993387029859c2d9d051c41c724eStephen Hines uint64_t m_Vaddr; // Virtual address of the segment 11037b74a387bb3993387029859c2d9d051c41c724eStephen Hines uint64_t m_Paddr; // Physical address of the segment (OS-specific) 11137b74a387bb3993387029859c2d9d051c41c724eStephen Hines uint64_t m_Filesz; // # of bytes in file image of segment (may be 0) 11237b74a387bb3993387029859c2d9d051c41c724eStephen Hines uint64_t m_Memsz; // # of bytes in mem image of segment (may be 0) 11337b74a387bb3993387029859c2d9d051c41c724eStephen Hines uint64_t m_Align; // alignment constraint 11437b74a387bb3993387029859c2d9d051c41c724eStephen Hines uint64_t m_MaxSectionAlign; // max alignment of the sections in this segment 11587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines SectionList m_SectionList; 1165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 1175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 11837b74a387bb3993387029859c2d9d051c41c724eStephen Hines} // namespace mcld 119affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 12037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#endif // MCLD_LD_ELFSEGMENT_H_ 121