diff --git a/ChangeLog b/ChangeLog index 919e1daa12..2a1e4d70cd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +Sat Jul 2 17:06:23 2005 Tanaka Akira + + * defines.h (FLUSH_REGISTER_WINDOWS): defined for IA64. + (flush_register_windows): declare flush_register_windows. + + * eval.c (flush_register_windows): new function. + + * ruby.h (NOINLINE): move up to be effective in defines.h. + Sat Jul 2 15:19:41 2005 Tanaka Akira * configure.in: check select_large_fdset. diff --git a/defines.h b/defines.h index d0aa208b49..619edbe283 100644 --- a/defines.h +++ b/defines.h @@ -229,6 +229,9 @@ flush_register_windows(void) ; } # define FLUSH_REGISTER_WINDOWS flush_register_windows() +#elif defined(__ia64__) +NOINLINE(void flush_register_windows(void)); +# define FLUSH_REGISTER_WINDOWS flush_register_windows() #else # define FLUSH_REGISTER_WINDOWS ((void)0) #endif diff --git a/eval.c b/eval.c index 4b946c0e6b..63fbec7239 100644 --- a/eval.c +++ b/eval.c @@ -13410,3 +13410,13 @@ rb_exec_recursive(func, obj, arg) return result; } } + +/* flush_register_windows must not be inlined because flushrs doesn't flush + * current frame in register stack. */ +#ifdef __ia64__ +void flush_register_windows(void) +{ + __asm__ ("flushrs"); +} +#endif + diff --git a/ruby.h b/ruby.h index e321099504..71f769eb1b 100644 --- a/ruby.h +++ b/ruby.h @@ -19,6 +19,11 @@ extern "C" { #endif #include "config.h" + +#ifndef NOINLINE +# define NOINLINE(x) x +#endif + #include "defines.h" #ifdef HAVE_STDLIB_H @@ -59,9 +64,6 @@ extern "C" { #ifndef DEPRECATED # define DEPRECATED(x) x #endif -#ifndef NOINLINE -# define NOINLINE(x) x -#endif #if defined(HAVE_ALLOCA_H) #include