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