unofficial mirror of guile-devel@gnu.org 
 help / color / mirror / Atom feed
* gcc 2.95 inline scm_is_pair workaround
@ 2006-05-19 23:51 Kevin Ryde
  2006-05-20 23:41 ` Marius Vollmer
  0 siblings, 1 reply; 5+ messages in thread
From: Kevin Ryde @ 2006-05-19 23:51 UTC (permalink / raw)


[-- Attachment #1: Type: text/plain, Size: 211 bytes --]

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.


[-- Attachment #2: inline.h.workaround.diff --]
[-- Type: text/plain, Size: 1290 bytes --]

--- 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);
 }
 

[-- Attachment #3: Type: text/plain, Size: 143 bytes --]

_______________________________________________
Guile-devel mailing list
Guile-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/guile-devel

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2006-05-27 23:44 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-05-19 23:51 gcc 2.95 inline scm_is_pair workaround Kevin Ryde
2006-05-20 23:41 ` Marius Vollmer
     [not found]   ` <87y7wwus6o.fsf@zip.com.au>
2006-05-21 23:38     ` Marius Vollmer
2006-05-22  6:49   ` Ludovic Courtès
2006-05-27 23:44   ` Kevin Ryde

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).