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
|
||||
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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue