This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: [Gcl-devel] ia64 and garbage collection
- From: Camm Maguire <camm at enhanced dot com>
- To: Andrew Haley <aph at cambridge dot redhat dot com>, Jim Wilson <wilson at redhat dot com>, Andrew Haley <aph at cambridge dot redhat dot com>
- Cc: gcc at gcc dot gnu dot org, gcl-devel at gnu dot org, debian-ia64 at lists dot debian dot org
- Date: 30 Jul 2002 17:11:08 -0400
- Subject: Re: [Gcl-devel] ia64 and garbage collection
- References: <E17Zarw-00083q-00@intech19.enhanced.com> <15686.53061.133785.571467@cuddles.cambridge.redhat.com>
Greetings, and thanks for the speedy replies! This really shows off
the power of the net! I've just put together a quick working gc for
gcl on the ia64, and it appears to be building maxima now without
problems! A world record turn around, if you asked me :-).
My current patch is below. Comments most welcome. And of course, a
few questions remaining!
Jim Wilson <wilson@redhat.com> writes:
> IA-64 has a register stack. This is somewhat like the register windows
> on sparcs. If you want to be able to view all of the registers, you need
> to flush the register stack to memory somehow. This can be done by calling
> getcontext as David Mosberger mentioned, but can also be done by using the
> flushrs instruction, either directly via a builtin, or by a small assembly
> language stub (which is what boehm-gc does).
1) Does the __builtin function identically to the asm in the Boehm-gc?
Returning the same address too?
>
> IA-64 has two stacks. One is the regular stack that holds procedure activation
> frames. The other stack is called the backing store, and holds the part of
> the register stack that has been flushed to memory. (This is unlike the sparc
> which uses a single stack for both.) You will have to search both stacks.
>
2) Looking over the boehm code, am I correct in guessing that this is
also the case on hppa (HP PA-RISC)?
> In order to get your GC working, you will have to spend a little time reading
> IA-64 architecture manuals to understand how all of this stuff works. Or
> alternatively study a working example. boehm-gc for instance already supports
> IA-64.
3) I'd appreciate your comments on the patch below if possible.
>
> Jim
Andrew Haley <aph@cambridge.redhat.com> writes:
> You don't seem to have mentioned that the IA-64 has *two* stacks: one
> contains registers and one structures and arrays. If you want to
perhaps this is because I was unaware of it :-).
> flush the register stack to memory for the sake of the garbage
> collector, that's easy: just call __builtin_ia64_flushrs().
>
Thanks for the tip!
> Andrew.
>
David Mosberger <davidm@napali.hpl.hp.com> writes:
> >>>>> On Tue, 30 Jul 2002 13:33:12 -0400, Camm Maguire <camm@enhanced.com> said:
>
> Camm> 1) Is there a work around, i.e. a way in which I can ensure
> Camm> clearing all registers back to the stack at a certain point in
> Camm> the program?
>
> A call to getcontext() does have the effect of forcing all
> callee-saved (preserved) registers into memory (and the "scratch"
> registers won't be live, by virtue of getcontext() being a regular
> function call).
And thank you for this suggestion! How does this differ from the
flushrs solution?
>
> --david
>
=============================================================================
#if defined(__ia64__) /* from boehm-gc code */
asm(" .text");
asm(" .psr abi64");
asm(" .psr lsb");
asm(" .lsb");
asm("");
asm(" .text");
asm(" .align 16");
asm(" .global GC_save_regs_in_stack");
asm(" .proc GC_save_regs_in_stack");
asm("GC_save_regs_in_stack:");
asm(" .body");
asm(" flushrs");
asm(" ;;");
asm(" mov r8=ar.bsp");
asm(" br.ret.sptk.few rp");
asm(" .endp GC_save_regs_in_stack");
void * GC_save_regs_in_stack();
#endif
....
(fn is set to a stack marking function, 'mark_stack_carefully')
(C_GC_OFFSET is defined to 0, but allows for marking addresses at
fractional word boundaries if set to 2)
#if defined(__ia64__)
{
extern void * __libc_ia64_register_backing_store_base;
void * bst=GC_save_regs_in_stack();
void * bsb=__libc_ia64_register_backing_store_base;
if (bsb>bst)
(*fn)(bsb,bst,C_GC_OFFSET);
else
(*fn)(bst,bsb,C_GC_OFFSET);
}
#endif
=============================================================================
--
Camm Maguire camm@enhanced.com
==========================================================================
"The earth is but one country, and mankind its citizens." -- Baha'u'llah