TargetLDBackend.h revision affc150dc44fab1911775a49636d0ce85333b634
1e2679e4ccab0ce75f701629c22c179165df4f15eJerome Poichet//===-- llvm/Target/TargetLDBackend.h - Target LD Backend -----*- C++ -*-===// 2e2679e4ccab0ce75f701629c22c179165df4f15eJerome Poichet// 3e2679e4ccab0ce75f701629c22c179165df4f15eJerome Poichet// The MCLinker Project 4e2679e4ccab0ce75f701629c22c179165df4f15eJerome Poichet// 5e2679e4ccab0ce75f701629c22c179165df4f15eJerome Poichet// This file is distributed under the University of Illinois Open Source 6e2679e4ccab0ce75f701629c22c179165df4f15eJerome Poichet// License. See LICENSE.TXT for details. 7e2679e4ccab0ce75f701629c22c179165df4f15eJerome Poichet// 8e2679e4ccab0ce75f701629c22c179165df4f15eJerome Poichet//===----------------------------------------------------------------------===// 9e2679e4ccab0ce75f701629c22c179165df4f15eJerome Poichet#ifndef LLVM_TARGET_TARGETLDBACKEND_H 10e2679e4ccab0ce75f701629c22c179165df4f15eJerome Poichet#define LLVM_TARGET_TARGETLDBACKEND_H 11e2679e4ccab0ce75f701629c22c179165df4f15eJerome Poichet 12e2679e4ccab0ce75f701629c22c179165df4f15eJerome Poichet#include <llvm/Support/DataTypes.h> 13e2679e4ccab0ce75f701629c22c179165df4f15eJerome Poichet#include <mcld/MC/MCLDOutput.h> 14e2679e4ccab0ce75f701629c22c179165df4f15eJerome Poichet#include <mcld/LD/EhFrame.h> 15e2679e4ccab0ce75f701629c22c179165df4f15eJerome Poichet 16e2679e4ccab0ce75f701629c22c179165df4f15eJerome Poichetnamespace mcld { 17e2679e4ccab0ce75f701629c22c179165df4f15eJerome Poichet 18e2679e4ccab0ce75f701629c22c179165df4f15eJerome Poichetclass MCLinker; 19aadb8928f5920c758c1a385bbc8b8b128a60657cCraig Stoutclass Relocation; 20aadb8928f5920c758c1a385bbc8b8b128a60657cCraig Stoutclass RelocationFactory; 21e2679e4ccab0ce75f701629c22c179165df4f15eJerome Poichetclass Layout; 225a59bde085588f95dc067bd1ed64a940f355343cbulicclass ArchiveReader; 23f0e71182c62bba18e9d8098941a29c4f5031ce36Jerome Poichetclass ObjectReader; 24aadb8928f5920c758c1a385bbc8b8b128a60657cCraig Stoutclass DynObjReader; 25e2679e4ccab0ce75f701629c22c179165df4f15eJerome Poichetclass ObjectWriter; 26f0e71182c62bba18e9d8098941a29c4f5031ce36Jerome Poichetclass DynObjWriter; 274cf79b1c4d38a190317961891f9fd052836710fdCraig Stoutclass ExecWriter; 28e2679e4ccab0ce75f701629c22c179165df4f15eJerome Poichetclass LDContext; 29e2679e4ccab0ce75f701629c22c179165df4f15eJerome Poichetclass SectionMap; 30e2679e4ccab0ce75f701629c22c179165df4f15eJerome Poichetclass Output; 31e2679e4ccab0ce75f701629c22c179165df4f15eJerome Poichetclass MCLDInfo; 324cf79b1c4d38a190317961891f9fd052836710fdCraig Stoutclass SymbolCategory; 33f0e71182c62bba18e9d8098941a29c4f5031ce36Jerome Poichetclass Input; 34e2679e4ccab0ce75f701629c22c179165df4f15eJerome Poichetclass LDFileFormat; 35937f910ceb3364a1b84899c2b5f1ff5384f38f84Jerome Poichetclass GOT; 36937f910ceb3364a1b84899c2b5f1ff5384f38f84Jerome Poichet 37937f910ceb3364a1b84899c2b5f1ff5384f38f84Jerome Poichet//===----------------------------------------------------------------------===// 38937f910ceb3364a1b84899c2b5f1ff5384f38f84Jerome Poichet/// TargetLDBackend - Generic interface to target specific assembler backends. 39937f910ceb3364a1b84899c2b5f1ff5384f38f84Jerome Poichet/// 404cf79b1c4d38a190317961891f9fd052836710fdCraig Stoutclass TargetLDBackend 41e2679e4ccab0ce75f701629c22c179165df4f15eJerome Poichet{ 42558f7b70035c50045908efca5f4f3d65df685cacCraig Stout TargetLDBackend(const TargetLDBackend &); // DO NOT IMPLEMENT 434cf79b1c4d38a190317961891f9fd052836710fdCraig Stout void operator=(const TargetLDBackend &); // DO NOT IMPLEMENT 44937f910ceb3364a1b84899c2b5f1ff5384f38f84Jerome Poichet 45937f910ceb3364a1b84899c2b5f1ff5384f38f84Jerome Poichetprotected: 464fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout TargetLDBackend(); 474cf79b1c4d38a190317961891f9fd052836710fdCraig Stout 48aadb8928f5920c758c1a385bbc8b8b128a60657cCraig Stoutpublic: 4944f004b2612b04510a09a4c1e33f5a109582d669Craig Stout virtual ~TargetLDBackend(); 50c62efa44831b1c60dcbdfd968735e27ac8294439Craig Stout 51c62efa44831b1c60dcbdfd968735e27ac8294439Craig Stout // ----- target dependent ----- // 52aadb8928f5920c758c1a385bbc8b8b128a60657cCraig Stout virtual bool initTargetSectionMap(SectionMap& pSectionMap) { return true;} 53aadb8928f5920c758c1a385bbc8b8b128a60657cCraig Stout virtual void initTargetSegments(MCLinker& pLinker) { } 544fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout virtual void initTargetSections(MCLinker& pLinker) { } 554fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout virtual void initTargetSymbols(MCLinker& pLinker, const Output& pOutput) { } 564fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout virtual void initTargetRelocation(MCLinker& pLinker) { } 574fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout virtual bool initStandardSymbols(MCLinker& pLinker, const Output& pOutput) = 0; 584fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout virtual bool initRelocFactory(const MCLinker& pLinker) = 0; 594fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout 604fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout virtual RelocationFactory* getRelocFactory() = 0; 614fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout 624fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout /// scanRelocation - When read in relocations, backend can do any modification 63c4788eac909f51e73e05885314d3ace65d0a2f26bulic /// to relocation and generate empty entries, such as GOT, dynamic relocation 644fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout /// entries and other target dependent entries. These entries are generated 654fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout /// for layout to adjust the ouput offset. 664fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout /// @param pReloc - a read in relocation entry 674fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout /// @param pInputSym - the input LDSymbol of relocation target symbol 684fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout /// @param pOutput - the ouput file 694fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout virtual void scanRelocation(Relocation& pReloc, 704fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout const LDSymbol& pInputSym, 714fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout MCLinker& pLinker, 724fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout const MCLDInfo& pLDInfo, 73c4788eac909f51e73e05885314d3ace65d0a2f26bulic const Output& pOutput, 744fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout const LDSection& pSection) = 0; 754fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout 764fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout // ----- format dependent ----- // 774fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout virtual bool initArchiveReader(MCLinker&, MCLDInfo&) = 0; 784fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout virtual bool initObjectReader(MCLinker&) = 0; 794fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout virtual bool initDynObjReader(MCLinker&) = 0; 804fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout virtual bool initObjectWriter(MCLinker&) = 0; 814fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout virtual bool initDynObjWriter(MCLinker&) = 0; 824fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout virtual bool initExecWriter(MCLinker&) = 0; 834fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout 844fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout virtual bool initExecSections(MCLinker&) = 0; 854fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout virtual bool initDynObjSections(MCLinker&) = 0; 864fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout 874fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout virtual ArchiveReader *getArchiveReader() = 0; 884fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout virtual ObjectReader *getObjectReader() = 0; 894fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout virtual DynObjReader *getDynObjReader() = 0; 904fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout virtual ObjectWriter *getObjectWriter() = 0; 914fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout virtual DynObjWriter *getDynObjWriter() = 0; 924fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout virtual ExecWriter *getExecWriter() = 0; 934fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout 944fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout virtual LDFileFormat* getDynObjFileFormat() = 0; 954fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout virtual LDFileFormat* getExecFileFormat() = 0; 964fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout 974fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout /// preLayout - Backend can do any needed modification before layout 984fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout virtual void preLayout(const Output& pOutput, 994fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout const MCLDInfo& pInfo, 1004fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout MCLinker& pLinker) = 0; 1014fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout 1024fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout /// postLayout -Backend can do any needed modification after layout 1034fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout virtual void postLayout(const Output& pOutput, 1044fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout const MCLDInfo& pInfo, 1054fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout MCLinker& pLinker) = 0; 1064fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout 1074fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout /// postProcessing - Backend can do any needed modification in the final stage 1084fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout virtual void postProcessing(const Output& pOutput, 1094fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout const MCLDInfo& pInfo, 1104fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout MCLinker& pLinker) = 0; 1114fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout 1124fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout /// Is the target machine little endian? **/ 1134fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout virtual bool isLittleEndian() const = 0; 1144fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout 1154fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout /// bit class. the bit length of the target machine, 32 or 64 **/ 1164fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout virtual unsigned int bitclass() const = 0; 1174fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout 1184fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout /// the common page size of the target machine 1194fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout virtual uint64_t commonPageSize(const MCLDInfo& pInfo) const = 0; 1204fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout 1214fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout /// the abi page size of the target machine 122aadb8928f5920c758c1a385bbc8b8b128a60657cCraig Stout virtual uint64_t abiPageSize(const MCLDInfo& pInfo) const = 0; 123aadb8928f5920c758c1a385bbc8b8b128a60657cCraig Stout 124aadb8928f5920c758c1a385bbc8b8b128a60657cCraig Stout /// section start offset in the output file 125aadb8928f5920c758c1a385bbc8b8b128a60657cCraig Stout virtual size_t sectionStartOffset() const = 0; 126aadb8928f5920c758c1a385bbc8b8b128a60657cCraig Stout 127aadb8928f5920c758c1a385bbc8b8b128a60657cCraig Stout /// computeSectionOrder - compute the layout order of the given section 128aadb8928f5920c758c1a385bbc8b8b128a60657cCraig Stout virtual unsigned int getSectionOrder(const Output& pOutput, 129aadb8928f5920c758c1a385bbc8b8b128a60657cCraig Stout const LDSection& pSectHdr, 130aadb8928f5920c758c1a385bbc8b8b128a60657cCraig Stout const MCLDInfo& pInfo) const = 0; 131aadb8928f5920c758c1a385bbc8b8b128a60657cCraig Stout 132e2679e4ccab0ce75f701629c22c179165df4f15eJerome Poichet /// sizeNamePools - compute the size of regular name pools 13369e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout /// In ELF executable files, regular name pools are .symtab, .strtab., 13469e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout /// .dynsym, .dynstr, and .hash 13569e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout virtual void 13669e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout sizeNamePools(const Output& pOutput, 13769e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout const SymbolCategory& pSymbols, 13869e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout const MCLDInfo& pLDInfo) = 0; 139c62efa44831b1c60dcbdfd968735e27ac8294439Craig Stout 14069e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout /// finalizeSymbol - Linker checks pSymbol.reserved() if it's not zero, 14169e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout /// then it will ask backend to finalize the symbol value. 14269e74bd8956577d9a3414b81ec661fd5fee42e19Craig Stout /// @return ture - if backend set the symbol value sucessfully 143c62efa44831b1c60dcbdfd968735e27ac8294439Craig Stout /// @return false - if backend do not recognize the symbol 144c62efa44831b1c60dcbdfd968735e27ac8294439Craig Stout virtual bool finalizeSymbols(MCLinker& pLinker, const Output& pOutput) = 0; 145c62efa44831b1c60dcbdfd968735e27ac8294439Craig Stout 146c62efa44831b1c60dcbdfd968735e27ac8294439Craig Stout /// allocateCommonSymbols - allocate common symbols in the corresponding 147c62efa44831b1c60dcbdfd968735e27ac8294439Craig Stout /// sections. 148e2679e4ccab0ce75f701629c22c179165df4f15eJerome Poichet virtual bool allocateCommonSymbols(const MCLDInfo& pLDInfo, MCLinker& pLinker) const = 0; 149e2679e4ccab0ce75f701629c22c179165df4f15eJerome Poichet 150e2679e4ccab0ce75f701629c22c179165df4f15eJerome Poichet /// readSection - read a target dependent section 151e2679e4ccab0ce75f701629c22c179165df4f15eJerome Poichet virtual bool readSection(Input& pInput, 152e2679e4ccab0ce75f701629c22c179165df4f15eJerome Poichet MCLinker& pLinker, 153937f910ceb3364a1b84899c2b5f1ff5384f38f84Jerome Poichet LDSection& pInputSectHdr) 154e2679e4ccab0ce75f701629c22c179165df4f15eJerome Poichet { return true; } 155e2679e4ccab0ce75f701629c22c179165df4f15eJerome Poichet 156937f910ceb3364a1b84899c2b5f1ff5384f38f84Jerome Poichet /// dyld - the name of the default dynamic linker 157937f910ceb3364a1b84899c2b5f1ff5384f38f84Jerome Poichet virtual const char* dyld() const = 0; 158e2679e4ccab0ce75f701629c22c179165df4f15eJerome Poichet 1595a59bde085588f95dc067bd1ed64a940f355343cbulic /// sizeInterp - compute the size of program interpreter's name 1605a59bde085588f95dc067bd1ed64a940f355343cbulic /// In ELF executables, this is the length of dynamic linker's path name 161e2679e4ccab0ce75f701629c22c179165df4f15eJerome Poichet virtual void sizeInterp(const Output& pOutput, const MCLDInfo& pLDInfo) = 0; 162e2679e4ccab0ce75f701629c22c179165df4f15eJerome Poichet 1634c696a0ad561090035960c2f34a058562c7f2aadCraig Stoutpublic: 164558f7b70035c50045908efca5f4f3d65df685cacCraig Stout EhFrame* getEhFrame(); 165558f7b70035c50045908efca5f4f3d65df685cacCraig Stout 166e2679e4ccab0ce75f701629c22c179165df4f15eJerome Poichet const EhFrame* getEhFrame() const; 167ed57770cf2211040bffe0bddd55e7c28fb47a42aJerome Poichet 168ed57770cf2211040bffe0bddd55e7c28fb47a42aJerome Poichetprivate: 169ed57770cf2211040bffe0bddd55e7c28fb47a42aJerome Poichet /// m_pEhFrame - section .eh_frame 170ed57770cf2211040bffe0bddd55e7c28fb47a42aJerome Poichet EhFrame* m_pEhFrame; 17144f004b2612b04510a09a4c1e33f5a109582d669Craig Stout 17244f004b2612b04510a09a4c1e33f5a109582d669Craig Stout}; 173c62efa44831b1c60dcbdfd968735e27ac8294439Craig Stout 174c62efa44831b1c60dcbdfd968735e27ac8294439Craig Stout} // End mcld namespace 175c62efa44831b1c60dcbdfd968735e27ac8294439Craig Stout 176c62efa44831b1c60dcbdfd968735e27ac8294439Craig Stout#endif 177ed57770cf2211040bffe0bddd55e7c28fb47a42aJerome Poichet