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//===----------------------------------------------------------------------===// 937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#ifndef MCLD_FRAGMENT_FRAGMENTREF_H_ 1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#define MCLD_FRAGMENT_FRAGMENTREF_H_ 11cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/ADT/SizeTraits.h" 1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/ADT/TypeTraits.h" 1437b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Config/Config.h" 1537b74a387bb3993387029859c2d9d051c41c724eStephen Hines#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 */ 2737b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass FragmentRef { 2837b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 2937b74a387bb3993387029859c2d9d051c41c724eStephen Hines typedef uint64_t Offset; // FIXME: use SizeTraits<T>::Offset 30cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao typedef NonConstTraits<unsigned char>::pointer Address; 31cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao typedef ConstTraits<unsigned char>::pointer ConstAddress; 32cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 3337b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 3422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// Create - create a fragment reference for a given fragment. 3522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// 3622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// @param pFrag - the given fragment 3722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// @param pOffset - the offset, can be larger than the fragment, but can not 3822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// be larger than the section size. 3922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// @return if the offset is legal, return the fragment reference. Otherwise, 4022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// return NULL. 4122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao static FragmentRef* Create(Fragment& pFrag, uint64_t pOffset); 4222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 4322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao static FragmentRef* Create(LDSection& pSection, uint64_t pOffset); 4422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 4522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// Clear - clear all generated FragmentRef in the system. 4622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao static void Clear(); 4722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 4822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao static FragmentRef* Null(); 49cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 50cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao // ----- modifiers ----- // 51cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao FragmentRef& assign(const FragmentRef& pCopy); 52cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 53cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao FragmentRef& assign(Fragment& pFrag, Offset pOffset = 0); 54cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 55cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// memcpy - copy memory 56cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// copy memory from the fragment to the pDesc. 57cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// @pDest - the destination address 58cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// @pNBytes - copies pNBytes from the fragment[offset()+pOffset] 59551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines /// @pOffset - additional offset. 60cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// the start address offset from fragment[offset()] 61cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao void memcpy(void* pDest, size_t pNBytes, Offset pOffset = 0) const; 62cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 63cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao // ----- observers ----- // 6422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao bool isNull() const { return (this == Null()); } 6522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 6637b74a387bb3993387029859c2d9d051c41c724eStephen Hines Fragment* frag() { return m_pFragment; } 67cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 6837b74a387bb3993387029859c2d9d051c41c724eStephen Hines const Fragment* frag() const { return m_pFragment; } 69cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 7037b74a387bb3993387029859c2d9d051c41c724eStephen Hines Offset offset() const { return m_Offset; } 71cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 7222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao Offset getOutputOffset() const; 7322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 7437b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 7522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao friend FragmentRef& NullFragmentRef(); 7622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao friend class Chunk<FragmentRef, MCLD_SECTIONS_PER_INPUT>; 7722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao friend class Relocation; 7822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 7922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao FragmentRef(); 8022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 8137b74a387bb3993387029859c2d9d051c41c724eStephen Hines explicit FragmentRef(Fragment& pFrag, Offset pOffset = 0); 82551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 8337b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 84cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao Fragment* m_pFragment; 8537b74a387bb3993387029859c2d9d051c41c724eStephen Hines 86cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao Offset m_Offset; 8722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 8822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao static FragmentRef g_NullFragmentRef; 89cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}; 90cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 9137b74a387bb3993387029859c2d9d051c41c724eStephen Hines} // namespace mcld 92cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 9337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#endif // MCLD_FRAGMENT_FRAGMENTREF_H_ 94