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