From: nobu.nokada@... Date: 2002-09-13T11:07:54+09:00 Subject: Re: Frame-pointer omission and ruby (was Bug in Ruby Ext to C or it is me ?) Hi, At Thu, 12 Sep 2002 22:14:25 +0900, Lorien Dunn wrote: > Everytime i've tried to build ruby with "-O3 -mcpu=i586 > -march=k6 -ffast-math -fomit-frame-pointer" with gcc-2.95.2, > gcc-2.95.3, gcc-3.01, and gcc-3.1, miniruby has crashed > during the building of the default extensions. All I have to > do to make it work is take out the "-fomit-frame-pointer". Some versions of gcc have a bug that wrong code is emitted for __builtin_frame_address() with -fomit-frame-pointer. And, sorry that I forgot that I've applied this patch. Or a patch in [ruby-dev:17947] may help. Index: configure.in =================================================================== RCS file: /cvs/ruby/src/ruby/configure.in,v retrieving revision 1.139 diff -u -2 -p -r1.139 configure.in --- configure.in 8 Sep 2002 09:04:15 -0000 1.139 +++ configure.in 8 Sep 2002 12:56:58 -0000 @@ -306,4 +306,16 @@ AC_STRUCT_ST_BLOCKS AC_STRUCT_ST_RDEV +AC_CACHE_CHECK(for stack end address, rb_cv_stack_end_address, +[rb_cv_stack_end_address=no +for addr in __libc_stack_end _SEND; do + AC_TRY_LINK( + [extern void *$addr;], + [if (!$addr) return 1;], + [rb_cv_stack_end_address="$addr"; break]) +done]) +if test $rb_cv_stack_end_address != no; then + AC_DEFINE_UNQUOTED(STACK_END_ADDRESS, $rb_cv_stack_end_address) +fi + dnl Checks for library functions. AC_TYPE_GETGROUPS Index: gc.c =================================================================== RCS file: /cvs/ruby/src/ruby/gc.c,v retrieving revision 1.103 diff -u -2 -p -r1.103 gc.c --- gc.c 6 Sep 2002 08:59:38 -0000 1.103 +++ gc.c 6 Sep 2002 15:42:59 -0000 @@ -31,4 +31,8 @@ #endif +#if defined _WIN32 || defined __CYGWIN__ +#include +#endif + void re_free_registers _((struct re_registers*)); void rb_io_fptr_finalize _((struct OpenFile*)); @@ -1195,7 +1199,13 @@ Init_stack(addr) VALUE *addr; { -#if defined(__human68k__) - extern void *_SEND; - rb_gc_stack_start = _SEND; +#if defined(_WIN32) || defined(__CYGWIN__) + MEMORY_BASIC_INFORMATION m; + memset(&m, 0, sizeof(m)); + VirtualQuery(&m, &m, sizeof(m)); + /* assume stack growing downward */ + rb_gc_stack_start = (VALUE *)((char *)m.BaseAddress + m.RegionSize) - 1; +#elif defined(STACK_END_ADDRESS) + extern void *STACK_END_ADDRESS; + rb_gc_stack_start = STACK_END_ADDRESS; #else VALUE start; -- Nobu Nakada