2003-09-08 06:26:23

by Nagendra Singh Tomar

[permalink] [raw]
Subject: [OT] caller-save/callee-save register styles

I would like to know various people's experiences about the caller-save
and callee-save style of preserving register values across procedure
calls. I feel that the ABI specification should specify that but I was
unable to figure that out in the ELF-ABI specification.
What I have personally seen is only callee-save style in which the
modified registers are PUSHed on the stack on entering the function and
POPed on leaving the function. That means the caller can assume that all
the regsiter values will be same just before and after the 'call'
instruction.
Can we assume one of these styles when writing assembly code that has to
be linked with C code generated by the compiler or do we have to first
ensure the style that the compiler follows and then use that.
Comments on how other ABIs do it are highly welcome, though I am
particularly interested about the ELF-ABI and x86 arch.

Thanx,
tomar


2003-09-08 09:34:18

by Mikael Pettersson

[permalink] [raw]
Subject: Re: [OT] caller-save/callee-save register styles

On Sun, 7 Sep 2003 23:54:59 +0530 (IST), Nagendra Singh Tomar wrote:
>I would like to know various people's experiences about the caller-save
>and callee-save style of preserving register values across procedure
>calls. I feel that the ABI specification should specify that but I was
>unable to figure that out in the ELF-ABI specification.
>What I have personally seen is only callee-save style in which the
>modified registers are PUSHed on the stack on entering the function and
>POPed on leaving the function. That means the caller can assume that all
>the regsiter values will be same just before and after the 'call'
>instruction.

"All" is a bad assumption. Most ABIs have both caller-save and
callee-save registers, so you need to save those caller-save
registers that are to be live over the call.

>Can we assume one of these styles when writing assembly code that has to
>be linked with C code generated by the compiler or do we have to first
>ensure the style that the compiler follows and then use that.
>Comments on how other ABIs do it are highly welcome, though I am
>particularly interested about the ELF-ABI and x86 arch.

Neither the ELF spec nor the generic SVR4 ABI documents these things.
You need the Processor-Specific Supplement, a.k.a. psABI.

There is no central repository for these, but last time I checked,
the ia32 psABI was downloadable from SCO or Caldera.

2003-09-08 14:22:56

by Jeff Garzik

[permalink] [raw]
Subject: Re: [OT] caller-save/callee-save register styles

On Sun, Sep 07, 2003 at 11:54:59PM +0530, Nagendra Singh Tomar wrote:
> I would like to know various people's experiences about the caller-save
> and callee-save style of preserving register values across procedure
> calls. I feel that the ABI specification should specify that but I was
> unable to figure that out in the ELF-ABI specification.

The i386 ELF ABI spec _does_ specify that.


> What I have personally seen is only callee-save style in which the
> modified registers are PUSHed on the stack on entering the function and
> POPed on leaving the function. That means the caller can assume that all
> the regsiter values will be same just before and after the 'call'
> instruction.

The caller assumes nothing; the caller is _guaranteed_ the register
rules described in the i386 ELF ABI.

Compiler writers will sometimes simply avoid registers they must save
and restore across function calls. That allows them to avoid push'ing
and pop'ing outside of calling another function.

Jeff