diff options
author | Kevin Ryde <user42@zip.com.au> | 2006-06-17 23:15:59 +0000 |
---|---|---|
committer | Kevin Ryde <user42@zip.com.au> | 2006-06-17 23:15:59 +0000 |
commit | 23f2b9a3de013f093c5913aa381219f09353c676 (patch) | |
tree | 3a3315e24402e90d9c4094f18ac7ab6c2047f31f /libguile/inline.h | |
parent | a4f1c77ddb2057ca630b8bed9be437bdbc5dc552 (diff) | |
download | guile-23f2b9a3de013f093c5913aa381219f09353c676.tar.gz |
merge from 1.8 branch
Diffstat (limited to 'libguile/inline.h')
-rw-r--r-- | libguile/inline.h | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/libguile/inline.h b/libguile/inline.h index 0f7f7aa01..621b4fb36 100644 --- a/libguile/inline.h +++ b/libguile/inline.h @@ -248,6 +248,27 @@ SCM_C_INLINE 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); } |