[Top][All Lists]
[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);
}
- gcc 2.95 inline scm_is_pair workaround,
Kevin Ryde <=