X86LDBackend.h revision f7ac0f19a1c8d0ad14bcf6456ce368b830fea886
15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- X86LDBackend.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#ifndef X86_LDBACKEND_H
105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#define X86_LDBACKEND_H
115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include "X86ELFDynamic.h"
135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include "X86GOT.h"
14affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include "X86GOTPLT.h"
155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include "X86PLT.h"
165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/LDSection.h>
175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/Target/GNULDBackend.h>
185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/Target/OutputRelocSection.h>
195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace mcld {
215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass LinkerConfig;
236f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass GNUInfo;
2422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===//
265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// X86GNULDBackend - linker backend of X86 target of GNU ELF format
275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao///
285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass X86GNULDBackend : public GNULDBackend
295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic:
316f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  X86GNULDBackend(const LinkerConfig& pConfig,
326f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines		  GNUInfo* pInfo,
336f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines		  Relocation::Type pCopyRel);
345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ~X86GNULDBackend();
365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  uint32_t machine() const;
385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  X86PLT& getPLT();
405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  const X86PLT& getPLT() const;
425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// preLayout - Backend can do any needed modification before layout
446f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  void doPreLayout(IRBuilder& pBuilder);
455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// postLayout -Backend can do any needed modification after layout
476f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  void doPostLayout(Module& pModule, IRBuilder& pBuilder);
485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// dynamic - the dynamic section of the target machine.
505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// Use co-variant return type to return its own dynamic section.
515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  X86ELFDynamic& dynamic();
525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// dynamic - the dynamic section of the target machine.
545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// Use co-variant return type to return its own dynamic section.
555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  const X86ELFDynamic& dynamic() const;
565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// emitSectionData - write out the section data into the memory region.
585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// When writers get a LDSection whose kind is LDFileFormat::Target, writers
595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// call back target backend to emit the data.
605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ///
615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// Backends handle the target-special tables (plt, gp,...) by themselves.
625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// Backend can put the data of the tables in MCSectionData directly
635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ///  - LDSection.getSectionData can get the section data.
645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// Or, backend can put the data into special data structure
655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ///  - backend can maintain its own map<LDSection, table> to get the table
665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// from given LDSection.
675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ///
685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// @param pSection - the given LDSection
69affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// @param pLayout - for comouting the size of fragment
705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// @param pRegion - the region to write out data
715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// @return the size of the table in the file.
7222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  uint64_t emitSectionData(const LDSection& pSection,
735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                           MemoryRegion& pRegion) const;
745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
75d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  /// initRelocator - create and initialize Relocator.
766f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual bool initRelocator() = 0;
77d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
78d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  /// getRelocator - return relocator.
79d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  Relocator* getRelocator();
805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
816f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual void initTargetSections(Module& pModule, ObjectBuilder& pBuilder) = 0;
825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
836f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  void initTargetSymbols(IRBuilder& pBuilder, Module& pModule);
845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  OutputRelocSection& getRelDyn();
865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  const OutputRelocSection& getRelDyn() const;
875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  OutputRelocSection& getRelPLT();
895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  const OutputRelocSection& getRelPLT() const;
905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
91f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  LDSymbol* getGOTSymbol() { return m_pGOTSymbol; }
92f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  const LDSymbol* getGOTSymbol() const { return m_pGOTSymbol; }
93f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// getTargetSectionOrder - compute the layout order of X86 target sections
9522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  unsigned int getTargetSectionOrder(const LDSection& pSectHdr) const;
965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
97affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// finalizeTargetSymbols - finalize the symbol value
986f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  bool finalizeTargetSymbols();
996f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
100f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// getPointerRel - get pointer relocation type.
1016f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  Relocation::Type getPointerRel()
1026f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { return m_PointerRel; }
1035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
104f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  Relocation::Type getCopyRelType()    const { return m_CopyRel;    }
105f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  Relocation::Type getPointerRelType() const { return m_PointerRel; }
1065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1076f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesprotected:
1086f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  void defineGOTSymbol(IRBuilder& pBuilder, Fragment&);
10922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
11022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// getRelEntrySize - the size in BYTE of rel type relocation
11122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  size_t getRelEntrySize()
1126f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { return m_RelEntrySize; }
11322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
11422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// getRelEntrySize - the size in BYTE of rela type relocation
11522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  size_t getRelaEntrySize()
1166f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { return m_RelaEntrySize; }
1175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1186f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesprivate:
11922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// doCreateProgramHdrs - backend can implement this function to create the
12022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// target-dependent segments
1216f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  void doCreateProgramHdrs(Module& pModule);
1225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1236f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual void setGOTSectionSize(IRBuilder& pBuilder) = 0;
1246f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1256f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual uint64_t emitGOTSectionData(MemoryRegion& pRegion) const = 0;
1266f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1276f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual uint64_t emitGOTPLTSectionData(MemoryRegion& pRegion,
1286f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines					 const ELFFileFormat* FileFormat) const = 0;
1296f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1306f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual void setRelDynSize() = 0;
1316f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual void setRelPLTSize() = 0;
1326f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1336f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesprotected:
134d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  Relocator* m_pRelocator;
1355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  X86PLT* m_pPLT;
1365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// m_RelDyn - dynamic relocation table of .rel.dyn
1375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  OutputRelocSection* m_pRelDyn;
1385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// m_RelPLT - dynamic relocation table of .rel.plt
1395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  OutputRelocSection* m_pRelPLT;
1405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  X86ELFDynamic* m_pDynamic;
1425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  LDSymbol* m_pGOTSymbol;
1436f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1446f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  size_t m_RelEntrySize;
1456f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  size_t m_RelaEntrySize;
1466f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1476f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  Relocation::Type m_CopyRel;
1486f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  Relocation::Type m_PointerRel;
1496f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines};
1506f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1516f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//
1526f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===//
1536f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines/// X86_32GNULDBackend - linker backend of X86-32 target of GNU ELF format
1546f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines///
1556f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass X86_32GNULDBackend : public X86GNULDBackend
1566f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{
1576f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinespublic:
1586f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  X86_32GNULDBackend(const LinkerConfig& pConfig, GNUInfo* pInfo);
1596f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1606f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  ~X86_32GNULDBackend();
1616f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1626f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  void initTargetSections(Module& pModule, ObjectBuilder& pBuilder);
1636f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1646f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  X86_32GOT& getGOT();
1656f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1666f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  const X86_32GOT& getGOT() const;
1676f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1686f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  X86_32GOTPLT& getGOTPLT();
1696f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1706f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  const X86_32GOTPLT& getGOTPLT() const;
1716f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1726f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesprivate:
1736f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// initRelocator - create and initialize Relocator.
1746f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  bool initRelocator();
1756f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1766f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  void setGOTSectionSize(IRBuilder& pBuilder);
1776f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1786f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  uint64_t emitGOTSectionData(MemoryRegion& pRegion) const;
1796f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1806f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  uint64_t emitGOTPLTSectionData(MemoryRegion& pRegion,
1816f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines				 const ELFFileFormat* FileFormat) const;
1826f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1836f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  void setRelDynSize();
1846f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  void setRelPLTSize();
1856f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1866f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesprivate:
1876f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  X86_32GOT* m_pGOT;
1886f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  X86_32GOTPLT* m_pGOTPLT;
1895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao};
1905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1916f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//
1925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===//
1936f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines/// X86_64GNULDBackend - linker backend of X86-64 target of GNU ELF format
1945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao///
1956f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass X86_64GNULDBackend : public X86GNULDBackend
1965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
1975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic:
1986f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  X86_64GNULDBackend(const LinkerConfig& pConfig, GNUInfo* pInfo);
1996f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
2006f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  ~X86_64GNULDBackend();
2016f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
2026f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  void initTargetSections(Module& pModule, ObjectBuilder& pBuilder);
2036f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
2046f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  X86_64GOT& getGOT();
2056f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
2066f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  const X86_64GOT& getGOT() const;
2076f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
2086f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  X86_64GOTPLT& getGOTPLT();
2096f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
2106f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  const X86_64GOTPLT& getGOTPLT() const;
2115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate:
2136f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// initRelocator - create and initialize Relocator.
2146f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  bool initRelocator();
2156f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
2166f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  void setGOTSectionSize(IRBuilder& pBuilder);
2175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2186f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  uint64_t emitGOTSectionData(MemoryRegion& pRegion) const;
2196f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
2206f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  uint64_t emitGOTPLTSectionData(MemoryRegion& pRegion,
2216f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines				 const ELFFileFormat* FileFormat) const;
2226f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
2236f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  void setRelDynSize();
2246f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  void setRelPLTSize();
2256f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
2266f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesprivate:
2276f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  X86_64GOT* m_pGOT;
2286f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  X86_64GOTPLT* m_pGOTPLT;
2295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao};
2305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of mcld
2315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif
233affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
234