FragmentRef.h revision 22add6ff3426df1a85089fe6a6e1597ee3b6f300
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