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_ 1104c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines#include "mcld/Fragment/Relocation.h" 1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/GarbageCollection.h" 1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/Compiler.h" 1404c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines#include "mcld/Support/GCFactoryListTraits.h" 155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <llvm/ADT/StringRef.h> 1704c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines#include <llvm/ADT/ilist.h> 185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/Support/DataTypes.h> 195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace mcld { 215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass ArchiveReader; 23d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaoclass BinaryReader; 2487f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass BinaryWriter; 2504c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hinesclass BranchIslandFactory; 2687f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass DynObjReader; 275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass DynObjWriter; 28affc150dc44fab1911775a49636d0ce85333b634Zonr Changclass ExecWriter; 2987f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass FileOutputBuffer; 3087f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass IRBuilder; 3187f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass Input; 3222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass LDSection; 3387f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass LDSymbol; 3487f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass LinkerConfig; 3587f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass Module; 3687f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass ObjectBuilder; 3787f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass ObjectReader; 3887f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass ObjectWriter; 3987f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass Relocator; 400dea6bc96bb52346737966839ac68644f7939f58Stephen Hinesclass ResolveInfo; 4122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass SectionData; 4237b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass SectionReachedListMap; 4322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass StubFactory; 445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===// 465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// TargetLDBackend - Generic interface to target specific assembler backends. 4722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 4837b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass TargetLDBackend { 4904c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines public: 5004c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines typedef llvm::iplist<Relocation, GCFactoryListTraits<Relocation> > 5104c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines ExtraRelocList; 5204c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines typedef ExtraRelocList::iterator extra_reloc_iterator; 5304c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines 5437b74a387bb3993387029859c2d9d051c41c724eStephen Hines protected: 5537b74a387bb3993387029859c2d9d051c41c724eStephen Hines explicit TargetLDBackend(const LinkerConfig& pConfig); 565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 5737b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao virtual ~TargetLDBackend(); 595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // ----- target dependent ----- // 6137b74a387bb3993387029859c2d9d051c41c724eStephen Hines virtual void initTargetSegments(IRBuilder& pBuilder) {} 6237b74a387bb3993387029859c2d9d051c41c724eStephen Hines virtual void initTargetSections(Module& pModule, ObjectBuilder& pBuilder) {} 6337b74a387bb3993387029859c2d9d051c41c724eStephen Hines virtual void initTargetSymbols(IRBuilder& pBuilder, Module& pModule) {} 6437b74a387bb3993387029859c2d9d051c41c724eStephen Hines virtual void initTargetRelocation(IRBuilder& pBuilder) {} 656f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines virtual bool initStandardSymbols(IRBuilder& pBuilder, Module& pModule) = 0; 665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 676f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines virtual bool initRelocator() = 0; 68d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 69d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao virtual Relocator* getRelocator() = 0; 700dea6bc96bb52346737966839ac68644f7939f58Stephen Hines virtual const Relocator* getRelocator() const = 0; 715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // ----- format dependent ----- // 7322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao virtual ArchiveReader* createArchiveReader(Module&) = 0; 7437b74a387bb3993387029859c2d9d051c41c724eStephen Hines virtual ObjectReader* createObjectReader(IRBuilder&) = 0; 7537b74a387bb3993387029859c2d9d051c41c724eStephen Hines virtual DynObjReader* createDynObjReader(IRBuilder&) = 0; 7637b74a387bb3993387029859c2d9d051c41c724eStephen Hines virtual BinaryReader* createBinaryReader(IRBuilder&) = 0; 7737b74a387bb3993387029859c2d9d051c41c724eStephen Hines virtual ObjectWriter* createWriter() = 0; 7822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 7922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao virtual bool initStdSections(ObjectBuilder& pBuilder) = 0; 805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 81d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao /// layout - layout method 826f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines virtual void layout(Module& pModule) = 0; 83d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// preLayout - Backend can do any needed modification before layout 856f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines virtual void preLayout(Module& pModule, IRBuilder& pBuilder) = 0; 865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 876f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines /// postLayout - Backend can do any needed modification after layout 886f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines virtual void postLayout(Module& pModule, IRBuilder& pBuilder) = 0; 895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 90affc150dc44fab1911775a49636d0ce85333b634Zonr Chang /// postProcessing - Backend can do any needed modification in the final stage 9187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines virtual void postProcessing(FileOutputBuffer& pOutput) = 0; 925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// section start offset in the output file 945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao virtual size_t sectionStartOffset() const = 0; 955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// computeSectionOrder - compute the layout order of the given section 9722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao virtual unsigned int getSectionOrder(const LDSection& pSectHdr) const = 0; 985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// sizeNamePools - compute the size of regular name pools 1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// In ELF executable files, regular name pools are .symtab, .strtab., 1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// .dynsym, .dynstr, and .hash 102f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines virtual void sizeNamePools(Module& pModule) = 0; 1035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// finalizeSymbol - Linker checks pSymbol.reserved() if it's not zero, 1055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// then it will ask backend to finalize the symbol value. 1065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// @return ture - if backend set the symbol value sucessfully 1075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// @return false - if backend do not recognize the symbol 1086f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines virtual bool finalizeSymbols() = 0; 10922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 11022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// finalizeTLSSymbol - Linker asks backend to set the symbol value when it 11122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// meets a TLS symbol 11222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao virtual bool finalizeTLSSymbol(LDSymbol& pSymbol) = 0; 1135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// allocateCommonSymbols - allocate common symbols in the corresponding 1155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// sections. 11622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao virtual bool allocateCommonSymbols(Module& pModule) = 0; 11722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 118a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines /// preMergeSections - hooks to be executed before merging sections 119a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines virtual void preMergeSections(Module& pModule) { } 120a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines 121a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines /// postMergeSections - hooks to be executed after merging sections 122a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines virtual void postMergeSections(Module& pModule) { } 123a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines 12422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// mergeSection - merge target dependent sections. 12587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines virtual bool mergeSection(Module& pModule, 12687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const Input& pInputFile, 12737b74a387bb3993387029859c2d9d051c41c724eStephen Hines LDSection& pInputSection) { 12837b74a387bb3993387029859c2d9d051c41c724eStephen Hines return true; 12937b74a387bb3993387029859c2d9d051c41c724eStephen Hines } 1305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 13187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// setUpReachedSectionsForGC - set the reference between two sections for 13287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// some special target sections. GC will set up the reference for the Regular 13387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// and BSS sections. Backends can also set up the reference if need. 13437b74a387bb3993387029859c2d9d051c41c724eStephen Hines virtual void setUpReachedSectionsForGC( 13537b74a387bb3993387029859c2d9d051c41c724eStephen Hines const Module& pModule, 13637b74a387bb3993387029859c2d9d051c41c724eStephen Hines GarbageCollection::SectionReachedListMap& pSectReachedListMap) const {} 13787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 1386f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines /// updateSectionFlags - update pTo's flags when merging pFrom 1396f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines /// update the output section flags based on input section flags. 1406f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines /// FIXME: (Luba) I know ELF need to merge flags, but I'm not sure if 1416f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines /// MachO and COFF also need this. 14237b74a387bb3993387029859c2d9d051c41c724eStephen Hines virtual bool updateSectionFlags(LDSection& pTo, const LDSection& pFrom) { 14337b74a387bb3993387029859c2d9d051c41c724eStephen Hines return true; 14437b74a387bb3993387029859c2d9d051c41c724eStephen Hines } 1456f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 1465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// readSection - read a target dependent section 14737b74a387bb3993387029859c2d9d051c41c724eStephen Hines virtual bool readSection(Input& pInput, SectionData& pSD) { return true; } 1485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 149affc150dc44fab1911775a49636d0ce85333b634Zonr Chang /// sizeInterp - compute the size of program interpreter's name 150affc150dc44fab1911775a49636d0ce85333b634Zonr Chang /// In ELF executables, this is the length of dynamic linker's path name 15122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao virtual void sizeInterp() = 0; 152affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 15387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// getEntry - get the entry point name 15487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines virtual llvm::StringRef getEntry(const Module& pModule) const = 0; 15587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 15622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // ----- relaxation ----- // 15722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao virtual bool initBRIslandFactory() = 0; 15822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao virtual bool initStubFactory() = 0; 1596f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines virtual bool initTargetStubs() { return true; } 160affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 16122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao virtual BranchIslandFactory* getBRIslandFactory() = 0; 16237b74a387bb3993387029859c2d9d051c41c724eStephen Hines virtual StubFactory* getStubFactory() = 0; 163affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 16422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// relax - the relaxation pass 1656f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines virtual bool relax(Module& pModule, IRBuilder& pBuilder) = 0; 166affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 16722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// mayRelax - return true if the backend needs to do relaxation 16822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao virtual bool mayRelax() = 0; 16922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 17087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// commonPageSize - the common page size of the target machine 17187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines virtual uint64_t commonPageSize() const = 0; 17287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 17387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// abiPageSize - the abi page size of the target machine 17487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines virtual uint64_t abiPageSize() const = 0; 17587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 17687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// sortRelocation - sort the dynamic relocations to let dynamic linker 17787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// process relocations more efficiently 17887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines virtual void sortRelocation(LDSection& pSection) = 0; 17987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 18087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// createAndSizeEhFrameHdr - This is seperated since we may add eh_frame 18187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// entry in the middle 18287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines virtual void createAndSizeEhFrameHdr(Module& pModule) = 0; 18387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 1840dea6bc96bb52346737966839ac68644f7939f58Stephen Hines /// isSymbolPreemptible - whether the symbol can be preemted by other link 1850dea6bc96bb52346737966839ac68644f7939f58Stephen Hines /// units 1860dea6bc96bb52346737966839ac68644f7939f58Stephen Hines virtual bool isSymbolPreemptible(const ResolveInfo& pSym) const = 0; 1870dea6bc96bb52346737966839ac68644f7939f58Stephen Hines 1880dea6bc96bb52346737966839ac68644f7939f58Stephen Hines /// mayHaveUnsafeFunctionPointerAccess - check if the section may have unsafe 1890dea6bc96bb52346737966839ac68644f7939f58Stephen Hines /// function pointer access 19037b74a387bb3993387029859c2d9d051c41c724eStephen Hines virtual bool mayHaveUnsafeFunctionPointerAccess( 19137b74a387bb3993387029859c2d9d051c41c724eStephen Hines const LDSection& pSection) const = 0; 1920dea6bc96bb52346737966839ac68644f7939f58Stephen Hines 19304c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines extra_reloc_iterator extra_reloc_begin() { 19404c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines return m_ExtraReloc.begin(); 19504c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines } 19604c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines 19704c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines extra_reloc_iterator extra_reloc_end() { 19804c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines return m_ExtraReloc.end(); 19904c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines } 20004c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines 20137b74a387bb3993387029859c2d9d051c41c724eStephen Hines protected: 20222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const LinkerConfig& config() const { return m_Config; } 20322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 20404c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines /// addExtraRelocation - Add an extra relocation which are automatically 20504c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines /// generated by the LD backend. 20604c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines void addExtraRelocation(Relocation* reloc) { 20704c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines m_ExtraReloc.push_back(reloc); 20804c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines } 20904c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines 21037b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 21122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const LinkerConfig& m_Config; 21237b74a387bb3993387029859c2d9d051c41c724eStephen Hines 21304c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines /// m_ExtraReloc - Extra relocations that are automatically generated by the 21404c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines /// linker. 21504c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines ExtraRelocList m_ExtraReloc; 21604c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines 21737b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 21837b74a387bb3993387029859c2d9d051c41c724eStephen Hines DISALLOW_COPY_AND_ASSIGN(TargetLDBackend); 2195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 2205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 22137b74a387bb3993387029859c2d9d051c41c724eStephen Hines} // namespace mcld 2225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 22337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#endif // MCLD_TARGET_TARGETLDBACKEND_H_ 224