This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: Miscompilation of glibc with CVS mainline
- From: "John David Anglin" <dave at hiauly1 dot hia dot nrc dot ca>
- To: dave at hiauly1 dot hia dot nrc dot ca (John David Anglin)
- Cc: jakub at redhat dot com, aj at suse dot de, gcc at gcc dot gnu dot org, libc-alpha at sources dot redhat dot com
- Date: Thu, 2 Jan 2003 12:48:23 -0500 (EST)
- Subject: Re: Miscompilation of glibc with CVS mainline
> > > Here's a small testcase that has the same behaviour:
> > > ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> > > extern void weak_func (void *arg);
> > > asm (".weak weak_func");
> > >
> > > void
> > > test (void *arg)
> > > {
> > > if (&weak_func != (void *)0)
> > > weak_func (arg);
> > >
> > > }
> >
> > As GCC is not told in any way that weak_func is actually weak, I think
> > it is glibc's fault.
>
> This is definitely a gcc problem. This is the code arising from
> Andreas' testcase for hppa-linux at -O2:
>
> stw %r2,-20(%r30)
> ldo 64(%r30),%r30
> ldw -84(%r30),%r2
> bl weak_func,%r0
> ldo -64(%r30),%r30
>
> We have completely lost the `if'. As a result, weak_func is always
> called.
There is another problem. The call to weak_func has been turned into
a sibcall. It seems that TARGET_FUNCTION_OK_FOR_SIBCALL isn't being
consulted as we don't allow indirect sibcalls on hppa-linux.
Dave
--
J. David Anglin dave.anglin@nrc.ca
National Research Council of Canada (613) 990-0752 (FAX: 952-6605)