This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
Re: PATCH: PIC_OFFSET_TABLE_REGNUM_SAVED should be call used when
- To: John David Anglin <dave at hiauly1 dot hia dot nrc dot ca>
- Subject: Re: PATCH: PIC_OFFSET_TABLE_REGNUM_SAVED should be call used when
- From: Alan Modra <alan at linuxcare dot com dot au>
- Date: Mon, 15 Jan 2001 13:00:19 +1100 (EST)
- cc: Jeffrey A Law <law at redhat dot com>, gcc-bugs at gcc dot gnu dot org
On Sun, 14 Jan 2001, John David Anglin wrote:
> > > > Oops, there is a problem. The PIC_OFFSET_TABLE_REGNUM_SAVED register
> > > > must be call used under all conditions since non PIC code has to be able
> > > > to call PIC code.
> > >
> > > On further thought, the PIC_OFFSET_TABLE_REGNUM_SAVED can't be a call used
> > > register since this will break the run-time ABI. I think this means that
> > > it can't be a fixed register as well. Need a different solution.
> >
> > Why will that break the ABI? New code will just assume that r4 isn't
> > preserved over calls, but it's no problem if in fact r4 is preserved. It
>
> If we make r4 call used, it isn't saved by the callee.
Hit's self on head. Indeed. Here's another curious little problem.
---
extern void bar (void);
#define trash_r27 \
do \
{ \
register int x asm ("r27"); \
asm volatile ("ldi 0,%0" : "=&r" (x) : "0" (x) ); \
} \
while (0)
int main (void)
{
trash_r27 (bar);
bar ();
return 0;
}
---
With yesterday's sourceware CVS, hppa64-hpux11-gcc doesn't seem to see any
need to reload r27 for the call to bar. This problem came to light when I
was investigating how to fix the calls which get pasted into _init (which
also don't reload r27, or r19 in 32 bit case, and so lose if there is more
than one pasted call).
Alan Modra
--
Linuxcare. Support for the revolution.