guile-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

gcc 2.95 inline scm_is_pair workaround


From: Kevin Ryde
Subject: gcc 2.95 inline scm_is_pair workaround
Date: Sat, 20 May 2006 09:51:13 +1000
User-agent: Gnus/5.110006 (No Gnus v0.6) Emacs/21.4 (gnu/linux)

I added the code below to the inline scm_is_pair.  The comment should
be self-explanatory.  Notice it's deliberately confined to just 2.95,
whatever the problem is it doesn't seem to afflict the current gcc 4.

--- inline.h.~1.30.2.1.~        2006-02-14 08:58:58.000000000 +1100
+++ inline.h    2006-05-20 09:48:46.000000000 +1000
@@ -248,6 +248,27 @@
 int
 scm_is_pair (SCM x)
 {
+  /* The following "workaround_for_gcc_295" avoids bad code generated by
+     i386 gcc 2.95.4 (the Debian packaged 2.95.4-24 at least).
+
+     Under the default -O2 the inlined SCM_I_CONSP test gets "optimized" so
+     the fetch of the tag word from x is done before confirming it's a
+     non-immediate (SCM_NIMP).  Needless to say that bombs badly if x is a
+     immediate.  This was seen to afflict scm_srfi1_split_at and something
+     deep in the bowels of ceval().  In both cases segvs resulted from
+     deferencing a random immediate value.  srfi-1.test exposes the problem
+     through a short list, the immediate being SCM_EOL in that case.
+     Something in syntax.test exposed the ceval() problem.
+
+     Just "volatile SCM workaround_for_gcc_295 = lst" is enough to avoid the
+     problem, without even using that variable.  The "w=w" is just to
+     prevent a warning about it being unused.
+     */
+#if defined (__GNUC__) && __GNUC__ == 2 && __GNUC_MINOR__ == 95
+  volatile SCM workaround_for_gcc_295 = x;
+  workaround_for_gcc_295 = workaround_for_gcc_295;
+#endif
+
   return SCM_I_CONSP (x);
 }
 

reply via email to

[Prev in Thread] Current Thread [Next in Thread]