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