From: DJ Delorie Date: Fri, 7 Apr 2006 21:50:47 +0000 (-0400) Subject: m32c.c (m32c_function_arg): Structures are always passed on the stack. X-Git-Tag: releases/gcc-4.2.0~3382 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=9d746d5e11d4ab6d9449815d7489ac7917361ddc;p=thirdparty%2Fgcc.git m32c.c (m32c_function_arg): Structures are always passed on the stack. * config/m32c/m32c.c (m32c_function_arg): Structures are always passed on the stack. (m32c_init_cumulative_args): When a function returns a structure, always pass the pointer to that return area on the stack. (m32c_function_arg_advance): Don't increment the parameter number if we're processing the returned structure pointer. (pushm_info): Reverse order of registers. From-SVN: r112765 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8a403bf1e574..87613f8521a7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2006-04-07 DJ Delorie + + * config/m32c/m32c.c (m32c_function_arg): Structures are always + passed on the stack. + (m32c_init_cumulative_args): When a function returns a structure, + always pass the pointer to that return area on the stack. + (m32c_function_arg_advance): Don't increment the parameter number + if we're processing the returned structure pointer. + (pushm_info): Reverse order of registers. + 2006-04-07 Sebastian Pop * tree-ssa-loop-niter.c (inverse, number_of_iterations_ne, diff --git a/gcc/config/m32c/m32c.c b/gcc/config/m32c/m32c.c index 3625640c4e4a..186f666d0fbc 100644 --- a/gcc/config/m32c/m32c.c +++ b/gcc/config/m32c/m32c.c @@ -1204,15 +1204,15 @@ static struct int a24_bytes; } pushm_info[] = { - /* These are in push order. */ - { FB_REGNO, 0x01, 2, 4 }, - { SB_REGNO, 0x02, 2, 4 }, - { A1_REGNO, 0x04, 2, 4 }, - { A0_REGNO, 0x08, 2, 4 }, - { R3_REGNO, 0x10, 2, 2 }, - { R2_REGNO, 0x20, 2, 2 }, + /* These are in reverse push (nearest-to-sp) order. */ + { R0_REGNO, 0x80, 2, 2 }, { R1_REGNO, 0x40, 2, 2 }, - { R0_REGNO, 0x80, 2, 2 } + { R2_REGNO, 0x20, 2, 2 }, + { R3_REGNO, 0x10, 2, 2 }, + { A0_REGNO, 0x08, 2, 4 }, + { A1_REGNO, 0x04, 2, 4 }, + { SB_REGNO, 0x02, 2, 4 }, + { FB_REGNO, 0x01, 2, 4 } }; #define PUSHM_N (sizeof(pushm_info)/sizeof(pushm_info[0])) @@ -1475,6 +1475,9 @@ m32c_function_arg (CUMULATIVE_ARGS * ca, if (type && INTEGRAL_TYPE_P (type) && POINTER_TYPE_P (type)) return NULL_RTX; + if (type && AGGREGATE_TYPE_P (type)) + return NULL_RTX; + switch (ca->parm_num) { case 1: @@ -1508,12 +1511,15 @@ m32c_pass_by_reference (CUMULATIVE_ARGS * ca ATTRIBUTE_UNUSED, /* Implements INIT_CUMULATIVE_ARGS. */ void m32c_init_cumulative_args (CUMULATIVE_ARGS * ca, - tree fntype ATTRIBUTE_UNUSED, + tree fntype, rtx libname ATTRIBUTE_UNUSED, - tree fndecl ATTRIBUTE_UNUSED, + tree fndecl, int n_named_args ATTRIBUTE_UNUSED) { - ca->force_mem = 0; + if (fntype && aggregate_value_p (TREE_TYPE (fntype), fndecl)) + ca->force_mem = 1; + else + ca->force_mem = 0; ca->parm_num = 1; } @@ -1529,7 +1535,8 @@ m32c_function_arg_advance (CUMULATIVE_ARGS * ca, { if (ca->force_mem) ca->force_mem = 0; - ca->parm_num++; + else + ca->parm_num++; } /* Implements FUNCTION_ARG_REGNO_P. */