aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorngoto <ngoto@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-11-15 04:42:31 +0000
committerngoto <ngoto@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-11-15 04:42:31 +0000
commitfa00b6516c96ffc888c194caf9bf964255c6ec54 (patch)
treee577e3fd596b3ff8bee5a6c8c7947c0fab153cb2
parent9cdd62bd19f7872bab25912ed0485c098ea141d2 (diff)
downloadruby-fa00b6516c96ffc888c194caf9bf964255c6ec54.tar.gz
* include/ruby/defines.h (FLUSH_REGISTER_WINDOWS): move sparc asm code
to a separete file sparc.c for preventing inlining optimization. Patched by Jurij Smakov. [Bug #5244] [ruby-core:40685] * sparc.c (rb_sparc_flush_register_windows): ditto. * configure.in: ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@33757 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog8
-rw-r--r--configure.in3
-rw-r--r--include/ruby/defines.h17
-rw-r--r--sparc.c30
4 files changed, 42 insertions, 16 deletions
diff --git a/ChangeLog b/ChangeLog
index cbec38c4da..751f71187a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+Tue Nov 15 13:38:14 2011 Naohisa Goto <ngotogenome@gmail.com>
+
+ * include/ruby/defines.h (FLUSH_REGISTER_WINDOWS): move sparc asm code
+ to a separete file sparc.c for preventing inlining optimization.
+ Patched by Jurij Smakov. [Bug #5244] [ruby-core:40685]
+ * sparc.c (rb_sparc_flush_register_windows): ditto.
+ * configure.in: ditto.
+
Tue Nov 15 13:11:35 2011 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
* include/ruby/ruby.h: get rid of gcc specific rb_long2int(),
diff --git a/configure.in b/configure.in
index b1bc951e52..7f9066b161 100644
--- a/configure.in
+++ b/configure.in
@@ -1087,7 +1087,8 @@ AS_CASE(["$target_cpu"],
[CFLAGS="-mieee $CFLAGS"],
[osf*], # ccc
[CFLAGS="-ieee $CFLAGS"],
- )])
+ )],
+[sparc*], [AC_LIBOBJ([sparc])])
ac_cv_header_net_socket_h=${ac_cv_header_net_socket_h=no}
if test "$ac_cv_header_net_socket_h" = yes; then
diff --git a/include/ruby/defines.h b/include/ruby/defines.h
index 58336c1ebd..2ef26d0da8 100644
--- a/include/ruby/defines.h
+++ b/include/ruby/defines.h
@@ -198,21 +198,8 @@ void xfree(void*);
#endif
#if defined(__sparc)
-static inline void
-flush_register_windows(void)
-{
- asm
-#ifdef __GNUC__
- volatile
-#endif
-# if SIZEOF_VOIDP > 4 /* workaround for Debian Sparc quirk */
- ("flushw")
-# else
- ("ta 0x03")
-# endif /* trap always to flush register windows if we are on a Sparc system */
- ;
-}
-# define FLUSH_REGISTER_WINDOWS flush_register_windows()
+void rb_sparc_flush_register_windows();
+# define FLUSH_REGISTER_WINDOWS rb_sparc_flush_register_windows()
#elif defined(__ia64)
void *rb_ia64_bsp(void);
void rb_ia64_flushrs(void);
diff --git a/sparc.c b/sparc.c
new file mode 100644
index 0000000000..b764e900d7
--- /dev/null
+++ b/sparc.c
@@ -0,0 +1,30 @@
+/********************************************************************
+ Flush register windows on sparc.
+
+ This function is in a separate file to prevent inlining. The "flushw"
+ assembler instruction used on sparcv9 flushes all register windows
+ except the current one, so if it is inlined, the current register
+ window of the process executing the instruction will not be flushed
+ correctly.
+
+ See http://redmine.ruby-lang.org/issues/5244 for discussion.
+*********************************************************************/
+void rb_sparc_flush_register_windows()
+{
+ asm
+#ifdef __GNUC__
+ __volatile__
+#endif
+
+/* This condition should be in sync with one in configure.in */
+#if defined(__sparcv9) || defined(__sparc_v9__) || defined(__arch64__)
+# ifdef __GNUC__
+ ("flushw" : : : "%o7")
+# else
+ ("flushw")
+# endif /* __GNUC__ */
+#else
+ ("ta 0x03")
+#endif
+ ;
+}