On 3/24/23 07:48, Paul Iannetta via Gcc wrote:
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".
Feel free to send a suitable patch to gcc-patches. THe alignment data
isn't held in the RTX structures, so it's not critical that it be kept
as small as possible. We don't want to waste space, so an unsigned
short might be better. A char was good for 30 years, so we don't need
to go crazy here.
The alternative would be to change the representation to store the log2
of the alignment. That would be a much larger change and would trade
off runtime for memory consumption. I would have suggested this
approach if the data were in the RTX structures amd space at a premium.
While I do see a trend in processor design to reduce/remove the
misalignment penalties (thus eliminating the driver for increasing data
alignment), that's been primarily in high end designs.
jeff