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