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