A patch to constify gcc.c (Really, summarizing remaining warnings)

Kaveh R. Ghazi ghazi@caip.rutgers.edu
Thu Mar 11 08:08:00 GMT 1999


 > From: Richard Henderson <rth@cygnus.com>
 > 
 > On Thu, Mar 11, 1999 at 12:05:31AM -0700, Jeffrey A Law wrote:
 > > We use setjmp/longjmp in a few places when we're going to be
 > > messing around with floating point.  They are necessary.
 > 
 > The best way to fix the warning (and clean up the flow graph of the
 > containing function, btw) is to always do things with a wrapper.  E.g.
 > 
 > int do_float_handler (void (*fn)(void *data), void *data)
 > {
 >   jmp_buf buf;
 > 
 >   if (setjmp (buf) != 0)
 >     return 0;
 > 
 >   set_float_handler (buf);
 >   (*fn)(data);
 >   set_float_handler (NULL);
 >   return 1;
 > }
 > 
 > r~


	This looks interesting, but I'm not sure I get it.  Would you
please be more specific about how this would work?  Where would
do_float_handler() be called from and with what values in its
parameters?  What code would it substitute for?

	I attempted to figure this out myself and I poked around one
of the places where the warning occurs.  One triggering site is in
cse.c:simplify_relational_operation, where it calls setjmp().  The
particular code in question does this:

 >   else if (GET_CODE (op0) == CONST_DOUBLE && GET_CODE (op1) == CONST_DOUBLE
 >            && GET_MODE_CLASS (GET_MODE (op0)) == MODE_FLOAT)
 >     {
 >       REAL_VALUE_TYPE d0, d1;
 >       jmp_buf handler;
 >  
 >       if (setjmp (handler))
 >         return 0;
 >  
 >       set_float_handler (handler);
 >       REAL_VALUE_FROM_CONST_DOUBLE (d0, op0);
 >       REAL_VALUE_FROM_CONST_DOUBLE (d1, op1);
 >       equal = REAL_VALUES_EQUAL (d0, d1);
 >       op0lt = op0ltu = REAL_VALUES_LESS (d0, d1);
 >       op1lt = op1ltu = REAL_VALUES_LESS (d1, d0);
 >       set_float_handler (NULL_PTR);
 >     }

	How would you transform this to use do_float_handler()?  
I guess you could create a new function out of the code in between the
two calls to set_float_handler() and pass that function pointer to
do_float_handler().  Then if do_float_handler() returned 0, you'd
return 0?  How would you pass all the necessary data in a void *?
Would you create a customized struct with all the info passed in and
out and then call do_float_handler() with the struct as the second
argument?


	Also, let's assume what I describe above is accurate and we did
it.  Out of curiosity, if I happened to bootstrap with -O3, and then
do_float_handler() is inlined, would the errors come back?

		Thanks,
		--Kaveh
--
Kaveh R. Ghazi			Engagement Manager / Project Services
ghazi@caip.rutgers.edu		Qwest Internet Solutions


More information about the Gcc-patches mailing list