mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-05-14 17:50:22 +02:00
(scm_is_pair): Add a workaround for i386 gcc 2.95 bad code generation.
This commit is contained in:
parent
8d1dd1a137
commit
8f21ef9067
1 changed files with 21 additions and 0 deletions
|
@ -248,6 +248,27 @@ SCM_C_INLINE
|
||||||
int
|
int
|
||||||
scm_is_pair (SCM x)
|
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);
|
return SCM_I_CONSP (x);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue