16f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===- HexagonLDBackend.h -------------------------------------------------===//
26f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//
36f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//                     The MCLinker Project
46f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//
56f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// This file is distributed under the University of Illinois Open Source
66f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// License. See LICENSE.TXT for details.
76f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//
86f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===//
9551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#ifndef TARGET_HEXAGON_HEXAGONLDBACKEND_H
10551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#define TARGET_HEXAGON_HEXAGONLDBACKEND_H
116f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
126f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include "HexagonELFDynamic.h"
136f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include "HexagonGOT.h"
146f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include "HexagonPLT.h"
15f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines#include "HexagonGOTPLT.h"
16f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines#include <mcld/IRBuilder.h>
17f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines#include <mcld/LinkerConfig.h>
186f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <mcld/LD/LDSection.h>
19f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines#include <mcld/Object/ObjectBuilder.h>
206f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <mcld/Target/GNULDBackend.h>
216f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <mcld/Target/OutputRelocSection.h>
226f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
236f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesnamespace mcld {
246f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
256f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass LinkerConfig;
266f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass HexagonGNUInfo;
276f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
286f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===//
296f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines/// HexagonLDBackend - linker backend of Hexagon target of GNU ELF format
306f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines///
316f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass HexagonLDBackend : public GNULDBackend
326f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{
336f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinespublic:
346f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  HexagonLDBackend(const LinkerConfig& pConfig, HexagonGNUInfo* pInfo);
356f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
366f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  ~HexagonLDBackend();
376f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
386f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  uint32_t machine() const;
396f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
406f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  HexagonGOT& getGOT();
416f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
426f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  const HexagonGOT& getGOT() const;
436f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
446f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  HexagonPLT& getPLT();
456f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
466f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  const HexagonPLT& getPLT() const;
476f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
486f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// preLayout - Backend can do any needed modification before layout
496f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  void doPreLayout(IRBuilder& pBuilder);
506f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
51f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  bool allocateCommonSymbols(Module& pModule);
52f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
536f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// postLayout - Backend can do any needed modification after layout
546f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  void doPostLayout(Module& pModule, IRBuilder& pBuilder);
556f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
566f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// dynamic - the dynamic section of the target machine.
576f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// Use co-variant return type to return its own dynamic section.
586f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  HexagonELFDynamic& dynamic();
596f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
606f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// dynamic - the dynamic section of the target machine.
616f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// Use co-variant return type to return its own dynamic section.
626f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  const HexagonELFDynamic& dynamic() const;
636f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
646f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// emitSectionData - write out the section data into the memory region.
656f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// When writers get a LDSection whose kind is LDFileFormat::Target, writers
666f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// call back target backend to emit the data.
676f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  ///
686f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// Backends handle the target-special tables (plt, gp,...) by themselves.
696f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// Backend can put the data of the tables in MCSectionData directly
706f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  ///  - LDSection.getSectionData can get the section data.
716f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// Or, backend can put the data into special data structure
726f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  ///  - backend can maintain its own map<LDSection, table> to get the table
736f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// from given LDSection.
746f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  ///
756f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// @param pSection - the given LDSection
766f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// @param pLayout - for comouting the size of fragment
776f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// @param pRegion - the region to write out data
786f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// @return the size of the table in the file.
796f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  uint64_t emitSectionData(const LDSection& pSection,
806f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines                           MemoryRegion& pRegion) const;
816f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
826f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// initRelocator - create and initialize Relocator.
836f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  bool initRelocator();
846f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
856f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// getRelocator - return relocator.
86a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines  const Relocator* getRelocator() const;
876f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  Relocator* getRelocator();
886f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
896f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  ResolveInfo::Desc getSymDesc(uint16_t shndx) const
906f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  {
916f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    if (shndx >= llvm::ELF::SHN_HEXAGON_SCOMMON &&
926f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines        shndx <= llvm::ELF::SHN_HEXAGON_SCOMMON_8)
936f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines      return ResolveInfo::Common;
946f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    return ResolveInfo::NoneDesc;
956f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  }
966f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
976f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  void initTargetSections(Module& pModule, ObjectBuilder& pBuilder);
986f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
996f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  void initTargetSymbols(IRBuilder& pBuilder, Module& pModule);
1006f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
101f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  bool initBRIslandFactory();
102f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
103f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  bool initStubFactory();
104f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
105f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  bool mayRelax() { return true; }
106f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
107f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  bool doRelax(Module& pModule, IRBuilder& pBuilder, bool& pFinished);
108f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
109f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  bool initTargetStubs();
110f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
111f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  OutputRelocSection& getRelaDyn();
112f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
113f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  const OutputRelocSection& getRelaDyn() const;
1146f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
115f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  HexagonGOTPLT& getGOTPLT();
1166f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
117f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  const HexagonGOTPLT& getGOTPLT() const;
1186f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
119f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  OutputRelocSection& getRelaPLT();
1206f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
121f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  const OutputRelocSection& getRelaPLT() const;
1226f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1236f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// getTargetSectionOrder - compute the layout order of Hexagon target section
1246f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  unsigned int getTargetSectionOrder(const LDSection& pSectHdr) const;
1256f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1266f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// finalizeTargetSymbols - finalize the symbol value
1276f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  bool finalizeTargetSymbols();
1286f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
129f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// mergeSection - merge target dependent sections
13087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  bool mergeSection(Module& pModule, const Input& pInput, LDSection& pSection);
1316f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
132f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// readSection - read target dependent sections
133f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  bool readSection(Input& pInput, SectionData& pSD);
134f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
135f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  bool MoveCommonData(SectionData &pFrom, SectionData &pTo);
136f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
137f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  bool MoveSectionDataAndSort(SectionData& pFrom, SectionData& pTo);
138f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
139f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  bool SetSDataSection();
140f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
141f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  uint32_t getGP() { return m_psdata->addr(); }
142f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
143f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  Relocation::Type getCopyRelType()    const { return m_CopyRel;    }
1446f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
145f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  virtual uint32_t getGOTSymbolAddr() {
146f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    return m_pGOTSymbol->value();
147f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  }
148f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
149f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
150f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesprotected:
151f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  void defineGOTSymbol(IRBuilder& pBuilder, Fragment&);
152f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
153f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesprivate:
1546f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// getRelEntrySize - the size in BYTE of rela type relocation
155f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  size_t getRelEntrySize()
156f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  { return 0; }
157f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
158f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// getRelaEntrySize - the size in BYTE of rela type relocation
1596f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  size_t getRelaEntrySize()
1606f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { return 12; }
1616f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1626f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// doCreateProgramHdrs - backend can implement this function to create the
1636f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// target-dependent segments
1646f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  void doCreateProgramHdrs(Module& pModule);
1656f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
166a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines  /// maxFwdBranchOffset
167a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines  int64_t maxFwdBranchOffset() { return ~(~0 << 6); }
168f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
169f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  virtual void setGOTSectionSize(IRBuilder& pBuilder);
170f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
171f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  virtual uint64_t emitGOTSectionData(MemoryRegion& pRegion) const;
172f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
173f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  virtual uint64_t emitGOTPLTSectionData(MemoryRegion& pRegion,
174551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines                                         const ELFFileFormat* FileFormat) const;
175f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
176f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  virtual void setRelaDynSize();
177f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  virtual void setRelaPLTSize();
178f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
1796f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesprivate:
1806f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  Relocator* m_pRelocator;
1816f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  HexagonGOT* m_pGOT;
182f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  HexagonGOTPLT* m_pGOTPLT;
1836f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  HexagonPLT* m_pPLT;
184f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// m_RelaDyn - dynamic relocation table of .rela.dyn
185f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  OutputRelocSection* m_pRelaDyn;
186f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// m_RelaPLT - dynamic relocation table of .rela.plt
187f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  OutputRelocSection* m_pRelaPLT;
1886f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1896f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  HexagonELFDynamic* m_pDynamic;
190f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
191f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  LDSection* m_psdata;
192f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  LDSection* m_pscommon_1;
193f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  LDSection* m_pscommon_2;
194f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  LDSection* m_pscommon_4;
195f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  LDSection* m_pscommon_8;
196f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  LDSection* m_pstart;
197f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  LDSymbol* m_psdabase;
198f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
1996f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  LDSymbol* m_pGOTSymbol;
2006f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  LDSymbol* m_pBSSEnd;
201f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  Relocation::Type m_CopyRel;
2026f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines};
2036f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} // namespace of mcld
2046f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
2056f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#endif
2066f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
207