1//===- FragmentRef.h ------------------------------------------------------===// 2// 3// The MCLinker Project 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9#ifndef MCLD_FRAGMENT_FRAGMENT_REFERENCE_H 10#define MCLD_FRAGMENT_FRAGMENT_REFERENCE_H 11#ifdef ENABLE_UNITTEST 12#include <gtest.h> 13#endif 14 15#include <mcld/Config/Config.h> 16#include <mcld/ADT/SizeTraits.h> 17#include <mcld/ADT/TypeTraits.h> 18#include <mcld/Support/Allocators.h> 19 20namespace mcld { 21 22class Fragment; 23class LDSection; 24class Layout; 25 26/** \class FragmentRef 27 * \brief FragmentRef is a reference of a Fragment's contetnt. 28 * 29 */ 30class FragmentRef 31{ 32public: 33 typedef uint64_t Offset; // FIXME: use SizeTraits<T>::Offset 34 typedef NonConstTraits<unsigned char>::pointer Address; 35 typedef ConstTraits<unsigned char>::pointer ConstAddress; 36 37public: 38 /// Create - create a fragment reference for a given fragment. 39 /// 40 /// @param pFrag - the given fragment 41 /// @param pOffset - the offset, can be larger than the fragment, but can not 42 /// be larger than the section size. 43 /// @return if the offset is legal, return the fragment reference. Otherwise, 44 /// return NULL. 45 static FragmentRef* Create(Fragment& pFrag, uint64_t pOffset); 46 47 static FragmentRef* Create(LDSection& pSection, uint64_t pOffset); 48 49 /// Clear - clear all generated FragmentRef in the system. 50 static void Clear(); 51 52 static FragmentRef* Null(); 53 54 // ----- modifiers ----- // 55 FragmentRef& assign(const FragmentRef& pCopy); 56 57 FragmentRef& assign(Fragment& pFrag, Offset pOffset = 0); 58 59 /// memcpy - copy memory 60 /// copy memory from the fragment to the pDesc. 61 /// @pDest - the destination address 62 /// @pNBytes - copies pNBytes from the fragment[offset()+pOffset] 63 /// @pOffset - additional offset. 64 /// the start address offset from fragment[offset()] 65 void memcpy(void* pDest, size_t pNBytes, Offset pOffset = 0) const; 66 67 // ----- observers ----- // 68 bool isNull() const { return (this == Null()); } 69 70 Fragment* frag() 71 { return m_pFragment; } 72 73 const Fragment* frag() const 74 { return m_pFragment; } 75 76 Offset offset() const 77 { return m_Offset; } 78 79 Offset getOutputOffset() const; 80 81 // ----- dereference ----- // 82 Address deref(); 83 84 ConstAddress deref() const; 85 86 Address operator*() 87 { return deref(); } 88 89 ConstAddress operator*() const 90 { return deref(); } 91 92private: 93 friend FragmentRef& NullFragmentRef(); 94 friend class Chunk<FragmentRef, MCLD_SECTIONS_PER_INPUT>; 95 friend class Relocation; 96 97 FragmentRef(); 98 99 FragmentRef(Fragment& pFrag, Offset pOffset = 0); 100 101private: 102 Fragment* m_pFragment; 103 Offset m_Offset; 104 105 static FragmentRef g_NullFragmentRef; 106 107}; 108 109} // namespace of mcld 110 111#endif 112 113