1 --- tools/source/solar/solar.c 15 Apr 2003 17:55:43 -0000 1.2
2 +++ tools/source/solar/solar.c 22 Oct 2003 13:08:21 -0000
6 ************************************************************************/
10 +/* POSIX defines that a program is undefined after a SIG_SEGV. The
11 + * code stopped working on Linux Kernel 2.6 so I have moved this back to
13 + * If at a later time the signals work correctly with the Linux Kernel 2.6
14 + * then this change may be reverted although not strictly posix safe. */
15 +#define USE_FORK_TO_CHECK 1
23 #include <sys/types.h>
39 #define printTypeSize(Type,Name) printf( "sizeof(%s)\t= %d\n", Name, sizeof (Type) )
41 #define isSignedType(Type) (((Type)-1) < 0)
44 /*************************************************************************
46 -|* IsStackGrowingDown()
47 +|* GetStackAlignment()
49 |* Beschreibung Alignment von char Parametern, die (hoffentlich)
50 |* ueber den Stack uebergeben werden
52 typedef int (*TestFunc)( Type, void* );
57 /*************************************************************************
61 void SignalHdl( int sig )
66 fprintf( stderr, "Signal %d caught\n", sig );
67 - signal( sig, SignalHdl );
69 - longjmp( check_env, sig );
70 + signal( SIGSEGV, SIG_DFL );
71 + signal( SIGBUS, SIG_DFL );
72 + siglongjmp( check_env, sig );
80 - if ( !setjmp( check_env ) )
81 + if ( !sigsetjmp( check_env, 0 ) )
83 signal( SIGSEGV, SignalHdl );
84 signal( SIGBUS, SignalHdl );
92 /*************************************************************************
96 int CheckSetAccess( Type eT, void* p )
100 b = -1 != check( (TestFunc)SetAtAddress, eT, p );
101 #if OSL_DEBUG_LEVEL > 1
106 *************************************************************************/
107 -Description_Ctor( struct Description* pThis )
108 +void Description_Ctor( struct Description* pThis )
110 pThis->bBigEndian = IsBigEndian();
111 pThis->bStackGrowsDown = IsStackGrowingDown();
112 @@ -468,16 +466,21 @@
115 *************************************************************************/
116 -Description_Print( struct Description* pThis, char* name )
117 +void Description_Print( struct Description* pThis, char* name )
120 FILE* f = fopen( name, "w" );
122 + fprintf( stderr, "Unable to open file %s: %s\n", name, strerror( errno ) );
125 fprintf( f, "#define __%s\n",
126 pThis->bBigEndian ? "BIGENDIAN" : "LITTLEENDIAN" );
127 for ( i = 0; i < 3; i++ )
128 fprintf( f, "#define __ALIGNMENT%d\t%d\n",
129 - 1 << i+1, pThis->nAlignment[i] );
130 - fprintf( f, "#define __STACKALIGNMENT wird nicht benutzt\t%d\n", pThis->nStackAlignment );
131 + 1 << (i+1), pThis->nAlignment[i] );
132 + fprintf( f, "/* Stack alignment is not used... */\n" );
133 + fprintf( f, "#define __STACKALIGNMENT\t%d\n", pThis->nStackAlignment );
134 fprintf( f, "#define __STACKDIRECTION\t%d\n",
135 pThis->bStackGrowsDown ? -1 : 1 );
136 fprintf( f, "#define __SIZEOFCHAR\t%d\n", sizeof( char ) );
138 printf( ( CheckGetAccess( eT, (long*)&a[i] ) ? "OK\n" : "ERROR\n" ) );
142 -main( int argc, char* argv[] )
143 +/************************************************************************
145 + * Use C code to determine the characteristics of the building platform.
147 + ************************************************************************/
148 +int main( int argc, char* argv[] )
150 printTypeSign( char, "char" );
151 printTypeSign( short, "short" );
153 Description_Ctor( &description );
154 Description_Print( &description, argv[1] );
159 InfoMemoryAccess( p );