Index: mn10300.c =================================================================== RCS file: /cvs/gcc/gcc/gcc/config/mn10300/mn10300.c,v retrieving revision 1.69 diff -u -r1.69 mn10300.c --- mn10300.c 4 Jul 2004 08:07:09 -0000 1.69 +++ mn10300.c 9 Jul 2004 08:42:29 -0000 @@ -43,6 +43,7 @@ #include "tm_p.h" #include "target.h" #include "target-def.h" +#include "tree-gimple.h" /* This is used by GOTaddr2picreg to uniquely identify UNSPEC_INT_LABELs. */ @@ -71,6 +72,7 @@ static void mn10300_file_start (void); static bool mn10300_return_in_memory (tree, tree); static rtx mn10300_builtin_saveregs (void); +static tree mn10300_gimplify_va_arg_expr (tree, tree, tree *, tree *); /* Initialize the GCC target structure. */ @@ -99,6 +101,9 @@ #undef TARGET_EXPAND_BUILTIN_SAVEREGS #define TARGET_EXPAND_BUILTIN_SAVEREGS mn10300_builtin_saveregs +#undef TARGET_GIMPLIFY_VA_ARG_EXPR +#define TARGET_GIMPLIFY_VA_ARG_EXPR mn10300_gimplify_va_arg_expr + static void mn10300_encode_section_info (tree, rtx, int); struct gcc_target targetm = TARGET_INITIALIZER; @@ -1457,40 +1462,34 @@ std_expand_builtin_va_start (valist, nextarg); } -rtx -mn10300_va_arg (tree valist, tree type) +static tree +mn10300_gimplify_va_arg_expr (tree valist, tree type, + tree *pre_p ATTRIBUTE_UNUSED, + tree *post_p ATTRIBUTE_UNUSED) { - HOST_WIDE_INT align, rsize; + HOST_WIDE_INT align, rsize, adjust; tree t, ptr, pptr; /* Compute the rounded size of the type. */ align = PARM_BOUNDARY / BITS_PER_UNIT; rsize = (((int_size_in_bytes (type) + align - 1) / align) * align); + adjust = rsize > 8 ? 4 : rsize; - t = build (POSTINCREMENT_EXPR, TREE_TYPE (valist), valist, - build_int_2 ((rsize > 8 ? 4 : rsize), 0)); - TREE_SIDE_EFFECTS (t) = 1; - + t = build2 (POSTINCREMENT_EXPR, TREE_TYPE (valist), + valist, build_int_2 (adjust, 0)); ptr = build_pointer_type (type); /* "Large" types are passed by reference. */ if (rsize > 8) { pptr = build_pointer_type (ptr); - t = build1 (NOP_EXPR, pptr, t); - TREE_SIDE_EFFECTS (t) = 1; - - t = build1 (INDIRECT_REF, ptr, t); - TREE_SIDE_EFFECTS (t) = 1; + t = fold_convert (pptr, t); + t = build_fold_indirect_ref (t); } else - { - t = build1 (NOP_EXPR, ptr, t); - TREE_SIDE_EFFECTS (t) = 1; - } + t = fold_convert (ptr, t); - /* Calculate! */ - return expand_expr (t, NULL_RTX, Pmode, EXPAND_NORMAL); + return build_fold_indirect_ref (t); } /* Return an RTX to represent where a value with mode MODE will be returned @@ -1843,9 +1842,6 @@ || XINT (x, 1) == UNSPEC_PLT)) return 1; - if (GET_CODE (x) == QUEUED) - return legitimate_pic_operand_p (QUEUED_VAR (x)); - fmt = GET_RTX_FORMAT (GET_CODE (x)); for (i = GET_RTX_LENGTH (GET_CODE (x)) - 1; i >= 0; i--) {