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