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