LDSection.h revision 5460a1f25d9ddecb5c70667267d66d51af177a99
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/MC/MCSection.h> 175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/MC/MCAssembler.h> 185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/ADT/StringRef.h> 195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/Support/DataTypes.h> 205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/LDFileFormat.h> 215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <string> 225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace llvm { 245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass MCAsmInfo; 265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass raw_ostream; 275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of llvm 295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace mcld { 315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/** \class LDSection 325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * \brief LDSection represents a section header entry. It is a unified 335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * abstraction for various file formats. 345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * 355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * LDSection contains both the format-dependent data and LLVM specific data. 365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * 375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */ 385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass LDSection : public llvm::MCSection 395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao LDSection(const std::string& pName, 425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao LDFileFormat::Kind pKind, 435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint32_t pType, 445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint32_t pFlag, 455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint64_t pSize = 0, 465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint64_t pOffset = 0, 475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint64_t pAddr = 0); 485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// name - the name of this section. 505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const std::string& name() const 515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_Name; } 525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// kind - the kind of this section, such as Text, BSS, GOT, and so on. 545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// from LDFileFormat::Kind 555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao LDFileFormat::Kind kind() const 565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_Kind; } 575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// type - The categorizes the section's contents and semantics. It's 595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// different from llvm::SectionKind. Type is format-dependent, but 605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// llvm::SectionKind is format independent and is used for bit-code. 615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// In ELF, it is sh_type 625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// In MachO, it's type field of struct section::flags 635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint32_t type() const 645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_Type; } 655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// flag - An integer describes miscellaneous attributes. 675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// In ELF, it is sh_flags. 685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// In MachO, it's attribute field of struct section::flags 695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint32_t flag() const 705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_Flag; } 715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// size - An integer specifying the size in bytes of the virtual memory 735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// occupied by this section. 745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// In ELF, if the type() is SHT_NOBITS, this function return zero. 755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// Before layouting, output's LDSection::size() should return zero. 765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint64_t size() const 775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_Size; } 785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// offset - An integer specifying the offset of this section in the file. 805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// Before layouting, output's LDSection::offset() should return zero. 815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint64_t offset() const 825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_Offset; } 835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// addr - An integer specifying the virtual address of this section in the 855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// virtual image. 865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// Before layouting, output's LDSection::offset() should return zero. 875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// ELF uses sh_addralign to set alignment constraints. In LLVM, alignment 885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// constraint is set in MCSectionData::setAlignment. addr() contains the 895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// original ELF::sh_addr. Modulo sh_addr by sh_addralign is not necessary. 905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// MachO uses the same scenario. 915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// 925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// Because addr() in output is changing during linking, MCLinker does not 935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// store the address of the output here. The address is in Layout 945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint64_t addr() const 955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_Addr; } 965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// align - An integer specifying the align of this section in the file. 985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// Before layouting, output's LDSection::align() should return zero. 995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint32_t align() const 1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_Align; } 1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_t index() const 1035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_Index; } 1045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// getLink - return the Link. When a section A needs the other section B 1065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// during linking or loading, we say B is A's Link section. 1075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// In ELF, InfoLink section control the ElfNN_Shdr::sh_link and sh_info. 1085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// 1095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// @return if the section needs no other sections, return NULL 1105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao LDSection* getLink() 1115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_pLink; } 1125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const LDSection* getLink() const 1145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_pLink; } 1155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_t getInfo() const 1175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_Info; } 1185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setKind(LDFileFormat::Kind pKind) 1205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { m_Kind = pKind; } 1215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setSize(uint64_t size) 1235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { m_Size = size; } 1245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setOffset(uint64_t Offset) 1265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { m_Offset = Offset; } 1275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setAddr(uint64_t addr) 1295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { m_Addr = addr; } 1305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setAlign(uint32_t align) 1325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { m_Align = align; } 1335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setFlag(uint32_t flag) 1355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { m_Flag = flag; } 1365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setType(uint32_t type) 1385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { m_Type = type; } 1395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao static bool classof(const MCSection *S) 1415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return S->getVariant() == SV_LDContext; } 1425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao static bool classof(const LDSection *) 1445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return true; } 1455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // ----- methods for adapt to llvm::MCSection ----- // 1475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void PrintSwitchToSection(const llvm::MCAsmInfo &MAI, 1485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao llvm::raw_ostream &OS) const 1495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { } 1505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool UseCodeAlign() const 1525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return true; } 1535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool isVirtualSection() const 1555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return false; } 1565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao llvm::MCSectionData* getSectionData() 1585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_pSectionData; } 1595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const llvm::MCSectionData* getSectionData() const 1615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_pSectionData; } 1625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setSectionData(llvm::MCSectionData* pSD) 1645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { m_pSectionData = pSD; } 1655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool hasSectionData() const 1675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return (NULL != m_pSectionData); } 1685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// setLink - set the sections should link with. 1705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// if pLink is NULL, no Link section is set. 1715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setLink(LDSection* pLink) 1725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { m_pLink = pLink; } 1735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setInfo(size_t pInfo) 1755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { m_Info = pInfo; } 1765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setIndex(size_t pIndex) 1785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { m_Index = pIndex; } 1795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate: 1815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao std::string m_Name; 1825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao LDFileFormat::Kind m_Kind; 1835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint32_t m_Type; 1845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint32_t m_Flag; 1855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint64_t m_Size; 1875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint64_t m_Offset; 1885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint64_t m_Addr; 1895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint32_t m_Align; 1905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_t m_Info; 1925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao LDSection* m_pLink; 1935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // pointer to MCSectionData. 1955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao llvm::MCSectionData* m_pSectionData; 1965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // the index of the file 1985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_t m_Index; 1995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; // end of LDSection 2015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // end namespace mcld 2035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif 2055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 206