Hi,
Currently, the macro STACK_BOUNDARY is defined as
Macro: STACK_BOUNDARY
Define this macro to the minimum alignment enforced by hardware for
the stack pointer on this machine. The definition is a C
expression for the desired alignment (measured in bits). This
value is used as a default if 'PREFERRED_STACK_BOUNDARY' is not
defined. On most machines, this should be the same as
'PARM_BOUNDARY'.
with no mentions about its type and bounds. However, at some point, the value
of this macro gets assigned to the field "regno_pointer_align" of "struct
emit_status" which points to an "unsigned char", hence if STACK_BOUNDARY gets
bigger than 255, it will overflow... Thankfully, the backend which defines the
highest value is microblaze with 128 < 255.
The assignment happens in "emit-rtl.c" through the REGNO_POINTER_ALIGN macro:
in function.h:
#define REGNO_POINTER_ALIGN(REGNO) (crtl->emit.regno_pointer_align[REGNO])
in emit-rtl.cc:
REGNO_POINTER_ALIGN (STACK_POINTER_REGNUM) = STACK_BOUNDARY;
[...]
REGNO_POINTER_ALIGN (VIRTUAL_OUTGOING_ARGS_REGNUM) = STACK_BOUNDARY;
Would it be possible to, either add an explicit bound to STACK_BOUNDARY in the
manual, and/or use an "unsigned int *" rather than and "unsigned char *" for
the field "regno_pointer_align".
Thanks,
Paul