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 1222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Config/Config.h> 13cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <mcld/ADT/SizeTraits.h> 14cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <mcld/ADT/TypeTraits.h> 1522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Support/Allocators.h> 16cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 1722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaonamespace mcld { 18cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 1922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass Fragment; 2022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass LDSection; 21cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoclass Layout; 22cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 23cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/** \class FragmentRef 24cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao * \brief FragmentRef is a reference of a Fragment's contetnt. 25cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao * 26cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao */ 27cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoclass FragmentRef 28cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{ 29cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaopublic: 30cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao typedef uint64_t Offset; // FIXME: use SizeTraits<T>::Offset 31cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao typedef NonConstTraits<unsigned char>::pointer Address; 32cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao typedef ConstTraits<unsigned char>::pointer ConstAddress; 33cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 34cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaopublic: 3522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// Create - create a fragment reference for a given fragment. 3622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// 3722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// @param pFrag - the given fragment 3822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// @param pOffset - the offset, can be larger than the fragment, but can not 3922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// be larger than the section size. 4022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// @return if the offset is legal, return the fragment reference. Otherwise, 4122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// return NULL. 4222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao static FragmentRef* Create(Fragment& pFrag, uint64_t pOffset); 4322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 4422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao static FragmentRef* Create(LDSection& pSection, uint64_t pOffset); 4522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 4622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// Clear - clear all generated FragmentRef in the system. 4722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao static void Clear(); 4822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 4922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao static FragmentRef* Null(); 50cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 51cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao // ----- modifiers ----- // 52cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao FragmentRef& assign(const FragmentRef& pCopy); 53cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 54cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao FragmentRef& assign(Fragment& pFrag, Offset pOffset = 0); 55cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 56cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// memcpy - copy memory 57cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// copy memory from the fragment to the pDesc. 58cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// @pDest - the destination address 59cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// @pNBytes - copies pNBytes from the fragment[offset()+pOffset] 60551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines /// @pOffset - additional offset. 61cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// the start address offset from fragment[offset()] 62cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao void memcpy(void* pDest, size_t pNBytes, Offset pOffset = 0) const; 63cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 64cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao // ----- observers ----- // 6522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao bool isNull() const { return (this == Null()); } 6622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 67cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao Fragment* frag() 68cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao { return m_pFragment; } 69cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 70cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao const Fragment* frag() const 71cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao { return m_pFragment; } 72cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 73cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao Offset offset() const 74cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao { return m_Offset; } 75cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 7622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao Offset getOutputOffset() const; 7722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 7822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoprivate: 7922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao friend FragmentRef& NullFragmentRef(); 8022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao friend class Chunk<FragmentRef, MCLD_SECTIONS_PER_INPUT>; 8122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao friend class Relocation; 8222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 8322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao FragmentRef(); 8422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 8522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao FragmentRef(Fragment& pFrag, Offset pOffset = 0); 86551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 87cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoprivate: 88cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao Fragment* m_pFragment; 89cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao Offset m_Offset; 9022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 9122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao static FragmentRef g_NullFragmentRef; 9222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 93cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}; 94cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 95cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao} // namespace of mcld 96cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 97cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#endif 98cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 99