From: Matthias Braun Date: Wed, 11 Jan 2012 16:18:22 +0000 (+0100) Subject: sparc: respect frame_type alignment X-Git-Url: http://nsz.repo.hu/git/?a=commitdiff_plain;h=93d82d09d2a6e2e56be9781d7021492838642f2f;p=libfirm sparc: respect frame_type alignment This fixes the case where the stackframe size is not a multiple of the alignment. --- diff --git a/ir/be/sparc/sparc_stackframe.c b/ir/be/sparc/sparc_stackframe.c index 9a043d766..816dc2977 100644 --- a/ir/be/sparc/sparc_stackframe.c +++ b/ir/be/sparc/sparc_stackframe.c @@ -304,8 +304,26 @@ static void process_frame_types(ir_graph *irg) ir_type *between_type = layout->between_type; unsigned between_size = get_type_size_bytes(between_type); - ir_type *frame_type = get_irg_frame_type(irg); - unsigned frame_size = get_type_size_bytes(frame_type); + ir_type *frame_type = get_irg_frame_type(irg); + unsigned frame_size = get_type_size_bytes(frame_type); + unsigned frame_align = get_type_alignment_bytes(frame_type); + + /* There's the tricky case of the stackframe size not being a multiple + * of the alignment. There are 2 variants: + * + * - frame-pointer relative addressing: + * Increase frame_size in case it is not a multiple of the alignment as we + * address entities from the "top" with negative offsets + * - stack-pointer relative addressing: + * Stackframesize + SPARC_MIN_STACK_SIZE has to be aligned. Increase + * frame_size accordingly. + */ + if (!layout->sp_relative) { + frame_size = (frame_size + frame_align-1) & ~(frame_align-1); + } else { + unsigned misalign = SPARC_MIN_STACKSIZE % frame_align; + frame_size += misalign; + } ir_type *arg_type = layout->arg_type;