X86LDBackend.h revision 551ae4ebd3e9d137ea668fb83ae4a55b8cfba451
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.
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
127551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  virtual uint64_t
128551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  emitGOTPLTSectionData(MemoryRegion& pRegion,
129551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines                        const ELFFileFormat* FileFormat) const = 0;
1306f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1316f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual void setRelDynSize() = 0;
1326f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual void setRelPLTSize() = 0;
1336f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
13487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  void addEhFrameForPLT(Module& pModule);
13587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  virtual llvm::StringRef createCIERegionForPLT() = 0;
13687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  virtual llvm::StringRef createFDERegionForPLT() = 0;
13787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
1386f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesprotected:
139d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  Relocator* m_pRelocator;
1405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  X86PLT* m_pPLT;
1415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// m_RelDyn - dynamic relocation table of .rel.dyn
1425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  OutputRelocSection* m_pRelDyn;
1435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// m_RelPLT - dynamic relocation table of .rel.plt
1445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  OutputRelocSection* m_pRelPLT;
1455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  X86ELFDynamic* m_pDynamic;
1475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  LDSymbol* m_pGOTSymbol;
1486f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1496f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  size_t m_RelEntrySize;
1506f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  size_t m_RelaEntrySize;
1516f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1526f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  Relocation::Type m_CopyRel;
1536f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  Relocation::Type m_PointerRel;
1546f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines};
1556f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1566f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//
1576f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===//
1586f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines/// X86_32GNULDBackend - linker backend of X86-32 target of GNU ELF format
1596f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines///
1606f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass X86_32GNULDBackend : public X86GNULDBackend
1616f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{
1626f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinespublic:
1636f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  X86_32GNULDBackend(const LinkerConfig& pConfig, GNUInfo* pInfo);
1646f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1656f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  ~X86_32GNULDBackend();
1666f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1676f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  void initTargetSections(Module& pModule, ObjectBuilder& pBuilder);
1686f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1696f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  X86_32GOT& getGOT();
1706f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1716f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  const X86_32GOT& getGOT() const;
1726f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1736f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  X86_32GOTPLT& getGOTPLT();
1746f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1756f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  const X86_32GOTPLT& getGOTPLT() const;
1766f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1776f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesprivate:
1786f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// initRelocator - create and initialize Relocator.
1796f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  bool initRelocator();
1806f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1816f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  void setGOTSectionSize(IRBuilder& pBuilder);
1826f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1836f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  uint64_t emitGOTSectionData(MemoryRegion& pRegion) const;
1846f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1856f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  uint64_t emitGOTPLTSectionData(MemoryRegion& pRegion,
186551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines                                 const ELFFileFormat* FileFormat) const;
1876f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1886f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  void setRelDynSize();
1896f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  void setRelPLTSize();
1906f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
19187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  llvm::StringRef createCIERegionForPLT();
19287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  llvm::StringRef createFDERegionForPLT();
19387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
1946f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesprivate:
1956f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  X86_32GOT* m_pGOT;
1966f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  X86_32GOTPLT* m_pGOTPLT;
1975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao};
1985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1996f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//
2005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===//
2016f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines/// X86_64GNULDBackend - linker backend of X86-64 target of GNU ELF format
2025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao///
2036f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass X86_64GNULDBackend : public X86GNULDBackend
2045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
2055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic:
2066f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  X86_64GNULDBackend(const LinkerConfig& pConfig, GNUInfo* pInfo);
2076f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
2086f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  ~X86_64GNULDBackend();
2096f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
2106f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  void initTargetSections(Module& pModule, ObjectBuilder& pBuilder);
2116f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
2126f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  X86_64GOT& getGOT();
2136f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
2146f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  const X86_64GOT& getGOT() const;
2156f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
2166f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  X86_64GOTPLT& getGOTPLT();
2176f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
2186f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  const X86_64GOTPLT& getGOTPLT() const;
2195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate:
2216f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// initRelocator - create and initialize Relocator.
2226f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  bool initRelocator();
2236f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
2246f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  void setGOTSectionSize(IRBuilder& pBuilder);
2255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2266f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  uint64_t emitGOTSectionData(MemoryRegion& pRegion) const;
2276f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
2286f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  uint64_t emitGOTPLTSectionData(MemoryRegion& pRegion,
229551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines                                 const ELFFileFormat* FileFormat) const;
2306f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
2316f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  void setRelDynSize();
2326f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  void setRelPLTSize();
2336f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
23487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  llvm::StringRef createCIERegionForPLT();
23587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  llvm::StringRef createFDERegionForPLT();
23687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
2376f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesprivate:
2386f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  X86_64GOT* m_pGOT;
2396f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  X86_64GOTPLT* m_pGOTPLT;
2405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao};
2415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of mcld
2425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif
244affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
245