On 23 October 2007 18:25, skaller wrote:

> In
> 
>
http://gcc.gnu.org/onlinedocs/gcc-4.2.2/gcc/Explicit-Reg-Vars.html#Explicit-Re
g-Vars
> 
> it explains how to use register variables .. but doesn't list them.
> 
> Is there a document somewhere which lists
> 
> a) each CPU macro name

  Don't at all understand what you're referring to there.  Macro?  You mean a
#define?  Name of the cpu?  I don't see anything referring to the cpu name in
the explicit reg vars docs.

> b) all the registers supported

  Nope, but it should be the standard notation as defined by the manufacturer
in their reference manuals and as accepted by gas for the target in question.
If you absolutely have to know for certain, look at
gcc/config/<cpu-type>/<cpu-type.h> for the various *REGISTER_NAMES* macros
(same as what -ffixed-REGNAME accepts).

> I need to get the stack pointer when __builtin_frame_address(0) isn't
> working .. on amd64 this:
> 
> 
> register void *stack asm ("%rsp");
> 
> appears to work. 

  Yep.  I'd recommend using it like so:

#define STACK_POINTER_VALUE ({ register void *stack asm ("%rsp"); stack; })

just for safety's sake... you wouldn't want to go and accidentally use it as
an lvalue, now, would you?  :-O

> Also this is the current stack pointer .. not
> the frame pointer, which could be different.

  Yep, almost inevitably so I'm afraid.  Maybe a better solution than making
__builtin_frame_address(0) return an artificial address in functions where
there is no frame pointer would be just to have a
__builtin_initial_frame_pointer_offset() function that returns the size of the
frame, but even that wouldn't help if you're in the middle of a function call
sequence or something where gcc is pushing args to the stack.

    cheers,
      DaveK
-- 
Can't think of a witty .sigline today....

Reply via email to