From e657086589e9536ee3b6e3c02fd6e2fcd2b6154a Mon Sep 17 00:00:00 2001 From: Przemyslaw Czerpak Date: Wed, 20 Oct 2004 05:08:06 +0000 Subject: [PATCH] 2004-10-20 07:00 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl) * harbour/include/hbdefs.h + added macros HB_{PUT|GET}_{LONG|PTR} * changed HB_CAST_BYTE_NUMBERS_OFF to HB_STRICT_ALIGNMENT * harbour/source/vm/fm.c * harbour/source/vm/hvm.c * harbour/source/vm/macro.c * replaced code which made pointer casting without respecting machine alignment with proper macros --- harbour/ChangeLog | 11 ++++++++ harbour/include/hbdefs.h | 56 +++++++++++++++++++++++++++++++++------ harbour/source/vm/fm.c | 23 ++++------------ harbour/source/vm/hvm.c | 54 ++++++++++++++++++------------------- harbour/source/vm/macro.c | 25 ++++++++++++++--- 5 files changed, 112 insertions(+), 57 deletions(-) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 70c7ae8cff..ff82333a81 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -8,6 +8,17 @@ 2002-12-01 23:12 UTC+0100 Foo Bar */ +2004-10-20 07:00 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl) + * harbour/include/hbdefs.h + + added macros HB_{PUT|GET}_{LONG|PTR} + * changed HB_CAST_BYTE_NUMBERS_OFF to HB_STRICT_ALIGNMENT + + * harbour/source/vm/fm.c + * harbour/source/vm/hvm.c + * harbour/source/vm/macro.c + * replaced code which made pointer casting without respecting + machine alignment with proper macros + 2004-10-19 22:25 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl) * harbour/bin/hb-func.sh * changed 'sed' and 'tr' expresions to be compatible with SunOS diff --git a/harbour/include/hbdefs.h b/harbour/include/hbdefs.h index 4f2d9f1243..4cab8c006a 100644 --- a/harbour/include/hbdefs.h +++ b/harbour/include/hbdefs.h @@ -533,13 +533,53 @@ typedef long HB_PTRDIFF; ( ( ( UINT64 ) ( w ) & HB_LL( 0x0000FF0000000000 ) ) >> 24 ) | \ ( ( ( UINT64 ) ( w ) & HB_LL( 0x00FF000000000000 ) ) >> 40 ) | \ ( ( ( UINT64 ) ( w ) & HB_LL( 0xFF00000000000000 ) ) >> 56 ) ) ) + /* - * on some machines it's not safe to take numbers from BYTE buffer - * directly by C casting because they have to be stored at odd addresses - * Now this hack is only for integer numbers, if you will need it for - * double too on your machine please define proper macros/function + * on some machines it's not safe to directly access pointers stored + * at byte buffer they have to be stored at odd (or other alignment) + * addresses. + * For example SPARC which needs 4 byte alignment for pointers + * and 8 byte alignment for doubles and structures (when GCC is used) + * IMHO need HB_ARCH_ macro yet - the same OS can be used with + * different architectures - SPARC + LINUX, ALPHA + LINUX */ -#if defined( HB_CAST_BYTE_NUMBERS_OFF ) || !defined( HB_LITTLE_ENDIAN ) +#if defined( HB_OS_SUNOS ) +# define HB_STRICT_ALIGNMENT +#endif + +/* + * These macros are necessary for architectures which need + * strict alignment for pointers. + */ +#if defined( HB_BIG_ENDIAN ) +# if defined( HB_ARCH_64BIT ) +# define HB_PUT_LONG( p, v ) HB_PUT_BE_UINT64( p, ( UINT64 ) ( v ) ) +# define HB_GET_LONG( p ) HB_GET_BE_UINT64( p ) +# else +# define HB_PUT_LONG( p, v ) HB_PUT_BE_UINT32( p, ( UINT32 ) ( v ) ) +# define HB_GET_LONG( p ) HB_GET_BE_UINT32( p ) +# endif +#else +# if defined( HB_ARCH_64BIT ) +# define HB_PUT_LONG( p, v ) HB_PUT_LE_UINT64( p, ( UINT64 ) ( v ) ) +# define HB_GET_LONG( p ) HB_GET_LE_UINT64( p ) +# else +# define HB_PUT_LONG( p, v ) HB_PUT_LE_UINT32( p, ( UINT32 ) ( v ) ) +# define HB_GET_LONG( p ) HB_GET_LE_UINT32( p ) +# endif +#endif + +#if !defined( HB_STRICT_ALIGNMENT ) +# define HB_PUT_PTR( p, v ) { *( void ** ) ( p ) = ( void * ) ( v ); } +# define HB_GET_PTR( p ) ( *( void ** ) ( p ) ) +#else +# define HB_PUT_PTR( p, v ) HB_PUT_LONG( p, v ) +# define HB_GET_PTR( p ) ( ( void * ) HB_GET_LONG( p ) ) +#endif + + +/* Now the rest of endian macros */ +#if defined( HB_STRICT_ALIGNMENT ) || !defined( HB_LITTLE_ENDIAN ) #define HB_GET_LE_UINT16( p ) ( ( UINT16 ) \ ( ( UINT16 ) (( BYTE * )( p ))[0] | \ @@ -581,7 +621,7 @@ typedef long HB_PTRDIFF; } #endif -#if defined( HB_CAST_BYTE_NUMBERS_OFF ) || !defined( HB_BIG_ENDIAN ) +#if defined( HB_STRICT_ALIGNMENT ) || !defined( HB_BIG_ENDIAN ) #define HB_GET_BE_UINT16( p ) ( ( UINT16 ) \ ( ( UINT16 ) (( BYTE * )( p ))[0] << 8 | \ @@ -648,7 +688,7 @@ typedef long HB_PTRDIFF; #elif defined( HB_BIG_ENDIAN ) /* We use Big-Endian here */ -# ifndef HB_CAST_BYTE_NUMBERS_OFF +# ifndef HB_STRICT_ALIGNMENT #define HB_GET_BE_UINT16( p ) ( *( UINT16 * )( p ) ) #define HB_PUT_BE_UINT16( p, w ) ( *( UINT16 * )( p ) = ( UINT16 ) ( w ) ) @@ -769,7 +809,7 @@ typedef long HB_PTRDIFF; #else /* HB_LITTLE_ENDIAN */ /* We use Little-Endian here */ -# ifndef HB_CAST_BYTE_NUMBERS_OFF +# ifndef HB_STRICT_ALIGNMENT #define HB_GET_LE_UINT16( p ) ( *( UINT16 * )( p ) ) #define HB_PUT_LE_UINT16( p, w ) ( *( UINT16 * )( p ) = ( UINT16 ) ( w ) ) diff --git a/harbour/source/vm/fm.c b/harbour/source/vm/fm.c index bdd488f8b6..ab9f8b6225 100644 --- a/harbour/source/vm/fm.c +++ b/harbour/source/vm/fm.c @@ -146,10 +146,7 @@ void HB_EXPORT * hb_xalloc( ULONG ulSize ) /* allocates fixed memory, re ( ( PHB_MEMINFO ) pMem )->pNextBlock = NULL; ( ( PHB_MEMINFO ) pMem )->ulSignature = HB_MEMINFO_SIGNATURE; - { - ULONG *pSig = (ULONG *)( ( ( unsigned char * ) pMem ) + ulSize + sizeof(HB_MEMINFO) ); - *pSig = HB_MEMINFO_SIGNATURE; - } + HB_PUT_LONG( ( ( BYTE * ) pMem ) + ulSize + sizeof(HB_MEMINFO), HB_MEMINFO_SIGNATURE ); ( ( PHB_MEMINFO ) pMem )->ulSize = ulSize; /* size of the memory block */ if( hb_tr_level() >= HB_TR_DEBUG ) @@ -231,10 +228,7 @@ void HB_EXPORT * hb_xgrab( ULONG ulSize ) /* allocates fixed memory, exi ( ( PHB_MEMINFO ) pMem )->pNextBlock = NULL; ( ( PHB_MEMINFO ) pMem )->ulSignature = HB_MEMINFO_SIGNATURE; - { - ULONG *pSig = (ULONG *)( ( ( unsigned char * ) pMem ) + ulSize + sizeof(HB_MEMINFO) ); - *pSig = HB_MEMINFO_SIGNATURE; - } + HB_PUT_LONG( ( ( BYTE * ) pMem ) + ulSize + sizeof(HB_MEMINFO), HB_MEMINFO_SIGNATURE ); ( ( PHB_MEMINFO ) pMem )->ulSize = ulSize; /* size of the memory block */ if( hb_tr_level() >= HB_TR_DEBUG ) @@ -289,7 +283,6 @@ void HB_EXPORT * hb_xrealloc( void * pMem, ULONG ulSize ) /* reallocates m PHB_MEMINFO pMemBlock; ULONG ulMemSize; - ULONG *pSig; HB_TRACE_STEALTH(HB_TR_DEBUG, ("hb_xrealloc(%p, %lu)", pMem, ulSize)); @@ -306,8 +299,7 @@ void HB_EXPORT * hb_xrealloc( void * pMem, ULONG ulSize ) /* reallocates m ulMemSize = pMemBlock->ulSize; - pSig = (ULONG *)( ( ( unsigned char * ) pMem ) + ulMemSize ); - if( *pSig != HB_MEMINFO_SIGNATURE ) + if ( HB_GET_LONG( ( ( BYTE * ) pMem ) + ulMemSize ) != HB_MEMINFO_SIGNATURE ) hb_errInternal( HB_EI_XMEMOVERFLOW, NULL, NULL, NULL ); pMem = realloc( pMemBlock, ulSize + sizeof( HB_MEMINFO ) + sizeof( ULONG ) ); @@ -320,10 +312,7 @@ void HB_EXPORT * hb_xrealloc( void * pMem, ULONG ulSize ) /* reallocates m hb_errInternal( HB_EI_XREALLOC, NULL, NULL, NULL ); ( ( PHB_MEMINFO ) pMem )->ulSize = ulSize; /* size of the memory block */ - { - ULONG *pSig = (ULONG *)( ( ( unsigned char * ) pMem ) + ulSize + sizeof(HB_MEMINFO) ); - *pSig = HB_MEMINFO_SIGNATURE; - } + HB_PUT_LONG( ( ( BYTE * ) pMem ) + ulSize + sizeof(HB_MEMINFO), HB_MEMINFO_SIGNATURE ); if( ( ( PHB_MEMINFO ) pMem )->pPrevBlock ) ( ( PHB_MEMINFO ) pMem )->pPrevBlock->pNextBlock = ( PHB_MEMINFO ) pMem; if( ( ( PHB_MEMINFO ) pMem )->pNextBlock ) @@ -365,13 +354,11 @@ void HB_EXPORT hb_xfree( void * pMem ) /* frees fixed memory */ if( pMem ) { PHB_MEMINFO pMemBlock = ( PHB_MEMINFO ) ( ( char * ) pMem - sizeof( HB_MEMINFO ) ); - ULONG *pSig; if( pMemBlock->ulSignature != HB_MEMINFO_SIGNATURE ) hb_errInternal( HB_EI_XFREEINV, NULL, NULL, NULL ); - pSig = (ULONG *)( ( ( unsigned char * ) pMem ) + pMemBlock->ulSize ); - if( *pSig != HB_MEMINFO_SIGNATURE ) + if ( HB_GET_LONG( ( ( BYTE * ) pMem ) + pMemBlock->ulSize ) != HB_MEMINFO_SIGNATURE ) hb_errInternal( HB_EI_XMEMOVERFLOW, NULL, NULL, NULL ); s_lMemoryConsumed -= pMemBlock->ulSize; diff --git a/harbour/source/vm/hvm.c b/harbour/source/vm/hvm.c index c4e57f4be3..11faa0ccf8 100644 --- a/harbour/source/vm/hvm.c +++ b/harbour/source/vm/hvm.c @@ -1358,9 +1358,9 @@ void HB_EXPORT hb_vmExecute( const BYTE * pCode, PHB_SYMB pSymbols ) } else if( pCode[w] == HB_P_MPUSHSYM ) { - HB_DYNS_PTR *pDynSym = ( HB_DYNS_PTR * ) ( pCode + w + 1 ); + HB_DYNS_PTR pDynSym = ( HB_DYNS_PTR ) HB_GET_PTR( pCode + w + 1 ); - hb_vm_apExtraParamsSymbol[hb_vm_iExtraParamsIndex - 1] = ( *pDynSym )->pSymbol; + hb_vm_apExtraParamsSymbol[hb_vm_iExtraParamsIndex - 1] = pDynSym->pSymbol; w += sizeof( HB_DYNS_PTR ) + 1; } else @@ -1492,35 +1492,35 @@ void HB_EXPORT hb_vmExecute( const BYTE * pCode, PHB_SYMB pSymbols ) case HB_P_MMESSAGE: { - HB_DYNS_PTR * pDynSym = ( HB_DYNS_PTR * ) ( pCode + w + 1 ); - hb_vmPushSymbol( ( *pDynSym )->pSymbol ); + HB_DYNS_PTR pDynSym = ( HB_DYNS_PTR) HB_GET_PTR( pCode + w + 1 ); + hb_vmPushSymbol( pDynSym->pSymbol ); w += sizeof( HB_DYNS_PTR ) + 1; break; } case HB_P_MPOPALIASEDFIELD: { - HB_DYNS_PTR * pDynSym = ( HB_DYNS_PTR * ) ( pCode + w + 1 ); - hb_vmPopAliasedField( ( *pDynSym )->pSymbol ); + HB_DYNS_PTR pDynSym = ( HB_DYNS_PTR ) HB_GET_PTR( pCode + w + 1 ); + hb_vmPopAliasedField( pDynSym->pSymbol ); w += sizeof( HB_DYNS_PTR ) + 1; break; } case HB_P_MPOPALIASEDVAR: { - HB_DYNS_PTR * pDynSym = ( HB_DYNS_PTR * ) ( pCode + w + 1 ); - hb_vmPopAliasedVar( ( *pDynSym )->pSymbol ); + HB_DYNS_PTR pDynSym = ( HB_DYNS_PTR ) HB_GET_PTR( pCode + w + 1 ); + hb_vmPopAliasedVar( pDynSym->pSymbol ); w += sizeof( HB_DYNS_PTR ) + 1; break; } case HB_P_MPOPFIELD: { - HB_DYNS_PTR * pDynSym = ( HB_DYNS_PTR * ) ( pCode + w + 1 ); + HB_DYNS_PTR pDynSym = ( HB_DYNS_PTR ) HB_GET_PTR( pCode + w + 1 ); /* Pops a value from the eval stack and uses it to set * a new value of the given field */ - hb_rddPutFieldValue( ( hb_stackItemFromTop(-1) ), ( *pDynSym )->pSymbol ); + hb_rddPutFieldValue( ( hb_stackItemFromTop(-1) ), pDynSym->pSymbol ); hb_stackDec(); hb_itemClear( ( hb_stackTopItem() ) ); HB_TRACE(HB_TR_INFO, ("(hb_vmMPopField)")); @@ -1530,9 +1530,9 @@ void HB_EXPORT hb_vmExecute( const BYTE * pCode, PHB_SYMB pSymbols ) case HB_P_MPOPMEMVAR: { - HB_DYNS_PTR * pDynSym = ( HB_DYNS_PTR * ) ( pCode + w + 1 ); + HB_DYNS_PTR pDynSym = ( HB_DYNS_PTR ) HB_GET_PTR( pCode + w + 1 ); hb_stackDec(); - hb_memvarSetValue( ( *pDynSym )->pSymbol, ( hb_stackTopItem() ) ); + hb_memvarSetValue( pDynSym->pSymbol, ( hb_stackTopItem() ) ); hb_itemClear( ( hb_stackTopItem() ) ); HB_TRACE(HB_TR_INFO, ("(hb_vmMPopMemvar)")); w += sizeof( HB_DYNS_PTR ) + 1; @@ -1541,16 +1541,16 @@ void HB_EXPORT hb_vmExecute( const BYTE * pCode, PHB_SYMB pSymbols ) case HB_P_MPUSHALIASEDFIELD: { - HB_DYNS_PTR * pDynSym = ( HB_DYNS_PTR * ) ( pCode + w + 1 ); - hb_vmPushAliasedField( ( *pDynSym )->pSymbol ); + HB_DYNS_PTR pDynSym = ( HB_DYNS_PTR ) HB_GET_PTR( pCode + w + 1 ); + hb_vmPushAliasedField( pDynSym->pSymbol ); w += sizeof( HB_DYNS_PTR ) + 1; break; } case HB_P_MPUSHALIASEDVAR: { - HB_DYNS_PTR * pDynSym = ( HB_DYNS_PTR * ) ( pCode + w + 1 ); - hb_vmPushAliasedVar( ( *pDynSym )->pSymbol ); + HB_DYNS_PTR pDynSym = ( HB_DYNS_PTR ) HB_GET_PTR( pCode + w + 1 ); + hb_vmPushAliasedVar( pDynSym->pSymbol ); w += sizeof( HB_DYNS_PTR ) + 1; break; } @@ -1573,10 +1573,10 @@ void HB_EXPORT hb_vmExecute( const BYTE * pCode, PHB_SYMB pSymbols ) case HB_P_MPUSHFIELD: { - HB_DYNS_PTR * pDynSym = ( HB_DYNS_PTR * ) ( pCode + w + 1 ); + HB_DYNS_PTR pDynSym = ( HB_DYNS_PTR ) HB_GET_PTR( pCode + w + 1 ); /* It pushes the current value of the given field onto the eval stack */ - hb_rddGetFieldValue( ( hb_stackTopItem() ), ( *pDynSym )->pSymbol ); + hb_rddGetFieldValue( ( hb_stackTopItem() ), pDynSym->pSymbol ); hb_stackPush(); HB_TRACE(HB_TR_INFO, ("(hb_vmMPushField)")); w += sizeof( HB_DYNS_PTR ) + 1; @@ -1585,8 +1585,8 @@ void HB_EXPORT hb_vmExecute( const BYTE * pCode, PHB_SYMB pSymbols ) case HB_P_MPUSHMEMVAR: { - HB_DYNS_PTR * pDynSym = ( HB_DYNS_PTR * ) ( pCode + w + 1 ); - hb_memvarGetValue( ( hb_stackTopItem() ), ( *pDynSym )->pSymbol ); + HB_DYNS_PTR pDynSym = ( HB_DYNS_PTR ) HB_GET_PTR( pCode + w + 1 ); + hb_memvarGetValue( ( hb_stackTopItem() ), pDynSym->pSymbol ); hb_stackPush(); HB_TRACE(HB_TR_INFO, ("(hb_vmMPushMemvar)")); w += sizeof( HB_DYNS_PTR ) + 1; @@ -1595,8 +1595,8 @@ void HB_EXPORT hb_vmExecute( const BYTE * pCode, PHB_SYMB pSymbols ) case HB_P_MPUSHMEMVARREF: { - HB_DYNS_PTR * pDynSym = ( HB_DYNS_PTR * ) ( pCode + w + 1 ); - hb_memvarGetRefer( ( hb_stackTopItem() ), ( *pDynSym )->pSymbol ); + HB_DYNS_PTR pDynSym = ( HB_DYNS_PTR ) HB_GET_PTR( pCode + w + 1 ); + hb_memvarGetRefer( ( hb_stackTopItem() ), pDynSym->pSymbol ); hb_stackPush(); HB_TRACE(HB_TR_INFO, ("(hb_vmMPushMemvarRef)")); w += sizeof( HB_DYNS_PTR ) + 1; @@ -1605,16 +1605,16 @@ void HB_EXPORT hb_vmExecute( const BYTE * pCode, PHB_SYMB pSymbols ) case HB_P_MPUSHSYM: { - HB_DYNS_PTR * pDynSym = ( HB_DYNS_PTR * ) ( pCode + w + 1 ); - hb_vmPushMacroSymbol( ( *pDynSym )->pSymbol ); + HB_DYNS_PTR pDynSym = ( HB_DYNS_PTR ) HB_GET_PTR( pCode + w + 1 ); + hb_vmPushMacroSymbol( pDynSym->pSymbol ); w += sizeof( HB_DYNS_PTR ) + 1; break; } case HB_P_MPUSHVARIABLE: { - HB_DYNS_PTR * pDynSym = ( HB_DYNS_PTR * ) ( pCode + w + 1 ); - hb_vmPushVariable( ( *pDynSym )->pSymbol ); + HB_DYNS_PTR pDynSym = ( HB_DYNS_PTR ) HB_GET_PTR( pCode + w + 1 ); + hb_vmPushVariable( pDynSym->pSymbol ); w += sizeof( HB_DYNS_PTR ) + 1; break; } @@ -1623,7 +1623,7 @@ void HB_EXPORT hb_vmExecute( const BYTE * pCode, PHB_SYMB pSymbols ) { USHORT uiSize = HB_PCODE_MKUSHORT( &( pCode[ w + 1 ] ) ); - hb_vmPushString( ( char * ) ( pCode ) + w + 3, ( ULONG )( uiSize - 1 ) ); + hb_vmPushString( ( char * ) ( pCode + w + 3 ), ( ULONG )( uiSize - 1 ) ); w += ( 3 + uiSize ); break; } diff --git a/harbour/source/vm/macro.c b/harbour/source/vm/macro.c index d057aae595..f627069deb 100644 --- a/harbour/source/vm/macro.c +++ b/harbour/source/vm/macro.c @@ -1195,7 +1195,13 @@ void hb_compMemvarGenPCode( BYTE bPCode, char * szVarName, HB_MACRO_DECL ) */ pSym = hb_dynsymGet( szVarName ); hb_compGenPCode1( bPCode, HB_MACRO_PARAM ); - hb_compGenPCodeN( ( BYTE * )( &pSym ), sizeof( pSym ), HB_MACRO_PARAM ); + { + BYTE byBuf[ sizeof( HB_DYNS_PTR ) ]; + + HB_PUT_PTR( byBuf, pSym ); + hb_compGenPCodeN( byBuf, sizeof( pSym ), HB_MACRO_PARAM ); + } + /* hb_compGenPCodeN( ( BYTE * )( &pSym ), sizeof( pSym ), HB_MACRO_PARAM ); */ } /* generates the pcode to push a symbol on the virtual machine stack */ @@ -1232,9 +1238,14 @@ void hb_compGenPushSymbol( char * szSymbolName, BOOL bFunction, BOOL bAlias, HB_ else pSym = hb_dynsymGet( szSymbolName ); - hb_compGenPCode1( HB_P_MPUSHSYM, HB_MACRO_PARAM ); - hb_compGenPCodeN( ( BYTE * ) &pSym, sizeof( pSym ), HB_MACRO_PARAM ); + { + BYTE byBuf[ sizeof( HB_DYNS_PTR ) ]; + + HB_PUT_PTR( byBuf, pSym ); + hb_compGenPCodeN( byBuf, sizeof( pSym ), HB_MACRO_PARAM ); + } + /* hb_compGenPCodeN( ( BYTE * ) &pSym, sizeof( pSym ), HB_MACRO_PARAM ); */ } /* generates the pcode to push a long number on the virtual machine stack */ @@ -1281,7 +1292,13 @@ void hb_compGenMessage( char * szMsgName, HB_MACRO_DECL ) HB_DYNS_PTR pSym = hb_dynsymGet( szMsgName ); hb_compGenPCode1( HB_P_MMESSAGE, HB_MACRO_PARAM ); - hb_compGenPCodeN( ( BYTE * ) &pSym, sizeof( pSym ), HB_MACRO_PARAM ); + { + BYTE byBuf[ sizeof( HB_DYNS_PTR ) ]; + + HB_PUT_PTR( byBuf, pSym ); + hb_compGenPCodeN( byBuf, sizeof( pSym ), HB_MACRO_PARAM ); + } + /* hb_compGenPCodeN( ( BYTE * ) &pSym, sizeof( pSym ), HB_MACRO_PARAM ); */ } /* generates an underscore-symbol name for a data assignment */