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//===----------------------------------------------------------------------===// 937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#ifndef MCLD_LD_LDSECTION_H_ 1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#define MCLD_LD_LDSECTION_H_ 115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Config/Config.h" 1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/LDFileFormat.h" 1437b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/Allocators.h" 155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/Support/DataTypes.h> 1737b74a387bb3993387029859c2d9d051c41c724eStephen Hines 185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <string> 195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 20cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaonamespace mcld { 215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2237b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass DebugString; 2322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass EhFrame; 2437b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass RelocData; 2537b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass SectionData; 265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/** \class LDSection 285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * \brief LDSection represents a section header entry. It is a unified 29cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao * abstraction of a section header entry for various file formats. 305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */ 3137b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass LDSection { 3237b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 3322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao friend class Chunk<LDSection, MCLD_SECTIONS_PER_INPUT>; 3422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 3522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao LDSection(); 3622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao LDSection(const std::string& pName, 385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao LDFileFormat::Kind pKind, 395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint32_t pType, 405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint32_t pFlag, 415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint64_t pSize = 0, 425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint64_t pAddr = 0); 435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 4437b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 4522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao ~LDSection(); 4622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 4722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao static LDSection* Create(const std::string& pName, 4822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao LDFileFormat::Kind pKind, 4922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao uint32_t pType, 5022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao uint32_t pFlag, 5122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao uint64_t pSize = 0, 5222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao uint64_t pAddr = 0); 5322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 5422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao static void Destroy(LDSection*& pSection); 5522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 5622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao static void Clear(); 5722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 5822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao bool hasOffset() const; 5922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// name - the name of this section. 6137b74a387bb3993387029859c2d9d051c41c724eStephen Hines const std::string& name() const { return m_Name; } 625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// kind - the kind of this section, such as Text, BSS, GOT, and so on. 645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// from LDFileFormat::Kind 6537b74a387bb3993387029859c2d9d051c41c724eStephen Hines LDFileFormat::Kind kind() const { return m_Kind; } 665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// type - The categorizes the section's contents and semantics. It's 685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// different from llvm::SectionKind. Type is format-dependent, but 695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// llvm::SectionKind is format independent and is used for bit-code. 705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// In ELF, it is sh_type 715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// In MachO, it's type field of struct section::flags 7237b74a387bb3993387029859c2d9d051c41c724eStephen Hines uint32_t type() const { return m_Type; } 735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// flag - An integer describes miscellaneous attributes. 755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// In ELF, it is sh_flags. 765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// In MachO, it's attribute field of struct section::flags 7737b74a387bb3993387029859c2d9d051c41c724eStephen Hines uint32_t flag() const { return m_Flag; } 785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// size - An integer specifying the size in bytes of the virtual memory 805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// occupied by this section. 815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// In ELF, if the type() is SHT_NOBITS, this function return zero. 825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// Before layouting, output's LDSection::size() should return zero. 8337b74a387bb3993387029859c2d9d051c41c724eStephen Hines uint64_t size() const { return m_Size; } 845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// offset - An integer specifying the offset of this section in the file. 865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// Before layouting, output's LDSection::offset() should return zero. 8737b74a387bb3993387029859c2d9d051c41c724eStephen Hines uint64_t offset() const { return m_Offset; } 885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// addr - An integer specifying the virtual address of this section in the 905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// virtual image. 915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// Before layouting, output's LDSection::offset() should return zero. 925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// ELF uses sh_addralign to set alignment constraints. In LLVM, alignment 93cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// constraint is set in SectionData::setAlignment. addr() contains the 945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// original ELF::sh_addr. Modulo sh_addr by sh_addralign is not necessary. 955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// MachO uses the same scenario. 965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// 975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// Because addr() in output is changing during linking, MCLinker does not 985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// store the address of the output here. The address is in Layout 9937b74a387bb3993387029859c2d9d051c41c724eStephen Hines uint64_t addr() const { return m_Addr; } 1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// align - An integer specifying the align of this section in the file. 1025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// Before layouting, output's LDSection::align() should return zero. 10337b74a387bb3993387029859c2d9d051c41c724eStephen Hines uint32_t align() const { return m_Align; } 1045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 10537b74a387bb3993387029859c2d9d051c41c724eStephen Hines size_t index() const { return m_Index; } 1065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// getLink - return the Link. When a section A needs the other section B 1085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// during linking or loading, we say B is A's Link section. 1095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// In ELF, InfoLink section control the ElfNN_Shdr::sh_link and sh_info. 1105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// 1115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// @return if the section needs no other sections, return NULL 11237b74a387bb3993387029859c2d9d051c41c724eStephen Hines LDSection* getLink() { return m_pLink; } 1135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 11437b74a387bb3993387029859c2d9d051c41c724eStephen Hines const LDSection* getLink() const { return m_pLink; } 1155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 11637b74a387bb3993387029859c2d9d051c41c724eStephen Hines size_t getInfo() const { return m_Info; } 1175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 11837b74a387bb3993387029859c2d9d051c41c724eStephen Hines void setKind(LDFileFormat::Kind pKind) { m_Kind = pKind; } 1195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 12037b74a387bb3993387029859c2d9d051c41c724eStephen Hines void setSize(uint64_t size) { m_Size = size; } 1215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 12237b74a387bb3993387029859c2d9d051c41c724eStephen Hines void setOffset(uint64_t Offset) { m_Offset = Offset; } 1235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 12437b74a387bb3993387029859c2d9d051c41c724eStephen Hines void setAddr(uint64_t addr) { m_Addr = addr; } 1255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 12637b74a387bb3993387029859c2d9d051c41c724eStephen Hines void setAlign(uint32_t align) { m_Align = align; } 1275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 12837b74a387bb3993387029859c2d9d051c41c724eStephen Hines void setFlag(uint32_t flag) { m_Flag = flag; } 1295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 13037b74a387bb3993387029859c2d9d051c41c724eStephen Hines void setType(uint32_t type) { m_Type = type; } 1315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 13222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // ----- SectionData ----- // 13322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const SectionData* getSectionData() const { return m_Data.sect_data; } 13437b74a387bb3993387029859c2d9d051c41c724eStephen Hines SectionData* getSectionData() { return m_Data.sect_data; } 13522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 13622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao void setSectionData(SectionData* pSD) { m_Data.sect_data = pSD; } 13722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 13822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao bool hasSectionData() const; 13922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 14022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // ------ RelocData ------ // 14122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const RelocData* getRelocData() const { return m_Data.reloc_data; } 14237b74a387bb3993387029859c2d9d051c41c724eStephen Hines RelocData* getRelocData() { return m_Data.reloc_data; } 14322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 14422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao void setRelocData(RelocData* pRD) { m_Data.reloc_data = pRD; } 1455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 14622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao bool hasRelocData() const; 1475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 14822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // ------ EhFrame ------ // 14922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const EhFrame* getEhFrame() const { return m_Data.eh_frame; } 15037b74a387bb3993387029859c2d9d051c41c724eStephen Hines EhFrame* getEhFrame() { return m_Data.eh_frame; } 1515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 15222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao void setEhFrame(EhFrame* pEhFrame) { m_Data.eh_frame = pEhFrame; } 15322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 15422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao bool hasEhFrame() const; 1555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 15637b74a387bb3993387029859c2d9d051c41c724eStephen Hines // ------ DebugString ------ // 15737b74a387bb3993387029859c2d9d051c41c724eStephen Hines const DebugString* getDebugString() const { return m_Data.debug_string; } 15837b74a387bb3993387029859c2d9d051c41c724eStephen Hines DebugString* getDebugString() { return m_Data.debug_string; } 15937b74a387bb3993387029859c2d9d051c41c724eStephen Hines 16037b74a387bb3993387029859c2d9d051c41c724eStephen Hines void setDebugString(DebugString* pDebugString) 16137b74a387bb3993387029859c2d9d051c41c724eStephen Hines { m_Data.debug_string = pDebugString; } 16237b74a387bb3993387029859c2d9d051c41c724eStephen Hines 16337b74a387bb3993387029859c2d9d051c41c724eStephen Hines bool hasDebugString() const; 16437b74a387bb3993387029859c2d9d051c41c724eStephen Hines 1655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// setLink - set the sections should link with. 1665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// if pLink is NULL, no Link section is set. 16737b74a387bb3993387029859c2d9d051c41c724eStephen Hines void setLink(LDSection* pLink) { m_pLink = pLink; } 1685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 16937b74a387bb3993387029859c2d9d051c41c724eStephen Hines void setInfo(size_t pInfo) { m_Info = pInfo; } 1705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 17137b74a387bb3993387029859c2d9d051c41c724eStephen Hines void setIndex(size_t pIndex) { m_Index = pIndex; } 1725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 17337b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 17437b74a387bb3993387029859c2d9d051c41c724eStephen Hines union Data { 17522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao SectionData* sect_data; 17622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao RelocData* reloc_data; 17722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao EhFrame* eh_frame; 17837b74a387bb3993387029859c2d9d051c41c724eStephen Hines DebugString* debug_string; 17922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao }; 18022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 18137b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 1825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao std::string m_Name; 18322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 1845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao LDFileFormat::Kind m_Kind; 1855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint32_t m_Type; 1865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint32_t m_Flag; 1875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint64_t m_Size; 1895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint64_t m_Offset; 1905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint64_t m_Addr; 1915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint32_t m_Align; 1925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_t m_Info; 1945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao LDSection* m_pLink; 1955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 19622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// m_Data - the SectionData or RelocData of this section 19737b74a387bb3993387029859c2d9d051c41c724eStephen Hines Data m_Data; 1985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 19922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// m_Index - the index of the file 2005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_t m_Index; 20137b74a387bb3993387029859c2d9d051c41c724eStephen Hines}; // end of LDSection 2025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 20337b74a387bb3993387029859c2d9d051c41c724eStephen Hines} // namespace mcld 204affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 20537b74a387bb3993387029859c2d9d051c41c724eStephen Hines#endif // MCLD_LD_LDSECTION_H_ 206