Home | History | Annotate | Download | only in Fragment
      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 
     17 namespace mcld {
     18 
     19 class Fragment;
     20 class LDSection;
     21 class Layout;
     22 
     23 /** \class FragmentRef
     24  *  \brief FragmentRef is a reference of a Fragment's contetnt.
     25  *
     26  */
     27 class 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