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