FragmentRef.h revision 551ae4ebd3e9d137ea668fb83ae4a55b8cfba451
1cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao//===- FragmentRef.h ------------------------------------------------------===//
2cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao//
3cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao//                     The MCLinker Project
4cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao//
5cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao// This file is distributed under the University of Illinois Open Source
6cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao// License. See LICENSE.TXT for details.
7cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao//
8cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao//===----------------------------------------------------------------------===//
987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#ifndef MCLD_FRAGMENT_FRAGMENTREF_H
1087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#define MCLD_FRAGMENT_FRAGMENTREF_H
11cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#ifdef ENABLE_UNITTEST
12cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <gtest.h>
13cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#endif
14cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
1522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Config/Config.h>
16cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <mcld/ADT/SizeTraits.h>
17cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <mcld/ADT/TypeTraits.h>
1822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Support/Allocators.h>
19cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
2022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaonamespace mcld {
21cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
2222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass Fragment;
2322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass LDSection;
24cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoclass Layout;
25cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
26cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/** \class FragmentRef
27cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao *  \brief FragmentRef is a reference of a Fragment's contetnt.
28cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao *
29cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao */
30cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoclass FragmentRef
31cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
32cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaopublic:
33cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  typedef uint64_t Offset; // FIXME: use SizeTraits<T>::Offset
34cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  typedef NonConstTraits<unsigned char>::pointer Address;
35cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  typedef ConstTraits<unsigned char>::pointer ConstAddress;
36cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
37cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaopublic:
3822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// Create - create a fragment reference for a given fragment.
3922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ///
4022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// @param pFrag - the given fragment
4122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// @param pOffset - the offset, can be larger than the fragment, but can not
4222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ///                  be larger than the section size.
4322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// @return if the offset is legal, return the fragment reference. Otherwise,
4422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// return NULL.
4522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  static FragmentRef* Create(Fragment& pFrag, uint64_t pOffset);
4622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
4722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  static FragmentRef* Create(LDSection& pSection, uint64_t pOffset);
4822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
4922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// Clear - clear all generated FragmentRef in the system.
5022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  static void Clear();
5122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
5222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  static FragmentRef* Null();
53cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
54cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  // -----  modifiers  ----- //
55cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  FragmentRef& assign(const FragmentRef& pCopy);
56cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
57cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  FragmentRef& assign(Fragment& pFrag, Offset pOffset = 0);
58cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
59cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// memcpy - copy memory
60cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// copy memory from the fragment to the pDesc.
61cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// @pDest - the destination address
62cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// @pNBytes - copies pNBytes from the fragment[offset()+pOffset]
63551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  /// @pOffset - additional offset.
64cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  ///            the start address offset from fragment[offset()]
65cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  void memcpy(void* pDest, size_t pNBytes, Offset pOffset = 0) const;
66cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
67cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  // -----  observers  ----- //
6822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  bool isNull() const { return (this == Null()); }
6922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
70cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  Fragment* frag()
71cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  { return m_pFragment; }
72cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
73cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  const Fragment* frag() const
74cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  { return m_pFragment; }
75cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
76cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  Offset offset() const
77cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  { return m_Offset; }
78cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
7922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Offset getOutputOffset() const;
8022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
8122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoprivate:
8222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  friend FragmentRef& NullFragmentRef();
8322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  friend class Chunk<FragmentRef, MCLD_SECTIONS_PER_INPUT>;
8422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  friend class Relocation;
8522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
8622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  FragmentRef();
8722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
8822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  FragmentRef(Fragment& pFrag, Offset pOffset = 0);
89551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
90cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoprivate:
91cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  Fragment* m_pFragment;
92cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  Offset m_Offset;
9322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
9422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  static FragmentRef g_NullFragmentRef;
9522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
96cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao};
97cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
98cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao} // namespace of mcld
99cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
100cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#endif
101cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
102