TargetLDBackend.h revision a6c24dff8b7fa2551a3a885e77a2e814f5b764a2
187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines//===-- 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//===----------------------------------------------------------------------===//
937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#ifndef MCLD_TARGET_TARGETLDBACKEND_H_
1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#define MCLD_TARGET_TARGETLDBACKEND_H_
1137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/GarbageCollection.h"
1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/Compiler.h"
135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <llvm/ADT/StringRef.h>
155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/Support/DataTypes.h>
165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace mcld {
185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass ArchiveReader;
2037b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass BranchIslandFactory;
21d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaoclass BinaryReader;
2287f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass BinaryWriter;
2387f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass DynObjReader;
245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass DynObjWriter;
25affc150dc44fab1911775a49636d0ce85333b634Zonr Changclass ExecWriter;
2687f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass FileOutputBuffer;
2787f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass IRBuilder;
2887f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass Input;
2922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass LDSection;
3087f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass LDSymbol;
3187f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass LinkerConfig;
3287f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass Module;
3387f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass ObjectBuilder;
3487f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass ObjectReader;
3587f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass ObjectWriter;
3687f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass Relocator;
370dea6bc96bb52346737966839ac68644f7939f58Stephen Hinesclass ResolveInfo;
3822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass SectionData;
3937b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass SectionReachedListMap;
4022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass StubFactory;
415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===//
435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// TargetLDBackend - Generic interface to target specific assembler backends.
4422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===//
4537b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass TargetLDBackend {
4637b74a387bb3993387029859c2d9d051c41c724eStephen Hines protected:
4737b74a387bb3993387029859c2d9d051c41c724eStephen Hines  explicit TargetLDBackend(const LinkerConfig& pConfig);
485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4937b74a387bb3993387029859c2d9d051c41c724eStephen Hines public:
505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  virtual ~TargetLDBackend();
515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // -----  target dependent  ----- //
5337b74a387bb3993387029859c2d9d051c41c724eStephen Hines  virtual void initTargetSegments(IRBuilder& pBuilder) {}
5437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  virtual void initTargetSections(Module& pModule, ObjectBuilder& pBuilder) {}
5537b74a387bb3993387029859c2d9d051c41c724eStephen Hines  virtual void initTargetSymbols(IRBuilder& pBuilder, Module& pModule) {}
5637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  virtual void initTargetRelocation(IRBuilder& pBuilder) {}
576f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual bool initStandardSymbols(IRBuilder& pBuilder, Module& pModule) = 0;
585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
596f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual bool initRelocator() = 0;
60d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
61d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  virtual Relocator* getRelocator() = 0;
620dea6bc96bb52346737966839ac68644f7939f58Stephen Hines  virtual const Relocator* getRelocator() const = 0;
635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // -----  format dependent  ----- //
6522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  virtual ArchiveReader* createArchiveReader(Module&) = 0;
6637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  virtual ObjectReader* createObjectReader(IRBuilder&) = 0;
6737b74a387bb3993387029859c2d9d051c41c724eStephen Hines  virtual DynObjReader* createDynObjReader(IRBuilder&) = 0;
6837b74a387bb3993387029859c2d9d051c41c724eStephen Hines  virtual BinaryReader* createBinaryReader(IRBuilder&) = 0;
6937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  virtual ObjectWriter* createWriter() = 0;
7022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
7122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  virtual bool initStdSections(ObjectBuilder& pBuilder) = 0;
725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
73d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  /// layout - layout method
746f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual void layout(Module& pModule) = 0;
75d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// preLayout - Backend can do any needed modification before layout
776f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual void preLayout(Module& pModule, IRBuilder& pBuilder) = 0;
785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
796f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// postLayout - Backend can do any needed modification after layout
806f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual void postLayout(Module& pModule, IRBuilder& pBuilder) = 0;
815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
82affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// postProcessing - Backend can do any needed modification in the final stage
8387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  virtual void postProcessing(FileOutputBuffer& pOutput) = 0;
845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// section start offset in the output file
865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  virtual size_t sectionStartOffset() const = 0;
875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// computeSectionOrder - compute the layout order of the given section
8922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  virtual unsigned int getSectionOrder(const LDSection& pSectHdr) const = 0;
905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// sizeNamePools - compute the size of regular name pools
925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// In ELF executable files, regular name pools are .symtab, .strtab.,
935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// .dynsym, .dynstr, and .hash
94f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  virtual void sizeNamePools(Module& pModule) = 0;
955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// finalizeSymbol - Linker checks pSymbol.reserved() if it's not zero,
975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// then it will ask backend to finalize the symbol value.
985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// @return ture - if backend set the symbol value sucessfully
995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// @return false - if backend do not recognize the symbol
1006f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual bool finalizeSymbols() = 0;
10122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
10222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// finalizeTLSSymbol - Linker asks backend to set the symbol value when it
10322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// meets a TLS symbol
10422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  virtual bool finalizeTLSSymbol(LDSymbol& pSymbol) = 0;
1055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// allocateCommonSymbols - allocate common symbols in the corresponding
1075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// sections.
10822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  virtual bool allocateCommonSymbols(Module& pModule) = 0;
10922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
110a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines  /// preMergeSections - hooks to be executed before merging sections
111a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines  virtual void preMergeSections(Module& pModule) { }
112a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines
113a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines  /// postMergeSections - hooks to be executed after merging sections
114a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines  virtual void postMergeSections(Module& pModule) { }
115a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines
11622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// mergeSection - merge target dependent sections.
11787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  virtual bool mergeSection(Module& pModule,
11887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                            const Input& pInputFile,
11937b74a387bb3993387029859c2d9d051c41c724eStephen Hines                            LDSection& pInputSection) {
12037b74a387bb3993387029859c2d9d051c41c724eStephen Hines    return true;
12137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  }
1225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
12387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// setUpReachedSectionsForGC - set the reference between two sections for
12487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// some special target sections. GC will set up the reference for the Regular
12587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// and BSS sections. Backends can also set up the reference if need.
12637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  virtual void setUpReachedSectionsForGC(
12737b74a387bb3993387029859c2d9d051c41c724eStephen Hines      const Module& pModule,
12837b74a387bb3993387029859c2d9d051c41c724eStephen Hines      GarbageCollection::SectionReachedListMap& pSectReachedListMap) const {}
12987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
1306f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// updateSectionFlags - update pTo's flags when merging pFrom
1316f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// update the output section flags based on input section flags.
1326f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// FIXME: (Luba) I know ELF need to merge flags, but I'm not sure if
1336f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// MachO and COFF also need this.
13437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  virtual bool updateSectionFlags(LDSection& pTo, const LDSection& pFrom) {
13537b74a387bb3993387029859c2d9d051c41c724eStephen Hines    return true;
13637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  }
1376f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// readSection - read a target dependent section
13937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  virtual bool readSection(Input& pInput, SectionData& pSD) { return true; }
1405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
141affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// sizeInterp - compute the size of program interpreter's name
142affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// In ELF executables, this is the length of dynamic linker's path name
14322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  virtual void sizeInterp() = 0;
144affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
14587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// getEntry - get the entry point name
14687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  virtual llvm::StringRef getEntry(const Module& pModule) const = 0;
14787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
14822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // -----  relaxation  ----- //
14922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  virtual bool initBRIslandFactory() = 0;
15022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  virtual bool initStubFactory() = 0;
1516f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual bool initTargetStubs() { return true; }
152affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
15322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  virtual BranchIslandFactory* getBRIslandFactory() = 0;
15437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  virtual StubFactory* getStubFactory() = 0;
155affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
15622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// relax - the relaxation pass
1576f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual bool relax(Module& pModule, IRBuilder& pBuilder) = 0;
158affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
15922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// mayRelax - return true if the backend needs to do relaxation
16022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  virtual bool mayRelax() = 0;
16122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
16287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// commonPageSize - the common page size of the target machine
16387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  virtual uint64_t commonPageSize() const = 0;
16487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
16587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// abiPageSize - the abi page size of the target machine
16687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  virtual uint64_t abiPageSize() const = 0;
16787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
16887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// sortRelocation - sort the dynamic relocations to let dynamic linker
16987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// process relocations more efficiently
17087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  virtual void sortRelocation(LDSection& pSection) = 0;
17187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
17287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// createAndSizeEhFrameHdr - This is seperated since we may add eh_frame
17387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// entry in the middle
17487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  virtual void createAndSizeEhFrameHdr(Module& pModule) = 0;
17587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
1760dea6bc96bb52346737966839ac68644f7939f58Stephen Hines  /// isSymbolPreemptible - whether the symbol can be preemted by other link
1770dea6bc96bb52346737966839ac68644f7939f58Stephen Hines  /// units
1780dea6bc96bb52346737966839ac68644f7939f58Stephen Hines  virtual bool isSymbolPreemptible(const ResolveInfo& pSym) const = 0;
1790dea6bc96bb52346737966839ac68644f7939f58Stephen Hines
1800dea6bc96bb52346737966839ac68644f7939f58Stephen Hines  /// mayHaveUnsafeFunctionPointerAccess - check if the section may have unsafe
1810dea6bc96bb52346737966839ac68644f7939f58Stephen Hines  /// function pointer access
18237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  virtual bool mayHaveUnsafeFunctionPointerAccess(
18337b74a387bb3993387029859c2d9d051c41c724eStephen Hines      const LDSection& pSection) const = 0;
1840dea6bc96bb52346737966839ac68644f7939f58Stephen Hines
18537b74a387bb3993387029859c2d9d051c41c724eStephen Hines protected:
18622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const LinkerConfig& config() const { return m_Config; }
18722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
18837b74a387bb3993387029859c2d9d051c41c724eStephen Hines private:
18922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const LinkerConfig& m_Config;
19037b74a387bb3993387029859c2d9d051c41c724eStephen Hines
19137b74a387bb3993387029859c2d9d051c41c724eStephen Hines private:
19237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  DISALLOW_COPY_AND_ASSIGN(TargetLDBackend);
1935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao};
1945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
19537b74a387bb3993387029859c2d9d051c41c724eStephen Hines}  // namespace mcld
1965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
19737b74a387bb3993387029859c2d9d051c41c724eStephen Hines#endif  // MCLD_TARGET_TARGETLDBACKEND_H_
198