LDSection.h revision affc150dc44fab1911775a49636d0ce85333b634
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
205affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
206