TargetLDBackend.h revision f7ac0f19a1c8d0ad14bcf6456ce368b830fea886
15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===-- llvm/Target/TargetLDBackend.h - Target LD Backend -----*- C++ -*-===//
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//===----------------------------------------------------------------------===//
922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#ifndef MCLD_TARGET_TARGETLDBACKEND_H
1022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#define MCLD_TARGET_TARGETLDBACKEND_H
115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/Support/DataTypes.h>
135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace mcld {
155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass Module;
1722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass LinkerConfig;
18d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaoclass IRBuilder;
195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass Relocation;
205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass RelocationFactory;
21d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaoclass Relocator;
225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass Layout;
235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass ArchiveReader;
245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass ObjectReader;
255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass DynObjReader;
26d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaoclass BinaryReader;
275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass ObjectWriter;
285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass DynObjWriter;
29affc150dc44fab1911775a49636d0ce85333b634Zonr Changclass ExecWriter;
30d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaoclass BinaryWriter;
315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass LDFileFormat;
3222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass LDSymbol;
3322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass LDSection;
3422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass SectionData;
3522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass Input;
365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass GOT;
3722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass MemoryArea;
38cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoclass MemoryAreaFactory;
3922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass BranchIslandFactory;
4022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass StubFactory;
4122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass ObjectBuilder;
425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===//
445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// TargetLDBackend - Generic interface to target specific assembler backends.
4522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===//
465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass TargetLDBackend
475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  TargetLDBackend(const TargetLDBackend &);   // DO NOT IMPLEMENT
495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  void operator=(const TargetLDBackend &);  // DO NOT IMPLEMENT
505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprotected:
5222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  TargetLDBackend(const LinkerConfig& pConfig);
535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic:
555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  virtual ~TargetLDBackend();
565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // -----  target dependent  ----- //
586f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual void initTargetSegments(IRBuilder& pBuilder) { }
5922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  virtual void initTargetSections(Module& pModule, ObjectBuilder& pBuilder) { }
606f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual void initTargetSymbols(IRBuilder& pBuilder, Module& pModule) { }
616f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual void initTargetRelocation(IRBuilder& pBuilder) { }
626f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual bool initStandardSymbols(IRBuilder& pBuilder, Module& pModule) = 0;
635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
646f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual bool initRelocator() = 0;
65d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
66d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  virtual Relocator* getRelocator() = 0;
675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // -----  format dependent  ----- //
6922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  virtual ArchiveReader* createArchiveReader(Module&) = 0;
70d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  virtual ObjectReader*  createObjectReader(IRBuilder&) = 0;
71d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  virtual DynObjReader*  createDynObjReader(IRBuilder&) = 0;
72d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  virtual BinaryReader*  createBinaryReader(IRBuilder&) = 0;
736f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual ObjectWriter*  createWriter() = 0;
7422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
7522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  virtual bool initStdSections(ObjectBuilder& pBuilder) = 0;
765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
77d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  /// layout - layout method
786f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual void layout(Module& pModule) = 0;
79d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// preLayout - Backend can do any needed modification before layout
816f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual void preLayout(Module& pModule, IRBuilder& pBuilder) = 0;
825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
836f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// postLayout - Backend can do any needed modification after layout
846f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual void postLayout(Module& pModule, IRBuilder& pBuilder) = 0;
855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
86affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// postProcessing - Backend can do any needed modification in the final stage
876f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual void postProcessing(MemoryArea& pOutput) = 0;
885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// section start offset in the output file
905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  virtual size_t sectionStartOffset() const = 0;
915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// computeSectionOrder - compute the layout order of the given section
9322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  virtual unsigned int getSectionOrder(const LDSection& pSectHdr) const = 0;
945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// sizeNamePools - compute the size of regular name pools
965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// In ELF executable files, regular name pools are .symtab, .strtab.,
975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// .dynsym, .dynstr, and .hash
98f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  virtual void sizeNamePools(Module& pModule) = 0;
995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// finalizeSymbol - Linker checks pSymbol.reserved() if it's not zero,
1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// then it will ask backend to finalize the symbol value.
1025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// @return ture - if backend set the symbol value sucessfully
1035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// @return false - if backend do not recognize the symbol
1046f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual bool finalizeSymbols() = 0;
10522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
10622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// finalizeTLSSymbol - Linker asks backend to set the symbol value when it
10722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// meets a TLS symbol
10822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  virtual bool finalizeTLSSymbol(LDSymbol& pSymbol) = 0;
1095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// allocateCommonSymbols - allocate common symbols in the corresponding
1115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// sections.
11222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  virtual bool allocateCommonSymbols(Module& pModule) = 0;
11322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
11422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// mergeSection - merge target dependent sections.
11522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  virtual bool mergeSection(Module& pModule, LDSection& pInputSection)
11622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  { return true; }
1175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1186f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// updateSectionFlags - update pTo's flags when merging pFrom
1196f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// update the output section flags based on input section flags.
1206f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// FIXME: (Luba) I know ELF need to merge flags, but I'm not sure if
1216f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// MachO and COFF also need this.
1226f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual bool updateSectionFlags(LDSection& pTo, const LDSection& pFrom)
1236f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { return true; }
1246f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// readSection - read a target dependent section
12622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  virtual bool readSection(Input& pInput, SectionData& pSD)
1275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { return true; }
1285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
129affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// sizeInterp - compute the size of program interpreter's name
130affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// In ELF executables, this is the length of dynamic linker's path name
13122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  virtual void sizeInterp() = 0;
132affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
13322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // -----  relaxation  ----- //
13422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  virtual bool initBRIslandFactory() = 0;
13522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  virtual bool initStubFactory() = 0;
1366f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual bool initTargetStubs() { return true; }
137affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
13822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  virtual BranchIslandFactory* getBRIslandFactory() = 0;
13922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  virtual StubFactory*         getStubFactory() = 0;
140affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
14122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// relax - the relaxation pass
1426f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual bool relax(Module& pModule, IRBuilder& pBuilder) = 0;
143affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
14422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// mayRelax - return true if the backend needs to do relaxation
14522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  virtual bool mayRelax() = 0;
14622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
14722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoprotected:
14822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const LinkerConfig& config() const { return m_Config; }
14922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
15022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoprivate:
15122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const LinkerConfig& m_Config;
1525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao};
1535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // End mcld namespace
1555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif
157