LDSection.h revision cedee4b38f4786845183be7f5916dd520a170ae0
190e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang//===- LDSection.h --------------------------------------------------------===//
290e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang//
390e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang//                     The MCLinker Project
490e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang//
590e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang// This file is distributed under the University of Illinois Open Source
690e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang// License. See LICENSE.TXT for details.
790e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang//
890e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang//===----------------------------------------------------------------------===//
990e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang
1090e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang#ifndef MCLD_LD_LDSECTION_H
1190e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang#define MCLD_LD_LDSECTION_H
1290e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang#ifdef ENABLE_UNITTEST
1390e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang#include <gtest.h>
1490e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang#endif
1590e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang
1690e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang#include <llvm/ADT/StringRef.h>
1790e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang#include <llvm/Support/DataTypes.h>
1890e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang#include <mcld/LD/LDFileFormat.h>
19d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu#include <string>
2090e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang
2190e1c782a63475cd9b3973936decf6a4f6c6148fXia Wangnamespace mcld {
22d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu
2390e1c782a63475cd9b3973936decf6a4f6c6148fXia Wangclass SectionData;
2490e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang
256346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim/** \class LDSection
2690e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang *  \brief LDSection represents a section header entry. It is a unified
27d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu *  abstraction of a section header entry for various file formats.
2890e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang */
2990e1c782a63475cd9b3973936decf6a4f6c6148fXia Wangclass LDSection
30df362d264c5a0204f27da6ee66d741031626c4e5Xia Wang{
3190e1c782a63475cd9b3973936decf6a4f6c6148fXia Wangpublic:
3290e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  LDSection(const std::string& pName,
3390e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang            LDFileFormat::Kind pKind,
3490e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang            uint32_t pType,
354dfa295ad8b75a8c0976e7de078ebe4f654a6a89Brett Chabot            uint32_t pFlag,
3619306af73a8175e1327101132e26a35c7dfe5168Xia Wang            uint64_t pSize = 0,
372591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe            uint64_t pOffset = 0,
384dfa295ad8b75a8c0976e7de078ebe4f654a6a89Brett Chabot            uint64_t pAddr = 0);
3990e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang
4090e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  /// name - the name of this section.
4190e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  const std::string& name() const
4290e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  { return m_Name; }
4390e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang
4490e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  /// kind - the kind of this section, such as Text, BSS, GOT, and so on.
4590e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  /// from LDFileFormat::Kind
4690e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  LDFileFormat::Kind kind() const
4790e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  { return m_Kind; }
4890e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang
4990e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  /// type - The categorizes the section's contents and semantics. It's
5090e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  /// different from llvm::SectionKind. Type is format-dependent, but
5190e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  /// llvm::SectionKind is format independent and is used for bit-code.
52d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu  ///   In ELF, it is sh_type
53df362d264c5a0204f27da6ee66d741031626c4e5Xia Wang  ///   In MachO, it's type field of struct section::flags
5490e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  uint32_t type() const
5590e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  { return m_Type; }
5690e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang
57d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu  /// flag - An integer describes miscellaneous attributes.
5890e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  ///   In ELF, it is sh_flags.
5990e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  ///   In MachO, it's attribute field of struct section::flags
6010a3e8fae865f17c10816d1767d2efa3d4a18935Xia Wang  uint32_t flag() const
6110a3e8fae865f17c10816d1767d2efa3d4a18935Xia Wang  { return m_Flag; }
6210a3e8fae865f17c10816d1767d2efa3d4a18935Xia Wang
6310a3e8fae865f17c10816d1767d2efa3d4a18935Xia Wang  /// size - An integer specifying the size in bytes of the virtual memory
6490e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  /// occupied by this section.
6510a3e8fae865f17c10816d1767d2efa3d4a18935Xia Wang  ///   In ELF, if the type() is SHT_NOBITS, this function return zero.
6690e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  ///   Before layouting, output's LDSection::size() should return zero.
6790e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  uint64_t size() const
6890e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  { return m_Size; }
69d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu
7090e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  /// offset - An integer specifying the offset of this section in the file.
7190e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  ///   Before layouting, output's LDSection::offset() should return zero.
7290e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  uint64_t offset() const
7390e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  { return m_Offset; }
7490e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang
75776cca3b3a84cd16bdaccdd43963cc34d923e0a4Xia Wang  /// addr - An integer specifying the virtual address of this section in the
7690e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  /// virtual image.
772591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe  ///   Before layouting, output's LDSection::offset() should return zero.
782591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe  ///   ELF uses sh_addralign to set alignment constraints. In LLVM, alignment
792591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe  ///   constraint is set in SectionData::setAlignment. addr() contains the
802591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe  ///   original ELF::sh_addr. Modulo sh_addr by sh_addralign is not necessary.
8190e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  ///   MachO uses the same scenario.
82d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu  ///
8390e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  ///   Because addr() in output is changing during linking, MCLinker does not
842f19a3103c2cdcf5613eb70493122fb366d509efXia Wang  ///   store the address of the output here. The address is in Layout
8590e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  uint64_t addr() const
86d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu  { return m_Addr; }
87d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu
88d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu  /// align - An integer specifying the align of this section in the file.
89d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu  ///   Before layouting, output's LDSection::align() should return zero.
90d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu  uint32_t align() const
91d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu  { return m_Align; }
922591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe
93a4c2caac05009512213454d329579a79dde11e5fXia Wang  size_t index() const
94a4c2caac05009512213454d329579a79dde11e5fXia Wang  { return m_Index; }
9590e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang
9690e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  /// getLink - return the Link. When a section A needs the other section B
9719306af73a8175e1327101132e26a35c7dfe5168Xia Wang  /// during linking or loading, we say B is A's Link section.
9819306af73a8175e1327101132e26a35c7dfe5168Xia Wang  /// In ELF, InfoLink section control the ElfNN_Shdr::sh_link and sh_info.
992591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe  ///
10019306af73a8175e1327101132e26a35c7dfe5168Xia Wang  /// @return if the section needs no other sections, return NULL
10190e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  LDSection* getLink()
10290e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  { return m_pLink; }
10390e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang
10419306af73a8175e1327101132e26a35c7dfe5168Xia Wang  const LDSection* getLink() const
10590e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  { return m_pLink; }
10690e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang
10790e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  size_t getInfo() const
10890e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  { return m_Info; }
109d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu
1102591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe  void setKind(LDFileFormat::Kind pKind)
11190e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  { m_Kind = pKind; }
11290e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang
11390e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  void setSize(uint64_t size)
11490e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  { m_Size = size; }
11590e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang
11690e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  void setOffset(uint64_t Offset)
11790e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  { m_Offset = Offset; }
1182591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe
11990e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  void setAddr(uint64_t addr)
1202591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe  { m_Addr = addr; }
12190e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang
12290e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  void setAlign(uint32_t align)
12390e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  { m_Align = align; }
12490e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang
12590e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  void setFlag(uint32_t flag)
12690e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  { m_Flag = flag; }
1272591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe
12890e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  void setType(uint32_t type)
12990e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  { m_Type = type; }
13090e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang
13190e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  SectionData* getSectionData()
13290e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  { return m_pSectionData; }
13390e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang
13490e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  const SectionData* getSectionData() const
13590e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  { return m_pSectionData; }
13690e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang
13790e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  void setSectionData(SectionData* pSD)
13890e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  { m_pSectionData = pSD; }
13990e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang
14090e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  bool hasSectionData() const
14190e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  { return (NULL != m_pSectionData); }
14290e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang
14390e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  /// setLink - set the sections should link with.
14490e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  /// if pLink is NULL, no Link section is set.
145d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu  void setLink(LDSection* pLink)
14690e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  { m_pLink = pLink; }
147d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu
1482591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe  void setInfo(size_t pInfo)
149d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu  { m_Info = pInfo; }
150d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu
15190e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  void setIndex(size_t pIndex)
1528c1c1e875e836cfb2377effdf850f5caa1fe6f4dXia Wang  { m_Index = pIndex; }
15393ca011c60c140facb5a790c25a882a384460a86Xia Wang
154d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhuprivate:
155d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu  std::string m_Name;
156d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu  LDFileFormat::Kind m_Kind;
157d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu  uint32_t m_Type;
158d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu  uint32_t m_Flag;
159d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu
160d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu  uint64_t m_Size;
161d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu  uint64_t m_Offset;
162d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu  uint64_t m_Addr;
163d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu  uint32_t m_Align;
16490e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang
165d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu  size_t m_Info;
166d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu  LDSection* m_pLink;
167d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu
16890e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  SectionData* m_pSectionData;
169d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu
17090e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  // the index of the file
17190e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang  size_t m_Index;
1722591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe
173d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu}; // end of LDSection
1742591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe
175d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu} // end namespace mcld
176d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu
177d21f1c1e4d34306ab7aa99f5be1b886f6b4e07a8Guang Zhu#endif
17890e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang
17990e1c782a63475cd9b3973936decf6a4f6c6148fXia Wang