Home | History | Annotate | Download | only in LD
      1 //===- ELFSegment.h -------------------------------------------------------===//
      2 //
      3 //                     The MCLinker Project
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 #ifndef MCLD_ELF_SEGMENT_H
     10 #define MCLD_ELF_SEGMENT_H
     11 #ifdef ENABLE_UNITTEST
     12 #include <gtest.h>
     13 #endif
     14 #include <llvm/Support/ELF.h>
     15 #include <llvm/Support/DataTypes.h>
     16 #include <mcld/LD/LDSection.h>
     17 #include <cassert>
     18 #include <vector>
     19 
     20 namespace mcld
     21 {
     22 
     23 /** \class ELFSegment
     24  *  \brief decribe the program header for ELF executable or shared object
     25  */
     26 class ELFSegment
     27 {
     28 public:
     29   typedef std::vector<LDSection*>::iterator sect_iterator;
     30   typedef std::vector<LDSection*>::const_iterator const_sect_iterator;
     31 public:
     32   ELFSegment(uint32_t pType,
     33              uint32_t pFlag = llvm::ELF::PF_R,
     34              uint64_t pOffset = 0,
     35              uint64_t pVaddr = 0,
     36              uint64_t pPaddr = 0,
     37              uint64_t pFilesz = 0,
     38              uint64_t pMemsz = 0,
     39              uint64_t pAlign = 0,
     40              uint64_t pMaxSectAlign = 0);
     41   ~ELFSegment();
     42 
     43   ///  -----  iterators  -----  ///
     44   sect_iterator       begin()       { return m_SectionList.begin(); }
     45   const_sect_iterator begin() const { return m_SectionList.begin(); }
     46   sect_iterator       end()         { return m_SectionList.end(); }
     47   const_sect_iterator end()   const { return m_SectionList.end(); }
     48 
     49   LDSection*       front()       { return m_SectionList.front(); }
     50   const LDSection* front() const { return m_SectionList.front(); }
     51   LDSection*       back()        { return m_SectionList.back(); }
     52   const LDSection* back()  const { return m_SectionList.back(); }
     53 
     54   ///  -----  observers  -----  ///
     55   uint32_t type() const
     56   { return m_Type; }
     57 
     58   uint64_t offset() const
     59   { return m_Offset; }
     60 
     61   uint64_t vaddr() const
     62   { return m_Vaddr; }
     63 
     64   uint64_t paddr() const
     65   { return m_Paddr; }
     66 
     67   uint64_t filesz() const
     68   { return m_Filesz; }
     69 
     70   uint64_t memsz() const
     71   { return m_Memsz; }
     72 
     73   uint32_t flag() const
     74   { return m_Flag; }
     75 
     76   uint64_t align() const
     77   { return std::max(m_Align, m_MaxSectionAlign); }
     78 
     79   size_t numOfSections() const
     80   { return m_SectionList.size(); }
     81 
     82   bool isDataSegment() const;
     83 
     84   bool isBssSegment() const;
     85 
     86   ///  -----  modifiers  -----  ///
     87   void setOffset(uint64_t pOffset)
     88   { m_Offset = pOffset; }
     89 
     90   void setVaddr(uint64_t pVaddr)
     91   { m_Vaddr = pVaddr; }
     92 
     93   void setPaddr(uint64_t pPaddr)
     94   { m_Paddr = pPaddr; }
     95 
     96   void setFilesz(uint64_t pFilesz)
     97   { m_Filesz = pFilesz; }
     98 
     99   void setMemsz(uint64_t pMemsz)
    100   { m_Memsz = pMemsz; }
    101 
    102   void setFlag(uint32_t pFlag)
    103   { m_Flag = pFlag; }
    104 
    105   void updateFlag(uint32_t pFlag)
    106   {
    107     // PT_TLS segment should be PF_R
    108     if (llvm::ELF::PT_TLS != m_Type)
    109       m_Flag |= pFlag;
    110   }
    111 
    112   void setAlign(uint64_t pAlign)
    113   { m_Align = pAlign; }
    114 
    115   void addSection(LDSection* pSection)
    116   {
    117     assert(NULL != pSection);
    118     if (pSection->align() > m_MaxSectionAlign)
    119       m_MaxSectionAlign = pSection->align();
    120     m_SectionList.push_back(pSection);
    121   }
    122 
    123 private:
    124   uint32_t m_Type;            // Type of segment
    125   uint32_t m_Flag;            // Segment flags
    126   uint64_t m_Offset;          // File offset where segment is located, in bytes
    127   uint64_t m_Vaddr;           // Virtual address of the segment
    128   uint64_t m_Paddr;           // Physical address of the segment (OS-specific)
    129   uint64_t m_Filesz;          // # of bytes in file image of segment (may be 0)
    130   uint64_t m_Memsz;           // # of bytes in mem image of segment (may be 0)
    131   uint64_t m_Align;           // alignment constraint
    132   uint64_t m_MaxSectionAlign; // max alignment of the sections in this segment
    133   std::vector<LDSection*> m_SectionList;
    134 };
    135 
    136 } // namespace of mcld
    137 
    138 #endif
    139 
    140