FragmentRef.h revision 37b74a387bb3993387029859c2d9d051c41c724e
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_FRAGMENTREF_H_ 10#define MCLD_FRAGMENT_FRAGMENTREF_H_ 11 12#include "mcld/ADT/SizeTraits.h" 13#include "mcld/ADT/TypeTraits.h" 14#include "mcld/Config/Config.h" 15#include "mcld/Support/Allocators.h" 16 17namespace mcld { 18 19class Fragment; 20class LDSection; 21class Layout; 22 23/** \class FragmentRef 24 * \brief FragmentRef is a reference of a Fragment's contetnt. 25 * 26 */ 27class FragmentRef { 28 public: 29 typedef uint64_t Offset; // FIXME: use SizeTraits<T>::Offset 30 typedef NonConstTraits<unsigned char>::pointer Address; 31 typedef ConstTraits<unsigned char>::pointer ConstAddress; 32 33 public: 34 /// Create - create a fragment reference for a given fragment. 35 /// 36 /// @param pFrag - the given fragment 37 /// @param pOffset - the offset, can be larger than the fragment, but can not 38 /// be larger than the section size. 39 /// @return if the offset is legal, return the fragment reference. Otherwise, 40 /// return NULL. 41 static FragmentRef* Create(Fragment& pFrag, uint64_t pOffset); 42 43 static FragmentRef* Create(LDSection& pSection, uint64_t pOffset); 44 45 /// Clear - clear all generated FragmentRef in the system. 46 static void Clear(); 47 48 static FragmentRef* Null(); 49 50 // ----- modifiers ----- // 51 FragmentRef& assign(const FragmentRef& pCopy); 52 53 FragmentRef& assign(Fragment& pFrag, Offset pOffset = 0); 54 55 /// memcpy - copy memory 56 /// copy memory from the fragment to the pDesc. 57 /// @pDest - the destination address 58 /// @pNBytes - copies pNBytes from the fragment[offset()+pOffset] 59 /// @pOffset - additional offset. 60 /// the start address offset from fragment[offset()] 61 void memcpy(void* pDest, size_t pNBytes, Offset pOffset = 0) const; 62 63 // ----- observers ----- // 64 bool isNull() const { return (this == Null()); } 65 66 Fragment* frag() { return m_pFragment; } 67 68 const Fragment* frag() const { return m_pFragment; } 69 70 Offset offset() const { return m_Offset; } 71 72 Offset getOutputOffset() const; 73 74 private: 75 friend FragmentRef& NullFragmentRef(); 76 friend class Chunk<FragmentRef, MCLD_SECTIONS_PER_INPUT>; 77 friend class Relocation; 78 79 FragmentRef(); 80 81 explicit FragmentRef(Fragment& pFrag, Offset pOffset = 0); 82 83 private: 84 Fragment* m_pFragment; 85 86 Offset m_Offset; 87 88 static FragmentRef g_NullFragmentRef; 89}; 90 91} // namespace mcld 92 93#endif // MCLD_FRAGMENT_FRAGMENTREF_H_ 94