• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===- LDSection.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 
10 #ifndef MCLD_LD_LDSECTION_H
11 #define MCLD_LD_LDSECTION_H
12 #ifdef ENABLE_UNITTEST
13 #include <gtest.h>
14 #endif
15 
16 #include <llvm/ADT/StringRef.h>
17 #include <llvm/Support/DataTypes.h>
18 #include <mcld/LD/LDFileFormat.h>
19 #include <string>
20 
21 namespace mcld {
22 
23 class SectionData;
24 
25 /** \class LDSection
26  *  \brief LDSection represents a section header entry. It is a unified
27  *  abstraction of a section header entry for various file formats.
28  */
29 class LDSection
30 {
31 public:
32   LDSection(const std::string& pName,
33             LDFileFormat::Kind pKind,
34             uint32_t pType,
35             uint32_t pFlag,
36             uint64_t pSize = 0,
37             uint64_t pOffset = 0,
38             uint64_t pAddr = 0);
39 
40   /// name - the name of this section.
name()41   const std::string& name() const
42   { return m_Name; }
43 
44   /// kind - the kind of this section, such as Text, BSS, GOT, and so on.
45   /// from LDFileFormat::Kind
kind()46   LDFileFormat::Kind kind() const
47   { return m_Kind; }
48 
49   /// type - The categorizes the section's contents and semantics. It's
50   /// different from llvm::SectionKind. Type is format-dependent, but
51   /// llvm::SectionKind is format independent and is used for bit-code.
52   ///   In ELF, it is sh_type
53   ///   In MachO, it's type field of struct section::flags
type()54   uint32_t type() const
55   { return m_Type; }
56 
57   /// flag - An integer describes miscellaneous attributes.
58   ///   In ELF, it is sh_flags.
59   ///   In MachO, it's attribute field of struct section::flags
flag()60   uint32_t flag() const
61   { return m_Flag; }
62 
63   /// size - An integer specifying the size in bytes of the virtual memory
64   /// occupied by this section.
65   ///   In ELF, if the type() is SHT_NOBITS, this function return zero.
66   ///   Before layouting, output's LDSection::size() should return zero.
size()67   uint64_t size() const
68   { return m_Size; }
69 
70   /// offset - An integer specifying the offset of this section in the file.
71   ///   Before layouting, output's LDSection::offset() should return zero.
offset()72   uint64_t offset() const
73   { return m_Offset; }
74 
75   /// addr - An integer specifying the virtual address of this section in the
76   /// virtual image.
77   ///   Before layouting, output's LDSection::offset() should return zero.
78   ///   ELF uses sh_addralign to set alignment constraints. In LLVM, alignment
79   ///   constraint is set in SectionData::setAlignment. addr() contains the
80   ///   original ELF::sh_addr. Modulo sh_addr by sh_addralign is not necessary.
81   ///   MachO uses the same scenario.
82   ///
83   ///   Because addr() in output is changing during linking, MCLinker does not
84   ///   store the address of the output here. The address is in Layout
addr()85   uint64_t addr() const
86   { return m_Addr; }
87 
88   /// align - An integer specifying the align of this section in the file.
89   ///   Before layouting, output's LDSection::align() should return zero.
align()90   uint32_t align() const
91   { return m_Align; }
92 
index()93   size_t index() const
94   { return m_Index; }
95 
96   /// getLink - return the Link. When a section A needs the other section B
97   /// during linking or loading, we say B is A's Link section.
98   /// In ELF, InfoLink section control the ElfNN_Shdr::sh_link and sh_info.
99   ///
100   /// @return if the section needs no other sections, return NULL
getLink()101   LDSection* getLink()
102   { return m_pLink; }
103 
getLink()104   const LDSection* getLink() const
105   { return m_pLink; }
106 
getInfo()107   size_t getInfo() const
108   { return m_Info; }
109 
setKind(LDFileFormat::Kind pKind)110   void setKind(LDFileFormat::Kind pKind)
111   { m_Kind = pKind; }
112 
setSize(uint64_t size)113   void setSize(uint64_t size)
114   { m_Size = size; }
115 
setOffset(uint64_t Offset)116   void setOffset(uint64_t Offset)
117   { m_Offset = Offset; }
118 
setAddr(uint64_t addr)119   void setAddr(uint64_t addr)
120   { m_Addr = addr; }
121 
setAlign(uint32_t align)122   void setAlign(uint32_t align)
123   { m_Align = align; }
124 
setFlag(uint32_t flag)125   void setFlag(uint32_t flag)
126   { m_Flag = flag; }
127 
setType(uint32_t type)128   void setType(uint32_t type)
129   { m_Type = type; }
130 
getSectionData()131   SectionData* getSectionData()
132   { return m_pSectionData; }
133 
getSectionData()134   const SectionData* getSectionData() const
135   { return m_pSectionData; }
136 
setSectionData(SectionData * pSD)137   void setSectionData(SectionData* pSD)
138   { m_pSectionData = pSD; }
139 
hasSectionData()140   bool hasSectionData() const
141   { return (NULL != m_pSectionData); }
142 
143   /// setLink - set the sections should link with.
144   /// if pLink is NULL, no Link section is set.
setLink(LDSection * pLink)145   void setLink(LDSection* pLink)
146   { m_pLink = pLink; }
147 
setInfo(size_t pInfo)148   void setInfo(size_t pInfo)
149   { m_Info = pInfo; }
150 
setIndex(size_t pIndex)151   void setIndex(size_t pIndex)
152   { m_Index = pIndex; }
153 
154 private:
155   std::string m_Name;
156   LDFileFormat::Kind m_Kind;
157   uint32_t m_Type;
158   uint32_t m_Flag;
159 
160   uint64_t m_Size;
161   uint64_t m_Offset;
162   uint64_t m_Addr;
163   uint32_t m_Align;
164 
165   size_t m_Info;
166   LDSection* m_pLink;
167 
168   SectionData* m_pSectionData;
169 
170   // the index of the file
171   size_t m_Index;
172 
173 }; // end of LDSection
174 
175 } // end namespace mcld
176 
177 #endif
178 
179