//===- FragmentRef.h ------------------------------------------------------===// // // The MCLinker Project // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef MCLD_FRAGMENT_FRAGMENTREF_H_ #define MCLD_FRAGMENT_FRAGMENTREF_H_ #include "mcld/ADT/SizeTraits.h" #include "mcld/ADT/TypeTraits.h" #include "mcld/Config/Config.h" #include "mcld/Support/Allocators.h" namespace mcld { class Fragment; class LDSection; class Layout; /** \class FragmentRef * \brief FragmentRef is a reference of a Fragment's contetnt. * */ class FragmentRef { public: typedef uint64_t Offset; // FIXME: use SizeTraits<T>::Offset typedef NonConstTraits<unsigned char>::pointer Address; typedef ConstTraits<unsigned char>::pointer ConstAddress; public: /// Create - create a fragment reference for a given fragment. /// /// @param pFrag - the given fragment /// @param pOffset - the offset, can be larger than the fragment, but can not /// be larger than the section size. /// @return if the offset is legal, return the fragment reference. Otherwise, /// return NULL. static FragmentRef* Create(Fragment& pFrag, uint64_t pOffset); static FragmentRef* Create(LDSection& pSection, uint64_t pOffset); /// Clear - clear all generated FragmentRef in the system. static void Clear(); static FragmentRef* Null(); // ----- modifiers ----- // FragmentRef& assign(const FragmentRef& pCopy); FragmentRef& assign(Fragment& pFrag, Offset pOffset = 0); /// memcpy - copy memory /// copy memory from the fragment to the pDesc. /// @pDest - the destination address /// @pNBytes - copies pNBytes from the fragment[offset()+pOffset] /// @pOffset - additional offset. /// the start address offset from fragment[offset()] void memcpy(void* pDest, size_t pNBytes, Offset pOffset = 0) const; // ----- observers ----- // bool isNull() const { return (this == Null()); } Fragment* frag() { return m_pFragment; } const Fragment* frag() const { return m_pFragment; } Offset offset() const { return m_Offset; } Offset getOutputOffset() const; private: friend FragmentRef& NullFragmentRef(); friend class Chunk<FragmentRef, MCLD_SECTIONS_PER_INPUT>; friend class Relocation; FragmentRef(); explicit FragmentRef(Fragment& pFrag, Offset pOffset = 0); private: Fragment* m_pFragment; Offset m_Offset; static FragmentRef g_NullFragmentRef; }; } // namespace mcld #endif // MCLD_FRAGMENT_FRAGMENTREF_H_