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//===----------------------------------------------------------------------===//
9551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#ifndef TARGET_X86_X86LDBACKEND_H
10551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#define TARGET_X86_X86LDBACKEND_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,
32551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines                  GNUInfo* pInfo,
33551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen 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.
79a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines  const Relocator* getRelocator() const;
80d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  Relocator* getRelocator();
815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
826f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual void initTargetSections(Module& pModule, ObjectBuilder& pBuilder) = 0;
835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
846f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  void initTargetSymbols(IRBuilder& pBuilder, Module& pModule);
855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  OutputRelocSection& getRelDyn();
875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  const OutputRelocSection& getRelDyn() const;
885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  OutputRelocSection& getRelPLT();
905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  const OutputRelocSection& getRelPLT() const;
915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
92f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  LDSymbol* getGOTSymbol() { return m_pGOTSymbol; }
93f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  const LDSymbol* getGOTSymbol() const { return m_pGOTSymbol; }
94f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// getTargetSectionOrder - compute the layout order of X86 target sections
9622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  unsigned int getTargetSectionOrder(const LDSection& pSectHdr) const;
975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
98affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// finalizeTargetSymbols - finalize the symbol value
996f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  bool finalizeTargetSymbols();
1006f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
101f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// getPointerRel - get pointer relocation type.
1026f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  Relocation::Type getPointerRel()
1036f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { return m_PointerRel; }
1045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
105f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  Relocation::Type getCopyRelType()    const { return m_CopyRel;    }
106f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  Relocation::Type getPointerRelType() const { return m_PointerRel; }
1075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1086f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesprotected:
1096f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  void defineGOTSymbol(IRBuilder& pBuilder, Fragment&);
11022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
11122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// getRelEntrySize - the size in BYTE of rel type relocation
11222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  size_t getRelEntrySize()
1136f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { return m_RelEntrySize; }
11422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
11522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// getRelEntrySize - the size in BYTE of rela type relocation
11622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  size_t getRelaEntrySize()
1176f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { return m_RelaEntrySize; }
1185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1196f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesprivate:
12022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// doCreateProgramHdrs - backend can implement this function to create the
12122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// target-dependent segments
1226f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  void doCreateProgramHdrs(Module& pModule);
1235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1246f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual void setGOTSectionSize(IRBuilder& pBuilder) = 0;
1256f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1266f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual uint64_t emitGOTSectionData(MemoryRegion& pRegion) const = 0;
1276f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
128551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  virtual uint64_t
129551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  emitGOTPLTSectionData(MemoryRegion& pRegion,
130551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines                        const ELFFileFormat* FileFormat) const = 0;
1316f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1326f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual void setRelDynSize() = 0;
1336f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual void setRelPLTSize() = 0;
1346f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
13587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  void addEhFrameForPLT(Module& pModule);
13687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  virtual llvm::StringRef createCIERegionForPLT() = 0;
13787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  virtual llvm::StringRef createFDERegionForPLT() = 0;
13887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
1396f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesprotected:
140d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  Relocator* m_pRelocator;
1415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  X86PLT* m_pPLT;
1425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// m_RelDyn - dynamic relocation table of .rel.dyn
1435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  OutputRelocSection* m_pRelDyn;
1445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// m_RelPLT - dynamic relocation table of .rel.plt
1455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  OutputRelocSection* m_pRelPLT;
1465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  X86ELFDynamic* m_pDynamic;
1485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  LDSymbol* m_pGOTSymbol;
1496f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1506f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  size_t m_RelEntrySize;
1516f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  size_t m_RelaEntrySize;
1526f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1536f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  Relocation::Type m_CopyRel;
1546f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  Relocation::Type m_PointerRel;
1556f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines};
1566f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1576f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//
1586f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===//
1596f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines/// X86_32GNULDBackend - linker backend of X86-32 target of GNU ELF format
1606f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines///
1616f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass X86_32GNULDBackend : public X86GNULDBackend
1626f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{
1636f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinespublic:
1646f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  X86_32GNULDBackend(const LinkerConfig& pConfig, GNUInfo* pInfo);
1656f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1666f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  ~X86_32GNULDBackend();
1676f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1686f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  void initTargetSections(Module& pModule, ObjectBuilder& pBuilder);
1696f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1706f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  X86_32GOT& getGOT();
1716f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1726f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  const X86_32GOT& getGOT() const;
1736f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1746f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  X86_32GOTPLT& getGOTPLT();
1756f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1766f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  const X86_32GOTPLT& getGOTPLT() const;
1776f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1786f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesprivate:
1796f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// initRelocator - create and initialize Relocator.
1806f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  bool initRelocator();
1816f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1826f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  void setGOTSectionSize(IRBuilder& pBuilder);
1836f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1846f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  uint64_t emitGOTSectionData(MemoryRegion& pRegion) const;
1856f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1866f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  uint64_t emitGOTPLTSectionData(MemoryRegion& pRegion,
187551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines                                 const ELFFileFormat* FileFormat) const;
1886f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1896f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  void setRelDynSize();
1906f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  void setRelPLTSize();
1916f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
19287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  llvm::StringRef createCIERegionForPLT();
19387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  llvm::StringRef createFDERegionForPLT();
19487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
1956f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesprivate:
1966f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  X86_32GOT* m_pGOT;
1976f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  X86_32GOTPLT* m_pGOTPLT;
1985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao};
1995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2006f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//
2015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===//
2026f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines/// X86_64GNULDBackend - linker backend of X86-64 target of GNU ELF format
2035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao///
2046f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass X86_64GNULDBackend : public X86GNULDBackend
2055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
2065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic:
2076f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  X86_64GNULDBackend(const LinkerConfig& pConfig, GNUInfo* pInfo);
2086f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
2096f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  ~X86_64GNULDBackend();
2106f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
2116f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  void initTargetSections(Module& pModule, ObjectBuilder& pBuilder);
2126f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
2136f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  X86_64GOT& getGOT();
2146f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
2156f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  const X86_64GOT& getGOT() const;
2166f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
2176f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  X86_64GOTPLT& getGOTPLT();
2186f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
2196f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  const X86_64GOTPLT& getGOTPLT() const;
2205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate:
2226f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// initRelocator - create and initialize Relocator.
2236f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  bool initRelocator();
2246f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
2256f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  void setGOTSectionSize(IRBuilder& pBuilder);
2265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2276f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  uint64_t emitGOTSectionData(MemoryRegion& pRegion) const;
2286f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
2296f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  uint64_t emitGOTPLTSectionData(MemoryRegion& pRegion,
230551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines                                 const ELFFileFormat* FileFormat) const;
2316f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
2326f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  void setRelDynSize();
2336f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  void setRelPLTSize();
2346f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
23587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  llvm::StringRef createCIERegionForPLT();
23687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  llvm::StringRef createFDERegionForPLT();
23787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
2386f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesprivate:
2396f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  X86_64GOT* m_pGOT;
2406f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  X86_64GOTPLT* m_pGOTPLT;
2415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao};
2425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of mcld
2435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif
245affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
246