//===- MCFragmentRef.h ----------------------------------------------------===//
//
// The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef MCLD_MCFRAGMENT_REFERENCE_H
#define MCLD_MCFRAGMENT_REFERENCE_H
#ifdef ENABLE_UNITTEST
#include <gtest.h>
#endif
#include <llvm/MC/MCAssembler.h>
#include <mcld/ADT/SizeTraits.h>
#include <mcld/ADT/TypeTraits.h>
namespace mcld
{
class Layout;
/// compunteFragmentSize - compute the specific MCFragment size
uint64_t computeFragmentSize(const Layout& pLayout,
const llvm::MCFragment& pFrag);
/** \class MCFragmentRef
* \brief MCFragmentRef is a reference of a MCFragment's contetnt.
*
*/
class MCFragmentRef
{
public:
typedef uint64_t Offset; // FIXME: use SizeTraits<T>::Offset
typedef NonConstTraits<unsigned char>::pointer Address;
typedef ConstTraits<unsigned char>::pointer ConstAddress;
public:
MCFragmentRef();
MCFragmentRef(llvm::MCFragment& pFrag, Offset pOffset = 0);
~MCFragmentRef();
// ----- modifiers ----- //
MCFragmentRef& assign(const MCFragmentRef& pCopy);
MCFragmentRef& assign(llvm::MCFragment& pFrag, Offset pOffset = 0);
/// memcpy - copy memory
/// copy memory from the fragment to the pDesc.
/// @pDest - the destination address
/// @pNBytes - copies pNBytes from the fragment[offset()+pOffset]
/// @pOffset - additional offset.
/// the start address offset from fragment[offset()]
void memcpy(void* pDest, size_t pNBytes, Offset pOffset = 0) const;
// ----- observers ----- //
llvm::MCFragment* frag()
{ return m_pFragment; }
const llvm::MCFragment* frag() const
{ return m_pFragment; }
Offset offset() const
{ return m_Offset; }
// ----- dereference ----- //
Address deref();
ConstAddress deref() const;
Address operator*()
{ return deref(); }
ConstAddress operator*() const
{ return deref(); }
private:
llvm::MCFragment* m_pFragment;
Offset m_Offset;
};
} // namespace of mcld
#endif