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