------- Additional Comments From dave at hiauly1 dot hia dot nrc dot ca  
2005-08-15 17:24 -------
Subject: Re:  [4.0/4.1 regression] build_range_check generates wrong code for 
funcptr comparison

> Subject: Re:  [4.0/4.1 regression] build_range_check
>  generates wrong code for funcptr comparison
> 
> >>1) gcc should not be canonicalizing constants casted as function pointers
> > 
> > I think it has to.  GCC has no way of knowing whether the constant is
> > a "real" function pointer or not.
> 
> Doesn't this break __cffc completely? What if I really wanted to do "if 
> (fptr == (func_t)-2)" or "if (fptr == (func_t)5000)?

Why would you want to?  My opinion is that __cffc only has to deal
with the values traditionally used by "signal".  GCC doesn't know
whether (func_t)5000 needs to be canonicalized or not.  It will
happen anyway if (func_t)5000 is passed around.

The behavior of __cffc was more or less copied from the corresponding
HP routine.  __cffc expects to be passed a valid function pointer.
Currently, __cffc doesn't canonicalize small positive integers and -1
because they are used by signal and friends, and they can't be a valid
function pointer address.  I guess this might be extended somewhat but 
the point.  Nobody has defined what's ok.

When the plabel bit is set in the function pointer, __cffc has to
load data from the function descriptor and this can cause a segmentation
fault if the address isn't valid.  I don't think trying to avoid these
faults is worth the added complexity.  This will eventually go away when
Carlos' opd patch is installed.

I also think that the definitions of SIG_IGN, etc., are suspect.
These problems wouldn't occur if there were actual functions in the
C library for them.

There are also ways to avoid canonicalization in compares.  I recognize
that this problem is in generic code.  However, it might be possible
to replace the generic routine with a hppa specific routine that avoids
canonicalization when comparing a function pointer with a special value.
This would make the code more efficient.

Dave


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=23369

Reply via email to