15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- LDSection.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//===----------------------------------------------------------------------===// 95460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifndef MCLD_LD_LDSECTION_H 115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#define MCLD_LD_LDSECTION_H 125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifdef ENABLE_UNITTEST 135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <gtest.h> 145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif 155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/ADT/StringRef.h> 175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/Support/DataTypes.h> 185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/LDFileFormat.h> 195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <string> 205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 21cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaonamespace mcld { 225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 23cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoclass SectionData; 245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/** \class LDSection 265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * \brief LDSection represents a section header entry. It is a unified 27cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao * abstraction of a section header entry for various file formats. 285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */ 29cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoclass LDSection 305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao LDSection(const std::string& pName, 335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao LDFileFormat::Kind pKind, 345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint32_t pType, 355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint32_t pFlag, 365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint64_t pSize = 0, 375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint64_t pOffset = 0, 385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint64_t pAddr = 0); 395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// name - the name of this section. 415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const std::string& name() const 425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_Name; } 435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// kind - the kind of this section, such as Text, BSS, GOT, and so on. 455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// from LDFileFormat::Kind 465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao LDFileFormat::Kind kind() const 475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_Kind; } 485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// type - The categorizes the section's contents and semantics. It's 505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// different from llvm::SectionKind. Type is format-dependent, but 515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// llvm::SectionKind is format independent and is used for bit-code. 525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// In ELF, it is sh_type 535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// In MachO, it's type field of struct section::flags 545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint32_t type() const 555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_Type; } 565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// flag - An integer describes miscellaneous attributes. 585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// In ELF, it is sh_flags. 595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// In MachO, it's attribute field of struct section::flags 605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint32_t flag() const 615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_Flag; } 625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// size - An integer specifying the size in bytes of the virtual memory 645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// occupied by this section. 655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// In ELF, if the type() is SHT_NOBITS, this function return zero. 665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// Before layouting, output's LDSection::size() should return zero. 675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint64_t size() const 685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_Size; } 695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// offset - An integer specifying the offset of this section in the file. 715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// Before layouting, output's LDSection::offset() should return zero. 725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint64_t offset() const 735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_Offset; } 745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// addr - An integer specifying the virtual address of this section in the 765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// virtual image. 775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// Before layouting, output's LDSection::offset() should return zero. 785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// ELF uses sh_addralign to set alignment constraints. In LLVM, alignment 79cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// constraint is set in SectionData::setAlignment. addr() contains the 805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// original ELF::sh_addr. Modulo sh_addr by sh_addralign is not necessary. 815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// MachO uses the same scenario. 825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// 835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// Because addr() in output is changing during linking, MCLinker does not 845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// store the address of the output here. The address is in Layout 855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint64_t addr() const 865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_Addr; } 875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// align - An integer specifying the align of this section in the file. 895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// Before layouting, output's LDSection::align() should return zero. 905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint32_t align() const 915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_Align; } 925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_t index() const 945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_Index; } 955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// getLink - return the Link. When a section A needs the other section B 975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// during linking or loading, we say B is A's Link section. 985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// In ELF, InfoLink section control the ElfNN_Shdr::sh_link and sh_info. 995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// 1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// @return if the section needs no other sections, return NULL 1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao LDSection* getLink() 1025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_pLink; } 1035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const LDSection* getLink() const 1055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_pLink; } 1065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_t getInfo() const 1085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_Info; } 1095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setKind(LDFileFormat::Kind pKind) 1115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { m_Kind = pKind; } 1125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setSize(uint64_t size) 1145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { m_Size = size; } 1155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setOffset(uint64_t Offset) 1175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { m_Offset = Offset; } 1185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setAddr(uint64_t addr) 1205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { m_Addr = addr; } 1215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setAlign(uint32_t align) 1235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { m_Align = align; } 1245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setFlag(uint32_t flag) 1265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { m_Flag = flag; } 1275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setType(uint32_t type) 1295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { m_Type = type; } 1305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 131cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao SectionData* getSectionData() 1325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_pSectionData; } 1335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 134cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao const SectionData* getSectionData() const 1355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_pSectionData; } 1365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 137cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao void setSectionData(SectionData* pSD) 1385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { m_pSectionData = pSD; } 1395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool hasSectionData() const 1415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return (NULL != m_pSectionData); } 1425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// setLink - set the sections should link with. 1445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// if pLink is NULL, no Link section is set. 1455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setLink(LDSection* pLink) 1465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { m_pLink = pLink; } 1475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setInfo(size_t pInfo) 1495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { m_Info = pInfo; } 1505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setIndex(size_t pIndex) 1525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { m_Index = pIndex; } 1535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate: 1555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao std::string m_Name; 1565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao LDFileFormat::Kind m_Kind; 1575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint32_t m_Type; 1585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint32_t m_Flag; 1595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint64_t m_Size; 1615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint64_t m_Offset; 1625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint64_t m_Addr; 1635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint32_t m_Align; 1645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_t m_Info; 1665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao LDSection* m_pLink; 1675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 168cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao SectionData* m_pSectionData; 1695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // the index of the file 1715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_t m_Index; 1725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; // end of LDSection 1745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // end namespace mcld 1765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif 178affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 179