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