
/*--------------------------------------------------------------------*/
/*--- Misc simple stuff lacking a better home.        priv_misc.h ---*/
/*--------------------------------------------------------------------*/

/*
   This file is part of Valgrind, a dynamic binary instrumentation
   framework.

   Copyright (C) 2008-2015 OpenWorks LLP
      info@open-works.co.uk

   This program is free software; you can redistribute it and/or
   modify it under the terms of the GNU General Public License as
   published by the Free Software Foundation; either version 2 of the
   License, or (at your option) any later version.

   This program is distributed in the hope that it will be useful, but
   WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
   02111-1307, USA.

   The GNU General Public License is contained in the file COPYING.

   Neither the names of the U.S. Department of Energy nor the
   University of California nor the names of its contributors may be
   used to endorse or promote products derived from this software
   without prior written permission.
*/

#ifndef __PRIV_MISC_H
#define __PRIV_MISC_H

#include "pub_core_basics.h"    // SizeT

/* Allocate(zeroed), free, strdup, memdup, shrink, all in VG_AR_DINFO.
   The allocation functions never return NULL. */
void*  ML_(dinfo_zalloc)( const HChar* cc, SizeT szB );
void   ML_(dinfo_free)( void* v );
HChar* ML_(dinfo_strdup)( const HChar* cc, const HChar* str );
void*  ML_(dinfo_memdup)( const HChar* cc, const void* str, SizeT nStr );
void*  ML_(dinfo_realloc) ( const HChar* cc, void* ptr, SizeT new_size );
void   ML_(dinfo_shrink_block)( void* ptr, SizeT szB );

/* Define functions to read/write types of various sizes from/to a
   (potentially unaligned) UChar *data buffer.
   Some archs can do efficient unaligned access. For these archs,
   do the load/store directly. For others, call the UAS (Un Aligned Safe)
   functions. */
#if defined(VGA_x86) || defined(VGA_amd64)

#define DEF_READ(type) \
static inline type VGAPPEND(vgModuleLocal_read_,type) ( const UChar* data ) \
{ \
   return (*(const type*)(data)); \
} \
type VGAPPEND(vgModuleLocal_readUAS_,type) ( const UChar* data )

#define DEF_WRITE(type) \
static inline UChar* VGAPPEND(vgModuleLocal_write_,type) ( UChar* ptr, type val ) \
{ \
   (*(type*)(ptr)) = val; \
   return ptr + sizeof(type);   \
} \
UChar* VGAPPEND(vgModuleLocal_writeUAS_,type) ( UChar* ptr, type val )

#else

#define DEF_READ(type) \
type VGAPPEND(vgModuleLocal_readUAS_,type) ( const UChar* data ); \
static inline type VGAPPEND(vgModuleLocal_read_,type) ( const UChar* data ) \
{ \
   return VGAPPEND(vgModuleLocal_readUAS_,type)(data); \
}

#define DEF_WRITE(type) \
UChar* VGAPPEND(vgModuleLocal_writeUAS_,type) ( UChar* ptr, type val ); \
static inline UChar* VGAPPEND(vgModuleLocal_write_,type) ( UChar* ptr, type val ) \
{ \
   return VGAPPEND(vgModuleLocal_writeUAS_,type)(ptr,val); \
}

#endif

/* Defines a bunch of functions such as
   Short ML_(read_Short)( const UChar* data );
   Int ML_(read_Int)( const UChar* data );
   ... */
DEF_READ(Short);
DEF_READ(Int);
DEF_READ(Long);
DEF_READ(UShort);
DEF_READ(UWord);
DEF_READ(UInt);
DEF_READ(ULong);
DEF_READ(Addr);

/* Defines a bunch of functions such as
   UChar* ML_(write_UShort)( UChar* ptr, UShort val );
   UChar* ML_(write_UInt)( UChar* ptr, UInt val );
   ... */
DEF_WRITE(UShort);
DEF_WRITE(UInt);
DEF_WRITE(ULong);
DEF_WRITE(Addr);

static inline UChar ML_(read_UChar)( const UChar* data )
{
   return data[0];
}
static inline UChar* ML_(write_UChar)( UChar* ptr, UChar val )
{  
   ptr[0] = val;
   return ptr + sizeof(UChar);
}

/* A handy type, a la Haskell's Maybe type.  Yes, I know, C sucks.
   Been there.  Done that.  Seen the movie.  Got the T-shirt.  Etc. */
typedef struct { ULong ul; Bool b; } MaybeULong;


#endif /* ndef __PRIV_MISC_H */

/*--------------------------------------------------------------------*/
/*--- end                                              priv_misc.h ---*/
/*--------------------------------------------------------------------*/
