This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Struct function cleanups II


Hi,
this patch moves couple of extra fileds related to RTL data from struct
function.  I've added nested substructures for those to make whole stuff more
manageable and I also took the joy of removing awfully_verbose_and_pointless
current_function_* "compatibility" accestor macros as well as one unused field.
Since there is always one function in RTL form, definition of "current" is
quite pointless.

Replacements was done by script, I tried to take care of few formating
problems I've spot.  It is not that bad as new names tends to be shorter
so no linebreaking is needed.

Boostrapped/regtested i686-linux, OK?

Honza

	* function.h (incomming_args): Break out of struct function.
	(function_subsections): Break out of struct function.
	(rtl_data): Add args, subsections fields. Break out outgoing_args_size,
	return_rtx and hard_reg_initial_vals from struct function.
	Kill inl_max_label_num.
	(current_function_pops_args, current_function_args_info,
	current_function_args_size, current_function_args_size,
	current_function_pretend_args_size,
	current_function_outgoing_args_size,
	current_function_internal_arg_pointer, current_function_return_rtx):
	Kill compatibility accestor macros.
	* builtins.c (expand_builtin_apply_args_1): Update.
	(expand_builtin_next_arg): Update.
	* df-scan.c (df_get_call_refs): Update.
	* dbxout.c (dbxout_function_end): Update.
	* dwarf2out.c (dwarf2out_switch_text_section): Update.
	(output_line_info): Update.
	(secname_for_decl): Update.
	(dwarf2out_var_location): Update.
	* function.c (free_after_compilation): Update.
	(assign_parm_find_stack_rtl): Update.
	(assign_parms): Update.
	(expand_dummy_function_end): Update.
	(expand_function_end): Update.
	* calls.c (mem_overlaps_already_clobbered_arg_p): Update.
	(expand_call): Update.
	(emit_library_call_value_1): Update.
	(store_one_arg): Update.
	* varasm.c (initialize_cold_section_name): Update.
	(unlikely_text_section): Update.
	(unlikely_text_section_p): Update.
	(assemble_start_function): Update.
	(assemble_end_function): Update.
	(default_section_type_flags): Update.
	(switch_to_section): Update.
	* integrate.c (set_decl_abstract_flags): Update.
	(get_hard_reg_initial_val): Update.
	(has_hard_reg_initial_val): Update.
	(allocate_initial_values): Update.
	* resource.c (init_resource_info): Update.
	* config/alpha/alpha.c (NUM_ARGS): Update.
	(direct_return): Update.
	(alpha_va_start): Update.
	(alpha_sa_size): Update.
	(alpha_initial_elimination_offset): Update.
	(alpha_expand_prologue): Update.
	(alpha_start_function): Update.
	(alpha_expand_epilogue): Update.
	(unicosmk_initial_elimination_offset):
	* config/alpha/alpha.md (call expander): Update.
	* config/s390/s390.c (s390_register_info): Update.
	(s390_register_info): Update.
	(s390_frame_info): Update.
	(s390_initial_elimination_offset): Update.
	(s390_build_builtin_va_list): Update.
	(s390_va_start): Update.
	* config/spu/spu.c (direct_return): Update.
	(spu_expand_prologue): Update.
	(spu_initial_elimination_offset): Update.
	(spu_build_builtin_va_list): Update.
	(spu_va_start): Update.
	* config/sparc/sparc.c (sparc_init_modes): Update.
	(sparc_compute_frame_size): Update.
	(function_value): Update.
	* config/m32r/m32r.c (m32r_compute_frame_size): Update.
	* config/i386/i386.md (return expander): Update.
	* config/i386/i386.c (ix86_va_start): Update.
	(ix86_can_use_return_insn_p): Update.
	(ix86_compute_frame_layout): Update.
	(ix86_expand_epilogue): Update.
	* config/sh/sh.c (output_stack_adjust): Update.
	(calc_live_regs): Update.
	(sh_expand_prologue): Update.
	(sh_builtin_saveregs): Update.
	(sh_va_start): Update.
	(initial_elimination_offset): Update.
	(sh_allocate_initial_value): Update.
	(sh_function_ok_for_sibcall): Update.
	(sh_get_pr_initial_val): Update.
	* config/sh/sh.md (return expander): Update.
	* config/avr/avr.c (frame_pointer_required_p): UPdate.
	* config/crx/crx.c (crx_compute_frame): UPdate.
	(crx_initial_elimination_offset): UPdate.
	* config/xtensa/xtensa.c (compute_frame_size): Update
	(xtensa_builtin_saveregs): Update.
	(xtensa_va_start): Update.
	(order_regs_for_local_alloc): Update.
	* config/stormy16/stormy16.c (xstormy16_compute_stack_layout): Update.
	(xstormy16_expand_builtin_va_start): Update.
	* config/fr30/fr30.c (fr30_compute_frame_size): Update.
	* config/m68hc11/m68hc11.md (return expanders): Update.
	* config/m68hc11/m68hc11.c (expand_prologue): Update.
	(expand_epilogue): Update.
	* config/cris/cris.c (cris_initial_frame_pointer_offset): Update.
	(cris_simple_epilogue): Update.
	(cris_expand_prologue): Update.
	(cris_expand_epilogue): Update.
	* config/iq2000/iq2000.c (iq2000_va_start): Update.
	(compute_frame_size): Update.
	* config/mt/mt.c (mt_compute_frame_size): Update.
	* config/mn10300/mn10300.c (expand_prologue): Update.
	(expand_epilogue): Update.
	(initial_offset): Update.
	(mn10300_builtin_saveregs):
	* config/mn10300/mn10300.md (return expander): Update.
	* config/ia64/ia64.c (ia64_compute_frame_size): Update.
	(ia64_initial_elimination_offset): Update.
	(ia64_initial_elimination_offset): Update.
	(ia64_expand_prologue): Update.
	* config/m68k/m68k.md (return expander): Update.
	* config/rs6000/rs6000.c (rs6000_va_start): Update.
	(rs6000_stack_info): Update.
	* config/mcore/mcore.c (layout_mcore_frame): Update.
	(mcore_expand_prolog): Update.
	* config/arc/arc.c (arc_compute_frame_size): Update.
	* config/score/score3.c (score3_compute_frame_size): Update.
	* config/score/score7.c (score7_compute_frame_size): Update.
	* config/arm/arm.c (use_return_insn): Update.
	(thumb_find_work_register): Update.
	(arm_compute_save_reg_mask): Update.
	(arm_output_function_prologue): Update.
	(arm_output_epilogue): Update.
	(arm_size_return_regs): Update.
	(arm_get_frame_offsets): Update.
	(arm_expand_prologue): Update.
	(thumb_exit): Update.
	(thumb_unexpanded_epilogue): Update.
	(thumb1_output_function_prologue): Update.
	* config/pa/pa.md (return expander): Update.
	* config/pa/pa.c (compute_frame_size): Update.
	(hppa_builtin_saveregs): Update.
	* config/mips/mips.c (mips_va_start): Update.
	(mips16_build_function_stub): Update.
	(mips_compute_frame_info): Update.
	(mips_restore_gp): Update.
	(mips_output_function_prologue): Update.
	(mips_expand_prologue): Update.
	* config/v850/v850.c (compute_frame_size): Update.
	(expand_prologue): * config/mmix/mmix.c (along): update.
	(mmix_initial_elimination_offset): update.
	(mmix_reorg): update.
	(mmix_use_simple_return): update.
	(mmix_expand_prologue): update.
	(mmix_expand_epilogue): Update.
	* config/bfin/bfin.c (bfin_initial_elimination_offset): Update.
	(emit_link_insn): Update.
Index: builtins.c
===================================================================
*** builtins.c	(revision 133759)
--- builtins.c	(working copy)
*************** expand_builtin_apply_args_1 (void)
*** 1351,1357 ****
       as we might have pretended they were passed.  Make sure it's a valid
       operand, as emit_move_insn isn't expected to handle a PLUS.  */
    tem
!     = force_operand (plus_constant (tem, current_function_pretend_args_size),
  		     NULL_RTX);
  #endif
    emit_move_insn (adjust_address (registers, Pmode, 0), tem);
--- 1351,1357 ----
       as we might have pretended they were passed.  Make sure it's a valid
       operand, as emit_move_insn isn't expected to handle a PLUS.  */
    tem
!     = force_operand (plus_constant (tem, rtl.args.pretend_args_size),
  		     NULL_RTX);
  #endif
    emit_move_insn (adjust_address (registers, Pmode, 0), tem);
*************** static rtx
*** 4600,4606 ****
  expand_builtin_args_info (tree exp)
  {
    int nwords = sizeof (CUMULATIVE_ARGS) / sizeof (int);
!   int *word_ptr = (int *) &current_function_args_info;
  
    gcc_assert (sizeof (CUMULATIVE_ARGS) % sizeof (int) == 0);
  
--- 4600,4606 ----
  expand_builtin_args_info (tree exp)
  {
    int nwords = sizeof (CUMULATIVE_ARGS) / sizeof (int);
!   int *word_ptr = (int *) &rtl.args.info;
  
    gcc_assert (sizeof (CUMULATIVE_ARGS) % sizeof (int) == 0);
  
*************** expand_builtin_next_arg (void)
*** 4632,4639 ****
    /* Checking arguments is already done in fold_builtin_next_arg
       that must be called before this function.  */
    return expand_binop (ptr_mode, add_optab,
! 		       current_function_internal_arg_pointer,
! 		       current_function_arg_offset_rtx,
  		       NULL_RTX, 0, OPTAB_LIB_WIDEN);
  }
  
--- 4632,4639 ----
    /* Checking arguments is already done in fold_builtin_next_arg
       that must be called before this function.  */
    return expand_binop (ptr_mode, add_optab,
! 		       rtl.args.internal_arg_pointer,
! 		       rtl.args.arg_offset_rtx,
  		       NULL_RTX, 0, OPTAB_LIB_WIDEN);
  }
  
Index: df-scan.c
===================================================================
*** df-scan.c	(revision 133756)
--- df-scan.c	(working copy)
*************** df_get_call_refs (struct df_collection_r
*** 3230,3236 ****
  	  && (!is_sibling_call
  	      || !bitmap_bit_p (df->exit_block_uses, ui)
  	      || refers_to_regno_p (ui, ui+1, 
! 				    current_function_return_rtx, NULL)))
          df_ref_record (collection_rec, regno_reg_rtx[ui], 
  		       NULL, bb, insn, DF_REF_REG_DEF, DF_REF_MAY_CLOBBER | flags, -1, -1);
      }
--- 3230,3236 ----
  	  && (!is_sibling_call
  	      || !bitmap_bit_p (df->exit_block_uses, ui)
  	      || refers_to_regno_p (ui, ui+1, 
! 				    rtl.return_rtx, NULL)))
          df_ref_record (collection_rec, regno_reg_rtx[ui], 
  		       NULL, bb, insn, DF_REF_REG_DEF, DF_REF_MAY_CLOBBER | flags, -1, -1);
      }
Index: dbxout.c
===================================================================
*** dbxout.c	(revision 133756)
--- dbxout.c	(working copy)
*************** dbxout_function_end (tree decl)
*** 928,938 ****
    if (flag_reorder_blocks_and_partition)
      {
        dbxout_begin_empty_stabs (N_FUN);
!       dbxout_stab_value_label_diff (cfun->hot_section_end_label, 
! 				    cfun->hot_section_label);
        dbxout_begin_empty_stabs (N_FUN);
!       dbxout_stab_value_label_diff (cfun->cold_section_end_label, 
! 				    cfun->cold_section_label);
      }
    else
      {
--- 928,938 ----
    if (flag_reorder_blocks_and_partition)
      {
        dbxout_begin_empty_stabs (N_FUN);
!       dbxout_stab_value_label_diff (rtl.subsections.hot_section_end_label, 
! 				    rtl.subsections.hot_section_label);
        dbxout_begin_empty_stabs (N_FUN);
!       dbxout_stab_value_label_diff (rtl.subsections.cold_section_end_label, 
! 				    rtl.subsections.cold_section_label);
      }
    else
      {
Index: dwarf2out.c
===================================================================
*** dwarf2out.c	(revision 133756)
--- dwarf2out.c	(working copy)
*************** dwarf2out_switch_text_section (void)
*** 2744,2753 ****
  
    fde = &fde_table[fde_table_in_use - 1];
    fde->dw_fde_switched_sections = true;
!   fde->dw_fde_hot_section_label = cfun->hot_section_label;
!   fde->dw_fde_hot_section_end_label = cfun->hot_section_end_label;
!   fde->dw_fde_unlikely_section_label = cfun->cold_section_label;
!   fde->dw_fde_unlikely_section_end_label = cfun->cold_section_end_label;
    have_multiple_function_sections = true;
  
    /* Reset the current label on switching text sections, so that we
--- 2744,2753 ----
  
    fde = &fde_table[fde_table_in_use - 1];
    fde->dw_fde_switched_sections = true;
!   fde->dw_fde_hot_section_label = rtl.subsections.hot_section_label;
!   fde->dw_fde_hot_section_end_label = rtl.subsections.hot_section_end_label;
!   fde->dw_fde_unlikely_section_label = rtl.subsections.cold_section_label;
!   fde->dw_fde_unlikely_section_end_label = rtl.subsections.cold_section_end_label;
    have_multiple_function_sections = true;
  
    /* Reset the current label on switching text sections, so that we
*************** output_line_info (void)
*** 8216,8222 ****
    current_line = 1;
  
    if (cfun && in_cold_section_p)
!     strcpy (prev_line_label, cfun->cold_section_label);
    else
      strcpy (prev_line_label, text_section_label);
    for (lt_index = 1; lt_index < line_info_table_in_use; ++lt_index)
--- 8216,8222 ----
    current_line = 1;
  
    if (cfun && in_cold_section_p)
!     strcpy (prev_line_label, rtl.subsections.cold_section_label);
    else
      strcpy (prev_line_label, text_section_label);
    for (lt_index = 1; lt_index < line_info_table_in_use; ++lt_index)
*************** secname_for_decl (const_tree decl)
*** 10729,10735 ****
        secname = TREE_STRING_POINTER (sectree);
      }
    else if (cfun && in_cold_section_p)
!     secname = cfun->cold_section_label;
    else
      secname = text_section_label;
  
--- 10729,10735 ----
        secname = TREE_STRING_POINTER (sectree);
      }
    else if (cfun && in_cold_section_p)
!     secname = rtl.subsections.cold_section_label;
    else
      secname = text_section_label;
  
*************** dwarf2out_var_location (rtx loc_note)
*** 14406,14412 ****
    newloc->next = NULL;
  
    if (cfun && in_cold_section_p)
!     newloc->section_label = cfun->cold_section_label;
    else
      newloc->section_label = text_section_label;
  
--- 14406,14412 ----
    newloc->next = NULL;
  
    if (cfun && in_cold_section_p)
!     newloc->section_label = rtl.subsections.cold_section_label;
    else
      newloc->section_label = text_section_label;
  
Index: function.c
===================================================================
*** function.c	(revision 133759)
--- function.c	(working copy)
*************** free_after_compilation (struct function 
*** 319,328 ****
    f->eh = NULL;
    f->machine = NULL;
    f->cfg = NULL;
- 
-   f->arg_offset_rtx = NULL;
-   f->return_rtx = NULL;
-   f->internal_arg_pointer = NULL;
  }
  
  /* Return size needed for stack frame based on slots so far allocated.
--- 319,324 ----
*************** static int cfa_offset;
*** 1173,1190 ****
     parameters.  However, if OUTGOING_REG_PARM_STACK space is not defined,
     stack space for register parameters is not pushed by the caller, but
     rather part of the fixed stack areas and hence not included in
!    `current_function_outgoing_args_size'.  Nevertheless, we must allow
     for it when allocating stack dynamic objects.  */
  
  #if defined(REG_PARM_STACK_SPACE)
  #define STACK_DYNAMIC_OFFSET(FNDECL)	\
  ((ACCUMULATE_OUTGOING_ARGS						      \
!   ? (current_function_outgoing_args_size				      \
       + (OUTGOING_REG_PARM_STACK_SPACE ? 0 : REG_PARM_STACK_SPACE (FNDECL)))   \
    : 0) + (STACK_POINTER_OFFSET))
  #else
  #define STACK_DYNAMIC_OFFSET(FNDECL)	\
! ((ACCUMULATE_OUTGOING_ARGS ? current_function_outgoing_args_size : 0)	      \
   + (STACK_POINTER_OFFSET))
  #endif
  #endif
--- 1169,1186 ----
     parameters.  However, if OUTGOING_REG_PARM_STACK space is not defined,
     stack space for register parameters is not pushed by the caller, but
     rather part of the fixed stack areas and hence not included in
!    `rtl.outgoing_args_size'.  Nevertheless, we must allow
     for it when allocating stack dynamic objects.  */
  
  #if defined(REG_PARM_STACK_SPACE)
  #define STACK_DYNAMIC_OFFSET(FNDECL)	\
  ((ACCUMULATE_OUTGOING_ARGS						      \
!   ? (rtl.outgoing_args_size				      \
       + (OUTGOING_REG_PARM_STACK_SPACE ? 0 : REG_PARM_STACK_SPACE (FNDECL)))   \
    : 0) + (STACK_POINTER_OFFSET))
  #else
  #define STACK_DYNAMIC_OFFSET(FNDECL)	\
! ((ACCUMULATE_OUTGOING_ARGS ? rtl.outgoing_args_size : 0)	      \
   + (STACK_POINTER_OFFSET))
  #endif
  #endif
*************** assign_parm_find_stack_rtl (tree parm, s
*** 2293,2299 ****
    else
      offset_rtx = ARGS_SIZE_RTX (data->locate.offset);
  
!   stack_parm = current_function_internal_arg_pointer;
    if (offset_rtx != const0_rtx)
      stack_parm = gen_rtx_PLUS (Pmode, stack_parm, offset_rtx);
    stack_parm = gen_rtx_MEM (data->promoted_mode, stack_parm);
--- 2289,2295 ----
    else
      offset_rtx = ARGS_SIZE_RTX (data->locate.offset);
  
!   stack_parm = rtl.args.internal_arg_pointer;
    if (offset_rtx != const0_rtx)
      stack_parm = gen_rtx_PLUS (Pmode, stack_parm, offset_rtx);
    stack_parm = gen_rtx_MEM (data->promoted_mode, stack_parm);
*************** assign_parms (tree fndecl)
*** 2979,2985 ****
    struct assign_parm_data_all all;
    tree fnargs, parm;
  
!   current_function_internal_arg_pointer
      = targetm.calls.internal_arg_pointer ();
  
    assign_parms_initialize_all (&all);
--- 2975,2981 ----
    struct assign_parm_data_all all;
    tree fnargs, parm;
  
!   rtl.args.internal_arg_pointer
      = targetm.calls.internal_arg_pointer ();
  
    assign_parms_initialize_all (&all);
*************** assign_parms (tree fndecl)
*** 3059,3106 ****
      }
  
    /* We have aligned all the args, so add space for the pretend args.  */
!   current_function_pretend_args_size = all.pretend_args_size;
    all.stack_args_size.constant += all.extra_pretend_bytes;
!   current_function_args_size = all.stack_args_size.constant;
  
    /* Adjust function incoming argument size for alignment and
       minimum length.  */
  
  #ifdef REG_PARM_STACK_SPACE
!   current_function_args_size = MAX (current_function_args_size,
  				    REG_PARM_STACK_SPACE (fndecl));
  #endif
  
!   current_function_args_size = CEIL_ROUND (current_function_args_size,
  					   PARM_BOUNDARY / BITS_PER_UNIT);
  
  #ifdef ARGS_GROW_DOWNWARD
!   current_function_arg_offset_rtx
      = (all.stack_args_size.var == 0 ? GEN_INT (-all.stack_args_size.constant)
         : expand_expr (size_diffop (all.stack_args_size.var,
  				   size_int (-all.stack_args_size.constant)),
  		      NULL_RTX, VOIDmode, 0));
  #else
!   current_function_arg_offset_rtx = ARGS_SIZE_RTX (all.stack_args_size);
  #endif
  
    /* See how many bytes, if any, of its args a function should try to pop
       on return.  */
  
!   current_function_pops_args = RETURN_POPS_ARGS (fndecl, TREE_TYPE (fndecl),
! 						 current_function_args_size);
  
    /* For stdarg.h function, save info about
       regs and stack space used by the named args.  */
  
!   current_function_args_info = all.args_so_far;
  
    /* Set the rtx used for the function return value.  Put this in its
       own variable so any optimizers that need this information don't have
       to include tree.h.  Do this here so it gets done when an inlined
       function gets output.  */
  
!   current_function_return_rtx
      = (DECL_RTL_SET_P (DECL_RESULT (fndecl))
         ? DECL_RTL (DECL_RESULT (fndecl)) : NULL_RTX);
  
--- 3055,3102 ----
      }
  
    /* We have aligned all the args, so add space for the pretend args.  */
!   rtl.args.pretend_args_size = all.pretend_args_size;
    all.stack_args_size.constant += all.extra_pretend_bytes;
!   rtl.args.size = all.stack_args_size.constant;
  
    /* Adjust function incoming argument size for alignment and
       minimum length.  */
  
  #ifdef REG_PARM_STACK_SPACE
!   rtl.args.size = MAX (rtl.args.size,
  				    REG_PARM_STACK_SPACE (fndecl));
  #endif
  
!   rtl.args.size = CEIL_ROUND (rtl.args.size,
  					   PARM_BOUNDARY / BITS_PER_UNIT);
  
  #ifdef ARGS_GROW_DOWNWARD
!   rtl.args.arg_offset_rtx
      = (all.stack_args_size.var == 0 ? GEN_INT (-all.stack_args_size.constant)
         : expand_expr (size_diffop (all.stack_args_size.var,
  				   size_int (-all.stack_args_size.constant)),
  		      NULL_RTX, VOIDmode, 0));
  #else
!   rtl.args.arg_offset_rtx = ARGS_SIZE_RTX (all.stack_args_size);
  #endif
  
    /* See how many bytes, if any, of its args a function should try to pop
       on return.  */
  
!   rtl.args.pops_args = RETURN_POPS_ARGS (fndecl, TREE_TYPE (fndecl),
! 						 rtl.args.size);
  
    /* For stdarg.h function, save info about
       regs and stack space used by the named args.  */
  
!   rtl.args.info = all.args_so_far;
  
    /* Set the rtx used for the function return value.  Put this in its
       own variable so any optimizers that need this information don't have
       to include tree.h.  Do this here so it gets done when an inlined
       function gets output.  */
  
!   rtl.return_rtx
      = (DECL_RTL_SET_P (DECL_RESULT (fndecl))
         ? DECL_RTL (DECL_RESULT (fndecl)) : NULL_RTX);
  
*************** assign_parms (tree fndecl)
*** 3121,3130 ****
  	  real_decl_rtl = targetm.calls.function_value (TREE_TYPE (decl_result),
  							fndecl, true);
  	  REG_FUNCTION_VALUE_P (real_decl_rtl) = 1;
! 	  /* The delay slot scheduler assumes that current_function_return_rtx
  	     holds the hard register containing the return value, not a
  	     temporary pseudo.  */
! 	  current_function_return_rtx = real_decl_rtl;
  	}
      }
  }
--- 3117,3126 ----
  	  real_decl_rtl = targetm.calls.function_value (TREE_TYPE (decl_result),
  							fndecl, true);
  	  REG_FUNCTION_VALUE_P (real_decl_rtl) = 1;
! 	  /* The delay slot scheduler assumes that rtl.return_rtx
  	     holds the hard register containing the return value, not a
  	     temporary pseudo.  */
! 	  rtl.return_rtx = real_decl_rtl;
  	}
      }
  }
*************** expand_dummy_function_end (void)
*** 4319,4325 ****
  void
  diddle_return_value (void (*doit) (rtx, void *), void *arg)
  {
!   rtx outgoing = current_function_return_rtx;
  
    if (! outgoing)
      return;
--- 4315,4321 ----
  void
  diddle_return_value (void (*doit) (rtx, void *), void *arg)
  {
!   rtx outgoing = rtl.return_rtx;
  
    if (! outgoing)
      return;
*************** expand_function_end (void)
*** 4480,4486 ****
  	  ? REGNO (decl_rtl) >= FIRST_PSEUDO_REGISTER
  	  : DECL_REGISTER (decl_result))
  	{
! 	  rtx real_decl_rtl = current_function_return_rtx;
  
  	  /* This should be set in assign_parms.  */
  	  gcc_assert (REG_FUNCTION_VALUE_P (real_decl_rtl));
--- 4476,4482 ----
  	  ? REGNO (decl_rtl) >= FIRST_PSEUDO_REGISTER
  	  : DECL_REGISTER (decl_result))
  	{
! 	  rtx real_decl_rtl = rtl.return_rtx;
  
  	  /* This should be set in assign_parms.  */
  	  gcc_assert (REG_FUNCTION_VALUE_P (real_decl_rtl));
*************** expand_function_end (void)
*** 4488,4494 ****
  	  /* If this is a BLKmode structure being returned in registers,
  	     then use the mode computed in expand_return.  Note that if
  	     decl_rtl is memory, then its mode may have been changed,
! 	     but that current_function_return_rtx has not.  */
  	  if (GET_MODE (real_decl_rtl) == BLKmode)
  	    PUT_MODE (real_decl_rtl, GET_MODE (decl_rtl));
  
--- 4484,4490 ----
  	  /* If this is a BLKmode structure being returned in registers,
  	     then use the mode computed in expand_return.  Note that if
  	     decl_rtl is memory, then its mode may have been changed,
! 	     but that rtl.return_rtx has not.  */
  	  if (GET_MODE (real_decl_rtl) == BLKmode)
  	    PUT_MODE (real_decl_rtl, GET_MODE (decl_rtl));
  
*************** expand_function_end (void)
*** 4585,4591 ****
  
        /* Show return register used to hold result (in this case the address
  	 of the result.  */
!       current_function_return_rtx = outgoing;
      }
  
    /* Emit the actual code to clobber return register.  */
--- 4581,4587 ----
  
        /* Show return register used to hold result (in this case the address
  	 of the result.  */
!       rtl.return_rtx = outgoing;
      }
  
    /* Emit the actual code to clobber return register.  */
Index: function.h
===================================================================
*** function.h	(revision 133759)
--- function.h	(working copy)
*************** struct varasm_status GTY(())
*** 171,182 ****
--- 171,248 ----
    unsigned int deferred_constants;
  };
  
+ /* Information mainlined about RTL representation of incomming arguments.  */
+ struct incoming_args GTY(())
+ {
+   /* Number of bytes of args popped by function being compiled on its return.
+      Zero if no bytes are to be popped.
+      May affect compilation of return insn or of function epilogue.  */
+   int pops_args;
+ 
+   /* If function's args have a fixed size, this is that size, in bytes.
+      Otherwise, it is -1.
+      May affect compilation of return insn or of function epilogue.  */
+   int size;
+ 
+   /* # bytes the prologue should push and pretend that the caller pushed them.
+      The prologue must do this, but only if parms can be passed in
+      registers.  */
+   int pretend_args_size;
+ 
+   /* This is the offset from the arg pointer to the place where the first
+      anonymous arg can be found, if there is one.  */
+   rtx arg_offset_rtx;
+ 
+   /* Quantities of various kinds of registers
+      used for the current function's args.  */
+   CUMULATIVE_ARGS info;
+ 
+   /* The arg pointer hard register, or the pseudo into which it was copied.  */
+   rtx internal_arg_pointer;
+ };
+ 
+ /* Data for function partitioning.  */
+ struct function_subsections GTY(())
+ {
+   /* Assembly labels for the hot and cold text sections, to
+      be used by debugger functions for determining the size of text
+      sections.  */
+ 
+   const char *hot_section_label;
+   const char *cold_section_label;
+   const char *hot_section_end_label;
+   const char *cold_section_end_label;
+ 
+   /* String to be used for name of cold text sections, via
+      targetm.asm_out.named_section.  */
+ 
+   const char *unlikely_text_section_name;
+ };
+ 
  /* Datastructures maintained for currently processed function in RTL form.  */
  struct rtl_data GTY(())
  {
    struct expr_status expr;
    struct emit_status emit;
    struct varasm_status varasm;
+   struct incoming_args args;
+   struct function_subsections subsections;
+ 
+   /* For function.c  */
+ 
+   /* # of bytes of outgoing arguments.  If ACCUMULATE_OUTGOING_ARGS is
+      defined, the needed space is pushed by the prologue.  */
+   int outgoing_args_size;
+ 
+   /* If nonzero, an RTL expression for the location at which the current
+      function returns its result.  If the current function returns its
+      result in a register, current_function_return_rtx will always be
+      the hard register containing the result.  */
+   rtx return_rtx;
+ 
+   /* Opaque pointer used by get_hard_reg_initial_val and
+      has_hard_reg_initial_val (see integrate.[hc]).  */
+   struct initial_value_struct *hard_reg_initial_vals;
  
    /* List (chain of EXPR_LIST) of labels heading the current handlers for
       nonlocal gotos.  */
*************** struct rtl_data GTY(())
*** 222,229 ****
    /* Current nesting level for temporaries.  */
    int x_temp_slot_level;
  
-   /* Highest label number in current function.  */
-   int inl_max_label_num;
  };
  
  #define return_label (rtl.x_return_label)
--- 288,293 ----
*************** struct function GTY(())
*** 266,311 ****
    /* Function containing this function, if any.  */
    struct function *outer;
  
-   /* Number of bytes of args popped by function being compiled on its return.
-      Zero if no bytes are to be popped.
-      May affect compilation of return insn or of function epilogue.  */
-   int pops_args;
- 
-   /* If function's args have a fixed size, this is that size, in bytes.
-      Otherwise, it is -1.
-      May affect compilation of return insn or of function epilogue.  */
-   int args_size;
- 
-   /* # bytes the prologue should push and pretend that the caller pushed them.
-      The prologue must do this, but only if parms can be passed in
-      registers.  */
-   int pretend_args_size;
- 
-   /* # of bytes of outgoing arguments.  If ACCUMULATE_OUTGOING_ARGS is
-      defined, the needed space is pushed by the prologue.  */
-   int outgoing_args_size;
- 
-   /* This is the offset from the arg pointer to the place where the first
-      anonymous arg can be found, if there is one.  */
-   rtx arg_offset_rtx;
- 
-   /* Quantities of various kinds of registers
-      used for the current function's args.  */
-   CUMULATIVE_ARGS args_info;
- 
-   /* If nonzero, an RTL expression for the location at which the current
-      function returns its result.  If the current function returns its
-      result in a register, current_function_return_rtx will always be
-      the hard register containing the result.  */
-   rtx return_rtx;
- 
-   /* The arg pointer hard register, or the pseudo into which it was copied.  */
-   rtx internal_arg_pointer;
- 
-   /* Opaque pointer used by get_hard_reg_initial_val and
-      has_hard_reg_initial_val (see integrate.[hc]).  */
-   struct initial_value_struct *hard_reg_initial_vals;
- 
    /* A PARM_DECL that should contain the static chain for this function.
       It will be initialized at the beginning of the function.  */
    tree static_chain_decl;
--- 330,335 ----
*************** struct function GTY(())
*** 354,373 ****
    /* The variables unexpanded so far.  */
    tree unexpanded_var_list;
  
-   /* Assembly labels for the hot and cold text sections, to
-      be used by debugger functions for determining the size of text
-      sections.  */
- 
-   const char *hot_section_label;
-   const char *cold_section_label;
-   const char *hot_section_end_label;
-   const char *cold_section_end_label;
- 
-   /* String to be used for name of cold text sections, via
-      targetm.asm_out.named_section.  */
- 
-   const char *unlikely_text_section_name;
- 
    /* A variable living at the top of the frame that holds a known value.
       Used for detecting stack clobbers.  */
    tree stack_protect_guard;
--- 378,383 ----
*************** extern void pop_cfun (void);
*** 525,531 ****
  extern void instantiate_decl_rtl (rtx x);
  
  /* For backward compatibility... eventually these should all go away.  */
- #define current_function_pops_args (cfun->pops_args)
  #define current_function_returns_struct (cfun->returns_struct)
  #define current_function_returns_pcc_struct (cfun->returns_pcc_struct)
  #define current_function_calls_setjmp (cfun->calls_setjmp)
--- 535,540 ----
*************** extern void instantiate_decl_rtl (rtx x)
*** 533,546 ****
  #define current_function_accesses_prior_frames (cfun->accesses_prior_frames)
  #define current_function_calls_eh_return (cfun->calls_eh_return)
  #define current_function_is_thunk (cfun->is_thunk)
- #define current_function_args_info (cfun->args_info)
- #define current_function_args_size (cfun->args_size)
- #define current_function_pretend_args_size (cfun->pretend_args_size)
- #define current_function_outgoing_args_size (cfun->outgoing_args_size)
- #define current_function_arg_offset_rtx (cfun->arg_offset_rtx)
  #define current_function_stdarg (cfun->stdarg)
- #define current_function_internal_arg_pointer (cfun->internal_arg_pointer)
- #define current_function_return_rtx (cfun->return_rtx)
  #define current_function_profile (cfun->profile)
  #define current_function_funcdef_no (cfun->funcdef_no)
  #define current_function_limit_stack (cfun->limit_stack)
--- 542,548 ----
Index: calls.c
===================================================================
*** calls.c	(revision 133756)
--- calls.c	(working copy)
*************** mem_overlaps_already_clobbered_arg_p (rt
*** 1521,1536 ****
  {
    HOST_WIDE_INT i;
  
!   if (addr == current_function_internal_arg_pointer)
      i = 0;
    else if (GET_CODE (addr) == PLUS
! 	   && XEXP (addr, 0) == current_function_internal_arg_pointer
  	   && GET_CODE (XEXP (addr, 1)) == CONST_INT)
      i = INTVAL (XEXP (addr, 1));
    /* Return true for arg pointer based indexed addressing.  */
    else if (GET_CODE (addr) == PLUS
! 	   && (XEXP (addr, 0) == current_function_internal_arg_pointer
! 	       || XEXP (addr, 1) == current_function_internal_arg_pointer))
      return true;
    else
      return false;
--- 1521,1536 ----
  {
    HOST_WIDE_INT i;
  
!   if (addr == rtl.args.internal_arg_pointer)
      i = 0;
    else if (GET_CODE (addr) == PLUS
! 	   && XEXP (addr, 0) == rtl.args.internal_arg_pointer
  	   && GET_CODE (XEXP (addr, 1)) == CONST_INT)
      i = INTVAL (XEXP (addr, 1));
    /* Return true for arg pointer based indexed addressing.  */
    else if (GET_CODE (addr) == PLUS
! 	   && (XEXP (addr, 0) == rtl.args.internal_arg_pointer
! 	       || XEXP (addr, 1) == rtl.args.internal_arg_pointer))
      return true;
    else
      return false;
*************** expand_call (tree exp, rtx target, int i
*** 2289,2304 ****
        || (fndecl && decl_function_context (fndecl) == current_function_decl)
        /* If this function requires more stack slots than the current
  	 function, we cannot change it into a sibling call.
! 	 current_function_pretend_args_size is not part of the
  	 stack allocated by our caller.  */
!       || args_size.constant > (current_function_args_size
! 			       - current_function_pretend_args_size)
        /* If the callee pops its own arguments, then it must pop exactly
  	 the same number of arguments as the current function.  */
        || (RETURN_POPS_ARGS (fndecl, funtype, args_size.constant)
  	  != RETURN_POPS_ARGS (current_function_decl,
  			       TREE_TYPE (current_function_decl),
! 			       current_function_args_size))
        || !lang_hooks.decls.ok_for_sibcall (fndecl))
      try_tail_call = 0;
  
--- 2289,2304 ----
        || (fndecl && decl_function_context (fndecl) == current_function_decl)
        /* If this function requires more stack slots than the current
  	 function, we cannot change it into a sibling call.
! 	 rtl.args.pretend_args_size is not part of the
  	 stack allocated by our caller.  */
!       || args_size.constant > (rtl.args.size
! 			       - rtl.args.pretend_args_size)
        /* If the callee pops its own arguments, then it must pop exactly
  	 the same number of arguments as the current function.  */
        || (RETURN_POPS_ARGS (fndecl, funtype, args_size.constant)
  	  != RETURN_POPS_ARGS (current_function_decl,
  			       TREE_TYPE (current_function_decl),
! 			       rtl.args.size))
        || !lang_hooks.decls.ok_for_sibcall (fndecl))
      try_tail_call = 0;
  
*************** expand_call (tree exp, rtx target, int i
*** 2404,2412 ****
  	  argblock = virtual_incoming_args_rtx;
  	  argblock
  #ifdef STACK_GROWS_DOWNWARD
! 	    = plus_constant (argblock, current_function_pretend_args_size);
  #else
! 	    = plus_constant (argblock, -current_function_pretend_args_size);
  #endif
  	  stored_args_map = sbitmap_alloc (args_size.constant);
  	  sbitmap_zero (stored_args_map);
--- 2404,2412 ----
  	  argblock = virtual_incoming_args_rtx;
  	  argblock
  #ifdef STACK_GROWS_DOWNWARD
! 	    = plus_constant (argblock, rtl.args.pretend_args_size);
  #else
! 	    = plus_constant (argblock, -rtl.args.pretend_args_size);
  #endif
  	  stored_args_map = sbitmap_alloc (args_size.constant);
  	  sbitmap_zero (stored_args_map);
*************** expand_call (tree exp, rtx target, int i
*** 2443,2450 ****
  	     the prologue (if ACCUMULATE_OUTGOING_ARGS, or stack overflow
  	     checking).  */
  
! 	  if (needed > current_function_outgoing_args_size)
! 	    current_function_outgoing_args_size = needed;
  
  	  if (must_preallocate)
  	    {
--- 2443,2450 ----
  	     the prologue (if ACCUMULATE_OUTGOING_ARGS, or stack overflow
  	     checking).  */
  
! 	  if (needed > rtl.outgoing_args_size)
! 	    rtl.outgoing_args_size = needed;
  
  	  if (must_preallocate)
  	    {
*************** emit_library_call_value_1 (int retval, r
*** 3570,3577 ****
    if (!OUTGOING_REG_PARM_STACK_SPACE)
      args_size.constant -= reg_parm_stack_space;
  
!   if (args_size.constant > current_function_outgoing_args_size)
!     current_function_outgoing_args_size = args_size.constant;
  
    if (ACCUMULATE_OUTGOING_ARGS)
      {
--- 3570,3577 ----
    if (!OUTGOING_REG_PARM_STACK_SPACE)
      args_size.constant -= reg_parm_stack_space;
  
!   if (args_size.constant > rtl.outgoing_args_size)
!     rtl.outgoing_args_size = args_size.constant;
  
    if (ACCUMULATE_OUTGOING_ARGS)
      {
*************** store_one_arg (struct arg_data *arg, rtx
*** 4344,4356 ****
  	  rtx x = arg->value;
  	  int i = 0;
  
! 	  if (XEXP (x, 0) == current_function_internal_arg_pointer
  	      || (GET_CODE (XEXP (x, 0)) == PLUS
  		  && XEXP (XEXP (x, 0), 0) ==
! 		     current_function_internal_arg_pointer
  		  && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT))
  	    {
! 	      if (XEXP (x, 0) != current_function_internal_arg_pointer)
  		i = INTVAL (XEXP (XEXP (x, 0), 1));
  
  	      /* expand_call should ensure this.  */
--- 4344,4356 ----
  	  rtx x = arg->value;
  	  int i = 0;
  
! 	  if (XEXP (x, 0) == rtl.args.internal_arg_pointer
  	      || (GET_CODE (XEXP (x, 0)) == PLUS
  		  && XEXP (XEXP (x, 0), 0) ==
! 		     rtl.args.internal_arg_pointer
  		  && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT))
  	    {
! 	      if (XEXP (x, 0) != rtl.args.internal_arg_pointer)
  		i = INTVAL (XEXP (XEXP (x, 0), 1));
  
  	      /* expand_call should ensure this.  */
Index: varasm.c
===================================================================
*** varasm.c	(revision 133759)
--- varasm.c	(working copy)
*************** initialize_cold_section_name (void)
*** 611,617 ****
    tree dsn;
  
    gcc_assert (cfun && current_function_decl);
!   if (cfun->unlikely_text_section_name)
      return;
  
    dsn = DECL_SECTION_NAME (current_function_decl);
--- 611,617 ----
    tree dsn;
  
    gcc_assert (cfun && current_function_decl);
!   if (rtl.subsections.unlikely_text_section_name)
      return;
  
    dsn = DECL_SECTION_NAME (current_function_decl);
*************** initialize_cold_section_name (void)
*** 623,632 ****
        stripped_name = targetm.strip_name_encoding (name);
  
        buffer = ACONCAT ((stripped_name, "_unlikely", NULL));
!       cfun->unlikely_text_section_name = ggc_strdup (buffer);
      }
    else
!     cfun->unlikely_text_section_name =  UNLIKELY_EXECUTED_TEXT_SECTION_NAME;
  }
  
  /* Tell assembler to switch to unlikely-to-be-executed text section.  */
--- 623,632 ----
        stripped_name = targetm.strip_name_encoding (name);
  
        buffer = ACONCAT ((stripped_name, "_unlikely", NULL));
!       rtl.subsections.unlikely_text_section_name = ggc_strdup (buffer);
      }
    else
!     rtl.subsections.unlikely_text_section_name =  UNLIKELY_EXECUTED_TEXT_SECTION_NAME;
  }
  
  /* Tell assembler to switch to unlikely-to-be-executed text section.  */
*************** unlikely_text_section (void)
*** 636,645 ****
  {
    if (cfun)
      {
!       if (!cfun->unlikely_text_section_name)
  	initialize_cold_section_name ();
  
!       return get_named_section (NULL, cfun->unlikely_text_section_name, 0);
      }
    else
      return get_named_section (NULL, UNLIKELY_EXECUTED_TEXT_SECTION_NAME, 0);
--- 636,645 ----
  {
    if (cfun)
      {
!       if (!rtl.subsections.unlikely_text_section_name)
  	initialize_cold_section_name ();
  
!       return get_named_section (NULL, rtl.subsections.unlikely_text_section_name, 0);
      }
    else
      return get_named_section (NULL, UNLIKELY_EXECUTED_TEXT_SECTION_NAME, 0);
*************** unlikely_text_section_p (section *sect)
*** 656,662 ****
    const char *name;
  
    if (cfun)
!     name = cfun->unlikely_text_section_name;
    else
      name = UNLIKELY_EXECUTED_TEXT_SECTION_NAME;
  
--- 656,662 ----
    const char *name;
  
    if (cfun)
!     name = rtl.subsections.unlikely_text_section_name;
    else
      name = UNLIKELY_EXECUTED_TEXT_SECTION_NAME;
  
*************** assemble_start_function (tree decl, cons
*** 1587,1613 ****
    char tmp_label[100];
    bool hot_label_written = false;
  
!   cfun->unlikely_text_section_name = NULL;
  
    first_function_block_is_cold = false;
    if (flag_reorder_blocks_and_partition)
      {
        ASM_GENERATE_INTERNAL_LABEL (tmp_label, "LHOTB", const_labelno);
!       cfun->hot_section_label = ggc_strdup (tmp_label);
        ASM_GENERATE_INTERNAL_LABEL (tmp_label, "LCOLDB", const_labelno);
!       cfun->cold_section_label = ggc_strdup (tmp_label);
        ASM_GENERATE_INTERNAL_LABEL (tmp_label, "LHOTE", const_labelno);
!       cfun->hot_section_end_label = ggc_strdup (tmp_label);
        ASM_GENERATE_INTERNAL_LABEL (tmp_label, "LCOLDE", const_labelno);
!       cfun->cold_section_end_label = ggc_strdup (tmp_label);
        const_labelno++;
      }
    else
      {
!       cfun->hot_section_label = NULL;
!       cfun->cold_section_label = NULL;
!       cfun->hot_section_end_label = NULL;
!       cfun->cold_section_end_label = NULL;
      }
  
    /* The following code does not need preprocessing in the assembler.  */
--- 1587,1613 ----
    char tmp_label[100];
    bool hot_label_written = false;
  
!   rtl.subsections.unlikely_text_section_name = NULL;
  
    first_function_block_is_cold = false;
    if (flag_reorder_blocks_and_partition)
      {
        ASM_GENERATE_INTERNAL_LABEL (tmp_label, "LHOTB", const_labelno);
!       rtl.subsections.hot_section_label = ggc_strdup (tmp_label);
        ASM_GENERATE_INTERNAL_LABEL (tmp_label, "LCOLDB", const_labelno);
!       rtl.subsections.cold_section_label = ggc_strdup (tmp_label);
        ASM_GENERATE_INTERNAL_LABEL (tmp_label, "LHOTE", const_labelno);
!       rtl.subsections.hot_section_end_label = ggc_strdup (tmp_label);
        ASM_GENERATE_INTERNAL_LABEL (tmp_label, "LCOLDE", const_labelno);
!       rtl.subsections.cold_section_end_label = ggc_strdup (tmp_label);
        const_labelno++;
      }
    else
      {
!       rtl.subsections.hot_section_label = NULL;
!       rtl.subsections.cold_section_label = NULL;
!       rtl.subsections.hot_section_end_label = NULL;
!       rtl.subsections.cold_section_end_label = NULL;
      }
  
    /* The following code does not need preprocessing in the assembler.  */
*************** assemble_start_function (tree decl, cons
*** 1628,1634 ****
      {
        switch_to_section (unlikely_text_section ());
        assemble_align (DECL_ALIGN (decl));
!       ASM_OUTPUT_LABEL (asm_out_file, cfun->cold_section_label);
  
        /* When the function starts with a cold section, we need to explicitly
  	 align the hot section and write out the hot section label.
--- 1628,1634 ----
      {
        switch_to_section (unlikely_text_section ());
        assemble_align (DECL_ALIGN (decl));
!       ASM_OUTPUT_LABEL (asm_out_file, rtl.subsections.cold_section_label);
  
        /* When the function starts with a cold section, we need to explicitly
  	 align the hot section and write out the hot section label.
*************** assemble_start_function (tree decl, cons
*** 1638,1644 ****
  	{
  	  switch_to_section (text_section);
  	  assemble_align (DECL_ALIGN (decl));
! 	  ASM_OUTPUT_LABEL (asm_out_file, cfun->hot_section_label);
  	  hot_label_written = true;
  	  first_function_block_is_cold = true;
  	}
--- 1638,1644 ----
  	{
  	  switch_to_section (text_section);
  	  assemble_align (DECL_ALIGN (decl));
! 	  ASM_OUTPUT_LABEL (asm_out_file, rtl.subsections.hot_section_label);
  	  hot_label_written = true;
  	  first_function_block_is_cold = true;
  	}
*************** assemble_start_function (tree decl, cons
*** 1652,1660 ****
  
        initialize_cold_section_name ();
  
!       if (cfun->unlikely_text_section_name
  	  && strcmp (TREE_STRING_POINTER (DECL_SECTION_NAME (decl)),
! 		     cfun->unlikely_text_section_name) == 0)
  	first_function_block_is_cold = true;
      }
  
--- 1652,1660 ----
  
        initialize_cold_section_name ();
  
!       if (rtl.subsections.unlikely_text_section_name
  	  && strcmp (TREE_STRING_POINTER (DECL_SECTION_NAME (decl)),
! 		     rtl.subsections.unlikely_text_section_name) == 0)
  	first_function_block_is_cold = true;
      }
  
*************** assemble_start_function (tree decl, cons
*** 1665,1671 ****
    switch_to_section (function_section (decl));
    if (flag_reorder_blocks_and_partition
        && !hot_label_written)
!     ASM_OUTPUT_LABEL (asm_out_file, cfun->hot_section_label);
  
    /* Tell assembler to move to target machine's alignment for functions.  */
    align = floor_log2 (DECL_ALIGN (decl) / BITS_PER_UNIT);
--- 1665,1671 ----
    switch_to_section (function_section (decl));
    if (flag_reorder_blocks_and_partition
        && !hot_label_written)
!     ASM_OUTPUT_LABEL (asm_out_file, rtl.subsections.hot_section_label);
  
    /* Tell assembler to move to target machine's alignment for functions.  */
    align = floor_log2 (DECL_ALIGN (decl) / BITS_PER_UNIT);
*************** assemble_end_function (tree decl, const 
*** 1743,1754 ****
  
        save_text_section = in_section;
        switch_to_section (unlikely_text_section ());
!       ASM_OUTPUT_LABEL (asm_out_file, cfun->cold_section_end_label);
        if (first_function_block_is_cold)
  	switch_to_section (text_section);
        else
  	switch_to_section (function_section (decl));
!       ASM_OUTPUT_LABEL (asm_out_file, cfun->hot_section_end_label);
        switch_to_section (save_text_section);
      }
  }
--- 1743,1754 ----
  
        save_text_section = in_section;
        switch_to_section (unlikely_text_section ());
!       ASM_OUTPUT_LABEL (asm_out_file, rtl.subsections.cold_section_end_label);
        if (first_function_block_is_cold)
  	switch_to_section (text_section);
        else
  	switch_to_section (function_section (decl));
!       ASM_OUTPUT_LABEL (asm_out_file, rtl.subsections.hot_section_end_label);
        switch_to_section (save_text_section);
      }
  }
*************** default_section_type_flags (tree decl, c
*** 5540,5547 ****
      flags = 0;
    else if (current_function_decl
  	   && cfun
! 	   && cfun->unlikely_text_section_name
! 	   && strcmp (name, cfun->unlikely_text_section_name) == 0)
      flags = SECTION_CODE;
    else if (!decl
  	   && (!current_function_decl || !cfun)
--- 5540,5547 ----
      flags = 0;
    else if (current_function_decl
  	   && cfun
! 	   && rtl.subsections.unlikely_text_section_name
! 	   && strcmp (name, rtl.subsections.unlikely_text_section_name) == 0)
      flags = SECTION_CODE;
    else if (!decl
  	   && (!current_function_decl || !cfun)
*************** switch_to_section (section *new_section)
*** 6316,6325 ****
      {
      case SECTION_NAMED:
        if (cfun
! 	  && !cfun->unlikely_text_section_name
  	  && strcmp (new_section->named.name,
  		     UNLIKELY_EXECUTED_TEXT_SECTION_NAME) == 0)
! 	cfun->unlikely_text_section_name = UNLIKELY_EXECUTED_TEXT_SECTION_NAME;
  
        targetm.asm_out.named_section (new_section->named.name,
  				     new_section->named.common.flags,
--- 6316,6325 ----
      {
      case SECTION_NAMED:
        if (cfun
! 	  && !rtl.subsections.unlikely_text_section_name
  	  && strcmp (new_section->named.name,
  		     UNLIKELY_EXECUTED_TEXT_SECTION_NAME) == 0)
! 	rtl.subsections.unlikely_text_section_name = UNLIKELY_EXECUTED_TEXT_SECTION_NAME;
  
        targetm.asm_out.named_section (new_section->named.name,
  				     new_section->named.common.flags,
Index: integrate.c
===================================================================
*** integrate.c	(revision 133756)
--- integrate.c	(working copy)
*************** set_decl_abstract_flags (tree decl, int 
*** 208,214 ****
  rtx
  get_hard_reg_initial_reg (struct function *fun, rtx reg)
  {
!   struct initial_value_struct *ivs = fun->hard_reg_initial_vals;
    int i;
  
    if (ivs == 0)
--- 208,214 ----
  rtx
  get_hard_reg_initial_reg (struct function *fun, rtx reg)
  {
!   struct initial_value_struct *ivs = rtl.hard_reg_initial_vals;
    int i;
  
    if (ivs == 0)
*************** get_hard_reg_initial_val (enum machine_m
*** 234,247 ****
    if (rv)
      return rv;
  
!   ivs = cfun->hard_reg_initial_vals;
    if (ivs == 0)
      {
        ivs = ggc_alloc (sizeof (initial_value_struct));
        ivs->num_entries = 0;
        ivs->max_entries = 5;
        ivs->entries = ggc_alloc (5 * sizeof (initial_value_pair));
!       cfun->hard_reg_initial_vals = ivs;
      }
  
    if (ivs->num_entries >= ivs->max_entries)
--- 234,247 ----
    if (rv)
      return rv;
  
!   ivs = rtl.hard_reg_initial_vals;
    if (ivs == 0)
      {
        ivs = ggc_alloc (sizeof (initial_value_struct));
        ivs->num_entries = 0;
        ivs->max_entries = 5;
        ivs->entries = ggc_alloc (5 * sizeof (initial_value_pair));
!       rtl.hard_reg_initial_vals = ivs;
      }
  
    if (ivs->num_entries >= ivs->max_entries)
*************** has_hard_reg_initial_val (enum machine_m
*** 268,274 ****
    struct initial_value_struct *ivs;
    int i;
  
!   ivs = cfun->hard_reg_initial_vals;
    if (ivs != 0)
      for (i = 0; i < ivs->num_entries; i++)
        if (GET_MODE (ivs->entries[i].hard_reg) == mode
--- 268,274 ----
    struct initial_value_struct *ivs;
    int i;
  
!   ivs = rtl.hard_reg_initial_vals;
    if (ivs != 0)
      for (i = 0; i < ivs->num_entries; i++)
        if (GET_MODE (ivs->entries[i].hard_reg) == mode
*************** has_hard_reg_initial_val (enum machine_m
*** 281,287 ****
  unsigned int
  emit_initial_value_sets (void)
  {
!   struct initial_value_struct *ivs = cfun->hard_reg_initial_vals;
    int i;
    rtx seq;
  
--- 281,287 ----
  unsigned int
  emit_initial_value_sets (void)
  {
!   struct initial_value_struct *ivs = rtl.hard_reg_initial_vals;
    int i;
    rtx seq;
  
*************** allocate_initial_values (rtx *reg_equiv_
*** 324,330 ****
  {
    if (targetm.allocate_initial_value)
      {
!       struct initial_value_struct *ivs = cfun->hard_reg_initial_vals;
        int i;
  
        if (ivs == 0)
--- 324,330 ----
  {
    if (targetm.allocate_initial_value)
      {
!       struct initial_value_struct *ivs = rtl.hard_reg_initial_vals;
        int i;
  
        if (ivs == 0)
Index: resource.c
===================================================================
*** resource.c	(revision 133756)
--- resource.c	(working copy)
*************** init_resource_info (rtx epilogue_insn)
*** 1150,1157 ****
    else
      SET_HARD_REG_BIT (end_of_function_needs.regs, STACK_POINTER_REGNUM);
  
!   if (current_function_return_rtx != 0)
!     mark_referenced_resources (current_function_return_rtx,
  			       &end_of_function_needs, 1);
  
    for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
--- 1150,1157 ----
    else
      SET_HARD_REG_BIT (end_of_function_needs.regs, STACK_POINTER_REGNUM);
  
!   if (rtl.return_rtx != 0)
!     mark_referenced_resources (rtl.return_rtx,
  			       &end_of_function_needs, 1);
  
    for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
Index: config/alpha/alpha.c
===================================================================
*** config/alpha/alpha.c	(revision 133756)
--- config/alpha/alpha.c	(working copy)
*************** static struct alpha_rtx_cost_data const 
*** 189,197 ****
  
  /* Get the number of args of a function in one of two ways.  */
  #if TARGET_ABI_OPEN_VMS || TARGET_ABI_UNICOSMK
! #define NUM_ARGS current_function_args_info.num_args
  #else
! #define NUM_ARGS current_function_args_info
  #endif
  
  #define REG_PV 27
--- 189,197 ----
  
  /* Get the number of args of a function in one of two ways.  */
  #if TARGET_ABI_OPEN_VMS || TARGET_ABI_UNICOSMK
! #define NUM_ARGS rtl.args.info.num_args
  #else
! #define NUM_ARGS rtl.args.info
  #endif
  
  #define REG_PV 27
*************** direct_return (void)
*** 643,650 ****
  	  && reload_completed
  	  && alpha_sa_size () == 0
  	  && get_frame_size () == 0
! 	  && current_function_outgoing_args_size == 0
! 	  && current_function_pretend_args_size == 0);
  }
  
  /* Return the ADDR_VEC associated with a tablejump insn.  */
--- 643,650 ----
  	  && reload_completed
  	  && alpha_sa_size () == 0
  	  && get_frame_size () == 0
! 	  && rtl.outgoing_args_size == 0
! 	  && rtl.args.pretend_args_size == 0);
  }
  
  /* Return the ADDR_VEC associated with a tablejump insn.  */
*************** alpha_va_start (tree valist, rtx nextarg
*** 6104,6110 ****
    if (NUM_ARGS < 6)
      offset = TARGET_ABI_OPEN_VMS ? UNITS_PER_WORD : 6 * UNITS_PER_WORD;
    else
!     offset = -6 * UNITS_PER_WORD + current_function_pretend_args_size;
  
    if (TARGET_ABI_OPEN_VMS)
      {
--- 6104,6110 ----
    if (NUM_ARGS < 6)
      offset = TARGET_ABI_OPEN_VMS ? UNITS_PER_WORD : 6 * UNITS_PER_WORD;
    else
!     offset = -6 * UNITS_PER_WORD + rtl.args.pretend_args_size;
  
    if (TARGET_ABI_OPEN_VMS)
      {
*************** alpha_sa_size (void)
*** 7170,7176 ****
  
        alpha_procedure_type
  	= (sa_size || get_frame_size() != 0
! 	   || current_function_outgoing_args_size
  	   || current_function_stdarg || current_function_calls_alloca
  	   || frame_pointer_needed)
  	  ? PT_STACK : PT_REGISTER;
--- 7170,7176 ----
  
        alpha_procedure_type
  	= (sa_size || get_frame_size() != 0
! 	   || rtl.outgoing_args_size
  	   || current_function_stdarg || current_function_calls_alloca
  	   || frame_pointer_needed)
  	  ? PT_STACK : PT_REGISTER;
*************** alpha_sa_size (void)
*** 7206,7212 ****
  	= (frame_pointer_needed
  	   || current_function_has_nonlocal_label
  	   || alpha_procedure_type == PT_STACK
! 	   || current_function_outgoing_args_size)
  	  ? REG_PV : HARD_FRAME_POINTER_REGNUM;
  
        /* If we want to copy PV into FP, we need to find some register
--- 7206,7212 ----
  	= (frame_pointer_needed
  	   || current_function_has_nonlocal_label
  	   || alpha_procedure_type == PT_STACK
! 	   || rtl.outgoing_args_size)
  	  ? REG_PV : HARD_FRAME_POINTER_REGNUM;
  
        /* If we want to copy PV into FP, we need to find some register
*************** alpha_initial_elimination_offset (unsign
*** 7251,7257 ****
    HOST_WIDE_INT ret;
  
    ret = alpha_sa_size ();
!   ret += ALPHA_ROUND (current_function_outgoing_args_size);
  
    switch (from)
      {
--- 7251,7257 ----
    HOST_WIDE_INT ret;
  
    ret = alpha_sa_size ();
!   ret += ALPHA_ROUND (rtl.outgoing_args_size);
  
    switch (from)
      {
*************** alpha_initial_elimination_offset (unsign
*** 7260,7267 ****
  
      case ARG_POINTER_REGNUM:
        ret += (ALPHA_ROUND (get_frame_size ()
! 			   + current_function_pretend_args_size)
! 	      - current_function_pretend_args_size);
        break;
  
      default:
--- 7260,7267 ----
  
      case ARG_POINTER_REGNUM:
        ret += (ALPHA_ROUND (get_frame_size ()
! 			   + rtl.args.pretend_args_size)
! 	      - rtl.args.pretend_args_size);
        break;
  
      default:
*************** alpha_expand_prologue (void)
*** 7469,7491 ****
      frame_size = ALPHA_ROUND (sa_size
  			      + (alpha_procedure_type == PT_STACK ? 8 : 0)
  			      + frame_size
! 			      + current_function_pretend_args_size);
    else if (TARGET_ABI_UNICOSMK)
      /* We have to allocate space for the DSIB if we generate a frame.  */
      frame_size = ALPHA_ROUND (sa_size
  			      + (alpha_procedure_type == PT_STACK ? 48 : 0))
  		 + ALPHA_ROUND (frame_size
! 				+ current_function_outgoing_args_size);
    else
!     frame_size = (ALPHA_ROUND (current_function_outgoing_args_size)
  		  + sa_size
  		  + ALPHA_ROUND (frame_size
! 				 + current_function_pretend_args_size));
  
    if (TARGET_ABI_OPEN_VMS)
      reg_offset = 8;
    else
!     reg_offset = ALPHA_ROUND (current_function_outgoing_args_size);
  
    alpha_sa_mask (&imask, &fmask);
  
--- 7469,7491 ----
      frame_size = ALPHA_ROUND (sa_size
  			      + (alpha_procedure_type == PT_STACK ? 8 : 0)
  			      + frame_size
! 			      + rtl.args.pretend_args_size);
    else if (TARGET_ABI_UNICOSMK)
      /* We have to allocate space for the DSIB if we generate a frame.  */
      frame_size = ALPHA_ROUND (sa_size
  			      + (alpha_procedure_type == PT_STACK ? 48 : 0))
  		 + ALPHA_ROUND (frame_size
! 				+ rtl.outgoing_args_size);
    else
!     frame_size = (ALPHA_ROUND (rtl.outgoing_args_size)
  		  + sa_size
  		  + ALPHA_ROUND (frame_size
! 				 + rtl.args.pretend_args_size));
  
    if (TARGET_ABI_OPEN_VMS)
      reg_offset = 8;
    else
!     reg_offset = ALPHA_ROUND (rtl.outgoing_args_size);
  
    alpha_sa_mask (&imask, &fmask);
  
*************** alpha_expand_prologue (void)
*** 7699,7712 ****
  	FRP (emit_move_insn (hard_frame_pointer_rtx, stack_pointer_rtx));
  
        /* If we have to allocate space for outgoing args, do it now.  */
!       if (current_function_outgoing_args_size != 0)
  	{
  	  rtx seq
  	    = emit_move_insn (stack_pointer_rtx,
  			      plus_constant
  			      (hard_frame_pointer_rtx,
  			       - (ALPHA_ROUND
! 				  (current_function_outgoing_args_size))));
  
  	  /* Only set FRAME_RELATED_P on the stack adjustment we just emitted
  	     if ! frame_pointer_needed. Setting the bit will change the CFA
--- 7699,7712 ----
  	FRP (emit_move_insn (hard_frame_pointer_rtx, stack_pointer_rtx));
  
        /* If we have to allocate space for outgoing args, do it now.  */
!       if (rtl.outgoing_args_size != 0)
  	{
  	  rtx seq
  	    = emit_move_insn (stack_pointer_rtx,
  			      plus_constant
  			      (hard_frame_pointer_rtx,
  			       - (ALPHA_ROUND
! 				  (rtl.outgoing_args_size))));
  
  	  /* Only set FRAME_RELATED_P on the stack adjustment we just emitted
  	     if ! frame_pointer_needed. Setting the bit will change the CFA
*************** alpha_expand_prologue (void)
*** 7718,7724 ****
  	       frame_pointer_needed
  	       => vms_unwind_regno == HARD_FRAME_POINTER_REGNUM
  	     and
! 	       current_function_outgoing_args_size != 0
  	       => alpha_procedure_type != PT_NULL,
  
  	     so when we are not setting the bit here, we are guaranteed to
--- 7718,7724 ----
  	       frame_pointer_needed
  	       => vms_unwind_regno == HARD_FRAME_POINTER_REGNUM
  	     and
! 	       rtl.outgoing_args_size != 0
  	       => alpha_procedure_type != PT_NULL,
  
  	     so when we are not setting the bit here, we are guaranteed to
*************** alpha_start_function (FILE *file, const 
*** 7795,7816 ****
      frame_size = ALPHA_ROUND (sa_size
  			      + (alpha_procedure_type == PT_STACK ? 8 : 0)
  			      + frame_size
! 			      + current_function_pretend_args_size);
    else if (TARGET_ABI_UNICOSMK)
      frame_size = ALPHA_ROUND (sa_size
  			      + (alpha_procedure_type == PT_STACK ? 48 : 0))
  		 + ALPHA_ROUND (frame_size
! 			      + current_function_outgoing_args_size);
    else
!     frame_size = (ALPHA_ROUND (current_function_outgoing_args_size)
  		  + sa_size
  		  + ALPHA_ROUND (frame_size
! 				 + current_function_pretend_args_size));
  
    if (TARGET_ABI_OPEN_VMS)
      reg_offset = 8;
    else
!     reg_offset = ALPHA_ROUND (current_function_outgoing_args_size);
  
    alpha_sa_mask (&imask, &fmask);
  
--- 7795,7816 ----
      frame_size = ALPHA_ROUND (sa_size
  			      + (alpha_procedure_type == PT_STACK ? 8 : 0)
  			      + frame_size
! 			      + rtl.args.pretend_args_size);
    else if (TARGET_ABI_UNICOSMK)
      frame_size = ALPHA_ROUND (sa_size
  			      + (alpha_procedure_type == PT_STACK ? 48 : 0))
  		 + ALPHA_ROUND (frame_size
! 			      + rtl.outgoing_args_size);
    else
!     frame_size = (ALPHA_ROUND (rtl.outgoing_args_size)
  		  + sa_size
  		  + ALPHA_ROUND (frame_size
! 				 + rtl.args.pretend_args_size));
  
    if (TARGET_ABI_OPEN_VMS)
      reg_offset = 8;
    else
!     reg_offset = ALPHA_ROUND (rtl.outgoing_args_size);
  
    alpha_sa_mask (&imask, &fmask);
  
*************** alpha_start_function (FILE *file, const 
*** 7880,7886 ****
      }
  
    /* Set up offsets to alpha virtual arg/local debugging pointer.  */
!   alpha_auto_offset = -frame_size + current_function_pretend_args_size;
    alpha_arg_offset = -frame_size + 48;
  
    /* Describe our frame.  If the frame size is larger than an integer,
--- 7880,7886 ----
      }
  
    /* Set up offsets to alpha virtual arg/local debugging pointer.  */
!   alpha_auto_offset = -frame_size + rtl.args.pretend_args_size;
    alpha_arg_offset = -frame_size + 48;
  
    /* Describe our frame.  If the frame size is larger than an integer,
*************** alpha_start_function (FILE *file, const 
*** 7899,7905 ****
  	     (frame_pointer_needed
  	      ? HARD_FRAME_POINTER_REGNUM : STACK_POINTER_REGNUM),
  	     frame_size >= max_frame_size ? 0 : frame_size,
! 	     current_function_pretend_args_size);
  
    /* Describe which registers were spilled.  */
    if (TARGET_ABI_UNICOSMK)
--- 7899,7905 ----
  	     (frame_pointer_needed
  	      ? HARD_FRAME_POINTER_REGNUM : STACK_POINTER_REGNUM),
  	     frame_size >= max_frame_size ? 0 : frame_size,
! 	     rtl.args.pretend_args_size);
  
    /* Describe which registers were spilled.  */
    if (TARGET_ABI_UNICOSMK)
*************** alpha_expand_epilogue (void)
*** 7994,8010 ****
      frame_size = ALPHA_ROUND (sa_size
  			      + (alpha_procedure_type == PT_STACK ? 8 : 0)
  			      + frame_size
! 			      + current_function_pretend_args_size);
    else if (TARGET_ABI_UNICOSMK)
      frame_size = ALPHA_ROUND (sa_size
  			      + (alpha_procedure_type == PT_STACK ? 48 : 0))
  		 + ALPHA_ROUND (frame_size
! 			      + current_function_outgoing_args_size);
    else
!     frame_size = (ALPHA_ROUND (current_function_outgoing_args_size)
  		  + sa_size
  		  + ALPHA_ROUND (frame_size
! 				 + current_function_pretend_args_size));
  
    if (TARGET_ABI_OPEN_VMS)
      {
--- 7994,8010 ----
      frame_size = ALPHA_ROUND (sa_size
  			      + (alpha_procedure_type == PT_STACK ? 8 : 0)
  			      + frame_size
! 			      + rtl.args.pretend_args_size);
    else if (TARGET_ABI_UNICOSMK)
      frame_size = ALPHA_ROUND (sa_size
  			      + (alpha_procedure_type == PT_STACK ? 48 : 0))
  		 + ALPHA_ROUND (frame_size
! 			      + rtl.outgoing_args_size);
    else
!     frame_size = (ALPHA_ROUND (rtl.outgoing_args_size)
  		  + sa_size
  		  + ALPHA_ROUND (frame_size
! 				 + rtl.args.pretend_args_size));
  
    if (TARGET_ABI_OPEN_VMS)
      {
*************** alpha_expand_epilogue (void)
*** 8014,8020 ****
            reg_offset = 0;
      }
    else
!     reg_offset = ALPHA_ROUND (current_function_outgoing_args_size);
  
    alpha_sa_mask (&imask, &fmask);
  
--- 8014,8020 ----
            reg_offset = 0;
      }
    else
!     reg_offset = ALPHA_ROUND (rtl.outgoing_args_size);
  
    alpha_sa_mask (&imask, &fmask);
  
*************** unicosmk_initial_elimination_offset (int
*** 9796,9807 ****
    else if (from == ARG_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM)
      return 0;
    else if (from == FRAME_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
!     return (ALPHA_ROUND (current_function_outgoing_args_size)
  	    + ALPHA_ROUND (get_frame_size()));
    else if (from == ARG_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
      return (ALPHA_ROUND (fixed_size)
  	    + ALPHA_ROUND (get_frame_size()
! 			   + current_function_outgoing_args_size));
    else
      gcc_unreachable ();
  }
--- 9796,9807 ----
    else if (from == ARG_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM)
      return 0;
    else if (from == FRAME_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
!     return (ALPHA_ROUND (rtl.outgoing_args_size)
  	    + ALPHA_ROUND (get_frame_size()));
    else if (from == ARG_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
      return (ALPHA_ROUND (fixed_size)
  	    + ALPHA_ROUND (get_frame_size()
! 			   + rtl.outgoing_args_size));
    else
      gcc_unreachable ();
  }
Index: config/alpha/alpha.md
===================================================================
*** config/alpha/alpha.md	(revision 133756)
--- config/alpha/alpha.md	(working copy)
***************
*** 474,484 ****
     && INTVAL (operands[2])
  	< (0x7fff8000
  	   - FIRST_PSEUDO_REGISTER * UNITS_PER_WORD
! 	   - ALPHA_ROUND(current_function_outgoing_args_size)
  	   - (ALPHA_ROUND (get_frame_size ()
  			   + max_reg_num () * UNITS_PER_WORD
! 			   + current_function_pretend_args_size)
! 	      - current_function_pretend_args_size))"
    "@
     lda %0,%2(%1)
     ldah %0,%h2(%1)
--- 474,484 ----
     && INTVAL (operands[2])
  	< (0x7fff8000
  	   - FIRST_PSEUDO_REGISTER * UNITS_PER_WORD
! 	   - ALPHA_ROUND(rtl.outgoing_args_size)
  	   - (ALPHA_ROUND (get_frame_size ()
  			   + max_reg_num () * UNITS_PER_WORD
! 			   + rtl.args.pretend_args_size)
! 	      - rtl.args.pretend_args_size))"
    "@
     lda %0,%2(%1)
     ldah %0,%h2(%1)
Index: config/s390/s390.c
===================================================================
*** config/s390/s390.c	(revision 133756)
--- config/s390/s390.c	(working copy)
*************** s390_register_info (int clobbered_regs[]
*** 6620,6628 ****
      {
        /* Varargs functions need to save gprs 2 to 6.  */
        if (cfun->va_list_gpr_size
! 	  && current_function_args_info.gprs < GP_ARG_NUM_REG)
  	{
! 	  int min_gpr = current_function_args_info.gprs;
  	  int max_gpr = min_gpr + cfun->va_list_gpr_size;
  	  if (max_gpr > GP_ARG_NUM_REG)
  	    max_gpr = GP_ARG_NUM_REG;
--- 6620,6628 ----
      {
        /* Varargs functions need to save gprs 2 to 6.  */
        if (cfun->va_list_gpr_size
! 	  && rtl.args.info.gprs < GP_ARG_NUM_REG)
  	{
! 	  int min_gpr = rtl.args.info.gprs;
  	  int max_gpr = min_gpr + cfun->va_list_gpr_size;
  	  if (max_gpr > GP_ARG_NUM_REG)
  	    max_gpr = GP_ARG_NUM_REG;
*************** s390_register_info (int clobbered_regs[]
*** 6644,6652 ****
  
        /* Mark f0, f2 for 31 bit and f0-f4 for 64 bit to be saved.  */
        if (TARGET_HARD_FLOAT && cfun->va_list_fpr_size
! 	  && current_function_args_info.fprs < FP_ARG_NUM_REG)
  	{
! 	  int min_fpr = current_function_args_info.fprs;
  	  int max_fpr = min_fpr + cfun->va_list_fpr_size;
  	  if (max_fpr > FP_ARG_NUM_REG)
  	    max_fpr = FP_ARG_NUM_REG;
--- 6644,6652 ----
  
        /* Mark f0, f2 for 31 bit and f0-f4 for 64 bit to be saved.  */
        if (TARGET_HARD_FLOAT && cfun->va_list_fpr_size
! 	  && rtl.args.info.fprs < FP_ARG_NUM_REG)
  	{
! 	  int min_fpr = rtl.args.info.fprs;
  	  int max_fpr = min_fpr + cfun->va_list_fpr_size;
  	  if (max_fpr > FP_ARG_NUM_REG)
  	    max_fpr = FP_ARG_NUM_REG;
*************** s390_frame_info (void)
*** 6744,6750 ****
  
    if (!TARGET_PACKED_STACK)
      cfun_frame_layout.frame_size += (STACK_POINTER_OFFSET
! 				     + current_function_outgoing_args_size
  				     + cfun_frame_layout.high_fprs * 8);
    else
      {
--- 6744,6750 ----
  
    if (!TARGET_PACKED_STACK)
      cfun_frame_layout.frame_size += (STACK_POINTER_OFFSET
! 				     + rtl.outgoing_args_size
  				     + cfun_frame_layout.high_fprs * 8);
    else
      {
*************** s390_frame_info (void)
*** 6772,6778 ****
  				       STACK_BOUNDARY / BITS_PER_UNIT - 1)
  				      & ~(STACK_BOUNDARY / BITS_PER_UNIT - 1));
  
!       cfun_frame_layout.frame_size += current_function_outgoing_args_size;
      }
  }
  
--- 6772,6778 ----
  				       STACK_BOUNDARY / BITS_PER_UNIT - 1)
  				      & ~(STACK_BOUNDARY / BITS_PER_UNIT - 1));
  
!       cfun_frame_layout.frame_size += rtl.outgoing_args_size;
      }
  }
  
*************** s390_initial_elimination_offset (int fro
*** 6986,6992 ****
      case FRAME_POINTER_REGNUM:
        offset = (get_frame_size() 
  		+ STACK_POINTER_OFFSET
! 		+ current_function_outgoing_args_size);
        break;
  
      case ARG_POINTER_REGNUM:
--- 6986,6992 ----
      case FRAME_POINTER_REGNUM:
        offset = (get_frame_size() 
  		+ STACK_POINTER_OFFSET
! 		+ rtl.outgoing_args_size);
        break;
  
      case ARG_POINTER_REGNUM:
*************** s390_build_builtin_va_list (void)
*** 8011,8019 ****
     The following global variables are used to initialize
     the va_list structure:
  
!      current_function_args_info:
         holds number of gprs and fprs used for named arguments.
!      current_function_arg_offset_rtx:
         holds the offset of the first anonymous stack argument
         (relative to the virtual arg pointer).  */
  
--- 8011,8019 ----
     The following global variables are used to initialize
     the va_list structure:
  
!      rtl.args.info:
         holds number of gprs and fprs used for named arguments.
!      rtl.args.arg_offset_rtx:
         holds the offset of the first anonymous stack argument
         (relative to the virtual arg pointer).  */
  
*************** s390_va_start (tree valist, rtx nextarg 
*** 8038,8045 ****
  
    /* Count number of gp and fp argument registers used.  */
  
!   n_gpr = current_function_args_info.gprs;
!   n_fpr = current_function_args_info.fprs;
  
    if (cfun->va_list_gpr_size)
      {
--- 8038,8045 ----
  
    /* Count number of gp and fp argument registers used.  */
  
!   n_gpr = rtl.args.info.gprs;
!   n_fpr = rtl.args.info.fprs;
  
    if (cfun->va_list_gpr_size)
      {
*************** s390_va_start (tree valist, rtx nextarg 
*** 8063,8069 ****
      {
        t = make_tree (TREE_TYPE (ovf), virtual_incoming_args_rtx);
  
!       off = INTVAL (current_function_arg_offset_rtx);
        off = off < 0 ? 0 : off;
        if (TARGET_DEBUG_ARG)
  	fprintf (stderr, "va_start: n_gpr = %d, n_fpr = %d off %d\n",
--- 8063,8069 ----
      {
        t = make_tree (TREE_TYPE (ovf), virtual_incoming_args_rtx);
  
!       off = INTVAL (rtl.args.arg_offset_rtx);
        off = off < 0 ? 0 : off;
        if (TARGET_DEBUG_ARG)
  	fprintf (stderr, "va_start: n_gpr = %d, n_fpr = %d off %d\n",
Index: config/spu/spu.c
===================================================================
*** config/spu/spu.c	(revision 133756)
--- config/spu/spu.c	(working copy)
*************** direct_return (void)
*** 1686,1693 ****
        if (cfun->static_chain_decl == 0
  	  && (spu_saved_regs_size ()
  	      + get_frame_size ()
! 	      + current_function_outgoing_args_size
! 	      + current_function_pretend_args_size == 0)
  	  && current_function_is_leaf)
  	return 1;
      }
--- 1686,1693 ----
        if (cfun->static_chain_decl == 0
  	  && (spu_saved_regs_size ()
  	      + get_frame_size ()
! 	      + rtl.outgoing_args_size
! 	      + rtl.args.pretend_args_size == 0)
  	  && current_function_is_leaf)
  	return 1;
      }
*************** direct_return (void)
*** 1705,1711 ****
   prev SP | back chain  | 
           +-------------+
           |  var args   | 
!          |  reg save   | current_function_pretend_args_size bytes
           +-------------+
           |    ...      | 
           | saved regs  | spu_saved_regs_size() bytes
--- 1705,1711 ----
   prev SP | back chain  | 
           +-------------+
           |  var args   | 
!          |  reg save   | rtl.args.pretend_args_size bytes
           +-------------+
           |    ...      | 
           | saved regs  | spu_saved_regs_size() bytes
*************** direct_return (void)
*** 1715,1721 ****
           +-------------+
           |    ...      | 
           |  outgoing   | 
!          |    args     | current_function_outgoing_args_size bytes
           +-------------+
           | $lr of next |
           |   frame     | 
--- 1715,1721 ----
           +-------------+
           |    ...      | 
           |  outgoing   | 
!          |    args     | rtl.outgoing_args_size bytes
           +-------------+
           | $lr of next |
           |   frame     | 
*************** spu_expand_prologue (void)
*** 1749,1756 ****
  
    saved_regs_size = spu_saved_regs_size ();
    total_size = size + saved_regs_size
!     + current_function_outgoing_args_size
!     + current_function_pretend_args_size;
  
    if (!current_function_is_leaf
        || current_function_calls_alloca || total_size > 0)
--- 1749,1756 ----
  
    saved_regs_size = spu_saved_regs_size ();
    total_size = size + saved_regs_size
!     + rtl.outgoing_args_size
!     + rtl.args.pretend_args_size;
  
    if (!current_function_is_leaf
        || current_function_calls_alloca || total_size > 0)
*************** spu_expand_prologue (void)
*** 1766,1772 ****
  
    if (total_size > 0)
      {
!       offset = -current_function_pretend_args_size;
        for (regno = 0; regno < FIRST_PSEUDO_REGISTER; ++regno)
  	if (need_to_save_reg (regno, 1))
  	  {
--- 1766,1772 ----
  
    if (total_size > 0)
      {
!       offset = -rtl.args.pretend_args_size;
        for (regno = 0; regno < FIRST_PSEUDO_REGISTER; ++regno)
  	if (need_to_save_reg (regno, 1))
  	  {
*************** spu_expand_prologue (void)
*** 1840,1846 ****
  	{
  	  rtx fp_reg = gen_rtx_REG (Pmode, HARD_FRAME_POINTER_REGNUM);
  	  HOST_WIDE_INT fp_offset = STACK_POINTER_OFFSET
! 	    + current_function_outgoing_args_size;
  	  /* Set the new frame_pointer */
  	  insn = frame_emit_add_imm (fp_reg, sp_reg, fp_offset, scratch_reg_0);
  	  RTX_FRAME_RELATED_P (insn) = 1;
--- 1840,1846 ----
  	{
  	  rtx fp_reg = gen_rtx_REG (Pmode, HARD_FRAME_POINTER_REGNUM);
  	  HOST_WIDE_INT fp_offset = STACK_POINTER_OFFSET
! 	    + rtl.outgoing_args_size;
  	  /* Set the new frame_pointer */
  	  insn = frame_emit_add_imm (fp_reg, sp_reg, fp_offset, scratch_reg_0);
  	  RTX_FRAME_RELATED_P (insn) = 1;
*************** spu_expand_epilogue (bool sibcall_p)
*** 1874,1881 ****
  
    saved_regs_size = spu_saved_regs_size ();
    total_size = size + saved_regs_size
!     + current_function_outgoing_args_size
!     + current_function_pretend_args_size;
  
    if (!current_function_is_leaf
        || current_function_calls_alloca || total_size > 0)
--- 1874,1881 ----
  
    saved_regs_size = spu_saved_regs_size ();
    total_size = size + saved_regs_size
!     + rtl.outgoing_args_size
!     + rtl.args.pretend_args_size;
  
    if (!current_function_is_leaf
        || current_function_calls_alloca || total_size > 0)
*************** spu_expand_epilogue (bool sibcall_p)
*** 1891,1897 ****
  
        if (saved_regs_size > 0)
  	{
! 	  offset = -current_function_pretend_args_size;
  	  for (regno = 0; regno < FIRST_PSEUDO_REGISTER; ++regno)
  	    if (need_to_save_reg (regno, 1))
  	      {
--- 1891,1897 ----
  
        if (saved_regs_size > 0)
  	{
! 	  offset = -rtl.args.pretend_args_size;
  	  for (regno = 0; regno < FIRST_PSEUDO_REGISTER; ++regno)
  	    if (need_to_save_reg (regno, 1))
  	      {
*************** spu_initial_elimination_offset (int from
*** 3045,3059 ****
  {
    int saved_regs_size = spu_saved_regs_size ();
    int sp_offset = 0;
!   if (!current_function_is_leaf || current_function_outgoing_args_size
        || get_frame_size () || saved_regs_size)
      sp_offset = STACK_POINTER_OFFSET;
    if (from == FRAME_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
!     return (sp_offset + current_function_outgoing_args_size);
    else if (from == FRAME_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM)
      return 0;
    else if (from == ARG_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
!     return sp_offset + current_function_outgoing_args_size
        + get_frame_size () + saved_regs_size + STACK_POINTER_OFFSET;
    else if (from == ARG_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM)
      return get_frame_size () + saved_regs_size + sp_offset;
--- 3045,3059 ----
  {
    int saved_regs_size = spu_saved_regs_size ();
    int sp_offset = 0;
!   if (!current_function_is_leaf || rtl.outgoing_args_size
        || get_frame_size () || saved_regs_size)
      sp_offset = STACK_POINTER_OFFSET;
    if (from == FRAME_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
!     return (sp_offset + rtl.outgoing_args_size);
    else if (from == FRAME_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM)
      return 0;
    else if (from == ARG_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
!     return sp_offset + rtl.outgoing_args_size
        + get_frame_size () + saved_regs_size + STACK_POINTER_OFFSET;
    else if (from == ARG_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM)
      return get_frame_size () + saved_regs_size + sp_offset;
*************** spu_build_builtin_va_list (void)
*** 3211,3220 ****
     The following global variables are used to initialize
     the va_list structure:
  
!      current_function_args_info;
         the CUMULATIVE_ARGS for this function
  
!      current_function_arg_offset_rtx:
         holds the offset of the first anonymous stack argument
         (relative to the virtual arg pointer).  */
  
--- 3211,3220 ----
     The following global variables are used to initialize
     the va_list structure:
  
!      rtl.args.info;
         the CUMULATIVE_ARGS for this function
  
!      rtl.args.arg_offset_rtx:
         holds the offset of the first anonymous stack argument
         (relative to the virtual arg pointer).  */
  
*************** spu_va_start (tree valist, rtx nextarg)
*** 3235,3241 ****
  
    /* Find the __args area.  */
    t = make_tree (TREE_TYPE (args), nextarg);
!   if (current_function_pretend_args_size > 0)
      t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (args), t,
  		size_int (-STACK_POINTER_OFFSET));
    t = build2 (GIMPLE_MODIFY_STMT, TREE_TYPE (args), args, t);
--- 3235,3241 ----
  
    /* Find the __args area.  */
    t = make_tree (TREE_TYPE (args), nextarg);
!   if (rtl.args.pretend_args_size > 0)
      t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (args), t,
  		size_int (-STACK_POINTER_OFFSET));
    t = build2 (GIMPLE_MODIFY_STMT, TREE_TYPE (args), args, t);
*************** spu_va_start (tree valist, rtx nextarg)
*** 3245,3251 ****
    /* Find the __skip area.  */
    t = make_tree (TREE_TYPE (skip), virtual_incoming_args_rtx);
    t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (skip), t,
! 	      size_int (current_function_pretend_args_size
  			 - STACK_POINTER_OFFSET));
    t = build2 (GIMPLE_MODIFY_STMT, TREE_TYPE (skip), skip, t);
    TREE_SIDE_EFFECTS (t) = 1;
--- 3245,3251 ----
    /* Find the __skip area.  */
    t = make_tree (TREE_TYPE (skip), virtual_incoming_args_rtx);
    t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (skip), t,
! 	      size_int (rtl.args.pretend_args_size
  			 - STACK_POINTER_OFFSET));
    t = build2 (GIMPLE_MODIFY_STMT, TREE_TYPE (skip), skip, t);
    TREE_SIDE_EFFECTS (t) = 1;
Index: config/sparc/sparc.c
===================================================================
*** config/sparc/sparc.c	(revision 133756)
--- config/sparc/sparc.c	(working copy)
*************** sparc_init_modes (void)
*** 3769,3775 ****
  HOST_WIDE_INT
  sparc_compute_frame_size (HOST_WIDE_INT size, int leaf_function_p)
  {
!   int outgoing_args_size = (current_function_outgoing_args_size
  			    + REG_PARM_STACK_SPACE (current_function_decl));
    int n_regs = 0;  /* N_REGS is the number of 4-byte regs saved thus far.  */
    int i;
--- 3769,3775 ----
  HOST_WIDE_INT
  sparc_compute_frame_size (HOST_WIDE_INT size, int leaf_function_p)
  {
!   int outgoing_args_size = (rtl.outgoing_args_size
  			    + REG_PARM_STACK_SPACE (current_function_decl));
    int n_regs = 0;  /* N_REGS is the number of 4-byte regs saved thus far.  */
    int i;
*************** sparc_compute_frame_size (HOST_WIDE_INT 
*** 3799,3805 ****
    if (leaf_function_p
        && n_regs == 0
        && size == 0
!       && current_function_outgoing_args_size == 0)
      actual_fsize = apparent_fsize = 0;
    else
      {
--- 3799,3805 ----
    if (leaf_function_p
        && n_regs == 0
        && size == 0
!       && rtl.outgoing_args_size == 0)
      actual_fsize = apparent_fsize = 0;
    else
      {
*************** function_value (const_tree type, enum ma
*** 5675,5681 ****
  static rtx
  sparc_builtin_saveregs (void)
  {
!   int first_reg = current_function_args_info.words;
    rtx address;
    int regno;
  
--- 5675,5681 ----
  static rtx
  sparc_builtin_saveregs (void)
  {
!   int first_reg = rtl.args.info.words;
    rtx address;
    int regno;
  
Index: config/m32r/m32r.c
===================================================================
*** config/m32r/m32r.c	(revision 133756)
--- config/m32r/m32r.c	(working copy)
*************** m32r_compute_frame_size (int size)	/* # 
*** 1276,1283 ****
                                    | current_function_profile);
  
    var_size	= M32R_STACK_ALIGN (size);
!   args_size	= M32R_STACK_ALIGN (current_function_outgoing_args_size);
!   pretend_size	= current_function_pretend_args_size;
    extra_size	= FIRST_PARM_OFFSET (0);
    total_size	= extra_size + pretend_size + args_size + var_size;
    reg_size	= 0;
--- 1276,1283 ----
                                    | current_function_profile);
  
    var_size	= M32R_STACK_ALIGN (size);
!   args_size	= M32R_STACK_ALIGN (rtl.outgoing_args_size);
!   pretend_size	= rtl.args.pretend_args_size;
    extra_size	= FIRST_PARM_OFFSET (0);
    total_size	= extra_size + pretend_size + args_size + var_size;
    reg_size	= 0;
Index: config/i386/i386.md
===================================================================
*** config/i386/i386.md	(revision 133756)
--- config/i386/i386.md	(working copy)
***************
*** 14755,14763 ****
    [(return)]
    "ix86_can_use_return_insn_p ()"
  {
!   if (current_function_pops_args)
      {
!       rtx popc = GEN_INT (current_function_pops_args);
        emit_jump_insn (gen_return_pop_internal (popc));
        DONE;
      }
--- 14755,14763 ----
    [(return)]
    "ix86_can_use_return_insn_p ()"
  {
!   if (rtl.args.pops_args)
      {
!       rtx popc = GEN_INT (rtl.args.pops_args);
        emit_jump_insn (gen_return_pop_internal (popc));
        DONE;
      }
Index: config/i386/i386.c
===================================================================
*** config/i386/i386.c	(revision 133756)
--- config/i386/i386.c	(working copy)
*************** ix86_va_start (tree valist, rtx nextarg)
*** 5146,5154 ****
    sav = build3 (COMPONENT_REF, TREE_TYPE (f_sav), valist, f_sav, NULL_TREE);
  
    /* Count number of gp and fp argument registers used.  */
!   words = current_function_args_info.words;
!   n_gpr = current_function_args_info.regno;
!   n_fpr = current_function_args_info.sse_regno;
  
    if (cfun->va_list_gpr_size)
      {
--- 5146,5154 ----
    sav = build3 (COMPONENT_REF, TREE_TYPE (f_sav), valist, f_sav, NULL_TREE);
  
    /* Count number of gp and fp argument registers used.  */
!   words = rtl.args.info.words;
!   n_gpr = rtl.args.info.regno;
!   n_fpr = rtl.args.info.sse_regno;
  
    if (cfun->va_list_gpr_size)
      {
*************** ix86_can_use_return_insn_p (void)
*** 5692,5699 ****
  
    /* Don't allow more than 32 pop, since that's all we can do
       with one instruction.  */
!   if (current_function_pops_args
!       && current_function_args_size >= 32768)
      return 0;
  
    ix86_compute_frame_layout (&frame);
--- 5692,5699 ----
  
    /* Don't allow more than 32 pop, since that's all we can do
       with one instruction.  */
!   if (rtl.args.pops_args
!       && rtl.args.size >= 32768)
      return 0;
  
    ix86_compute_frame_layout (&frame);
*************** ix86_compute_frame_layout (struct ix86_f
*** 6115,6128 ****
    /* Add outgoing arguments area.  Can be skipped if we eliminated
       all the function calls as dead code.
       Skipping is however impossible when function calls alloca.  Alloca
!      expander assumes that last current_function_outgoing_args_size
       of stack frame are unused.  */
    if (ACCUMULATE_OUTGOING_ARGS
        && (!current_function_is_leaf || current_function_calls_alloca
  	  || ix86_current_function_calls_tls_descriptor))
      {
!       offset += current_function_outgoing_args_size;
!       frame->outgoing_arguments_size = current_function_outgoing_args_size;
      }
    else
      frame->outgoing_arguments_size = 0;
--- 6115,6128 ----
    /* Add outgoing arguments area.  Can be skipped if we eliminated
       all the function calls as dead code.
       Skipping is however impossible when function calls alloca.  Alloca
!      expander assumes that last rtl.outgoing_args_size
       of stack frame are unused.  */
    if (ACCUMULATE_OUTGOING_ARGS
        && (!current_function_is_leaf || current_function_calls_alloca
  	  || ix86_current_function_calls_tls_descriptor))
      {
!       offset += rtl.outgoing_args_size;
!       frame->outgoing_arguments_size = rtl.outgoing_args_size;
      }
    else
      frame->outgoing_arguments_size = 0;
*************** ix86_expand_epilogue (int style)
*** 6683,6697 ****
    if (style == 0)
      return;
  
!   if (current_function_pops_args && current_function_args_size)
      {
!       rtx popc = GEN_INT (current_function_pops_args);
  
        /* i386 can only pop 64K bytes.  If asked to pop more, pop
  	 return address, do explicit add, and jump indirectly to the
  	 caller.  */
  
!       if (current_function_pops_args >= 65536)
  	{
  	  rtx ecx = gen_rtx_REG (SImode, CX_REG);
  
--- 6683,6697 ----
    if (style == 0)
      return;
  
!   if (rtl.args.pops_args && rtl.args.size)
      {
!       rtx popc = GEN_INT (rtl.args.pops_args);
  
        /* i386 can only pop 64K bytes.  If asked to pop more, pop
  	 return address, do explicit add, and jump indirectly to the
  	 caller.  */
  
!       if (rtl.args.pops_args >= 65536)
  	{
  	  rtx ecx = gen_rtx_REG (SImode, CX_REG);
  
Index: config/sh/sh.c
===================================================================
*** config/sh/sh.c	(revision 133756)
--- config/sh/sh.c	(working copy)
*************** output_stack_adjust (int size, rtx reg, 
*** 5613,5622 ****
  	      if (epilogue_p > 0)
  		{
  		  int nreg = 0;
! 		  if (current_function_return_rtx)
  		    {
  		      enum machine_mode mode;
! 		      mode = GET_MODE (current_function_return_rtx);
  		      if (BASE_RETURN_VALUE_REG (mode) == FIRST_RET_REG)
  			nreg = HARD_REGNO_NREGS (FIRST_RET_REG, mode);
  		    }
--- 5613,5622 ----
  	      if (epilogue_p > 0)
  		{
  		  int nreg = 0;
! 		  if (rtl.return_rtx)
  		    {
  		      enum machine_mode mode;
! 		      mode = GET_MODE (rtl.return_rtx);
  		      if (BASE_RETURN_VALUE_REG (mode) == FIRST_RET_REG)
  			nreg = HARD_REGNO_NREGS (FIRST_RET_REG, mode);
  		    }
*************** calc_live_regs (HARD_REG_SET *live_regs_
*** 5954,5960 ****
    /* Force PR to be live if the prologue has to call the SHmedia
       argument decoder or register saver.  */
    if (TARGET_SHCOMPACT
!       && ((current_function_args_info.call_cookie
  	   & ~ CALL_COOKIE_RET_TRAMP (1))
  	  || current_function_saves_all_registers))
      pr_live = 1;
--- 5954,5960 ----
    /* Force PR to be live if the prologue has to call the SHmedia
       argument decoder or register saver.  */
    if (TARGET_SHCOMPACT
!       && ((rtl.args.info.call_cookie
  	   & ~ CALL_COOKIE_RET_TRAMP (1))
  	  || current_function_saves_all_registers))
      pr_live = 1;
*************** calc_live_regs (HARD_REG_SET *live_regs_
*** 5981,5987 ****
  	  : (/* Only push those regs which are used and need to be saved.  */
  	     (TARGET_SHCOMPACT
  	      && flag_pic
! 	      && current_function_args_info.call_cookie
  	      && reg == PIC_OFFSET_TABLE_REGNUM)
  	     || (df_regs_ever_live_p (reg)
  		 && (!call_really_used_regs[reg]
--- 5981,5987 ----
  	  : (/* Only push those regs which are used and need to be saved.  */
  	     (TARGET_SHCOMPACT
  	      && flag_pic
! 	      && rtl.args.info.call_cookie
  	      && reg == PIC_OFFSET_TABLE_REGNUM)
  	     || (df_regs_ever_live_p (reg)
  		 && (!call_really_used_regs[reg]
*************** sh_expand_prologue (void)
*** 6229,6244 ****
  
    /* We have pretend args if we had an object sent partially in registers
       and partially on the stack, e.g. a large structure.  */
!   pretend_args = current_function_pretend_args_size;
    if (TARGET_VARARGS_PRETEND_ARGS (current_function_decl)
        && (NPARM_REGS(SImode)
! 	  > current_function_args_info.arg_count[(int) SH_ARG_INT]))
      pretend_args = 0;
    output_stack_adjust (-pretend_args
! 		       - current_function_args_info.stack_regs * 8,
  		       stack_pointer_rtx, 0, NULL);
  
!   if (TARGET_SHCOMPACT && flag_pic && current_function_args_info.call_cookie)
      /* We're going to use the PIC register to load the address of the
         incoming-argument decoder and/or of the return trampoline from
         the GOT, so make sure the PIC register is preserved and
--- 6229,6244 ----
  
    /* We have pretend args if we had an object sent partially in registers
       and partially on the stack, e.g. a large structure.  */
!   pretend_args = rtl.args.pretend_args_size;
    if (TARGET_VARARGS_PRETEND_ARGS (current_function_decl)
        && (NPARM_REGS(SImode)
! 	  > rtl.args.info.arg_count[(int) SH_ARG_INT]))
      pretend_args = 0;
    output_stack_adjust (-pretend_args
! 		       - rtl.args.info.stack_regs * 8,
  		       stack_pointer_rtx, 0, NULL);
  
!   if (TARGET_SHCOMPACT && flag_pic && rtl.args.info.call_cookie)
      /* We're going to use the PIC register to load the address of the
         incoming-argument decoder and/or of the return trampoline from
         the GOT, so make sure the PIC register is preserved and
*************** sh_expand_prologue (void)
*** 6246,6252 ****
      df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM, true);
  
    if (TARGET_SHCOMPACT
!       && (current_function_args_info.call_cookie & ~ CALL_COOKIE_RET_TRAMP(1)))
      {
        int reg;
  
--- 6246,6252 ----
      df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM, true);
  
    if (TARGET_SHCOMPACT
!       && (rtl.args.info.call_cookie & ~ CALL_COOKIE_RET_TRAMP(1)))
      {
        int reg;
  
*************** sh_expand_prologue (void)
*** 6254,6273 ****
  	 be pushed onto the stack live, so that register renaming
  	 doesn't overwrite them.  */
        for (reg = 0; reg < NPARM_REGS (SImode); reg++)
! 	if (CALL_COOKIE_STACKSEQ_GET (current_function_args_info.call_cookie)
  	    >= NPARM_REGS (SImode) - reg)
  	  for (; reg < NPARM_REGS (SImode); reg++)
  	    emit_insn (gen_shcompact_preserve_incoming_args
  		       (gen_rtx_REG (SImode, FIRST_PARM_REG + reg)));
  	else if (CALL_COOKIE_INT_REG_GET
! 		 (current_function_args_info.call_cookie, reg) == 1)
  	  emit_insn (gen_shcompact_preserve_incoming_args
  		     (gen_rtx_REG (SImode, FIRST_PARM_REG + reg)));
  
        emit_move_insn (gen_rtx_REG (Pmode, MACL_REG),
  		      stack_pointer_rtx);
        emit_move_insn (gen_rtx_REG (SImode, R0_REG),
! 		      GEN_INT (current_function_args_info.call_cookie));
        emit_move_insn (gen_rtx_REG (SImode, MACH_REG),
  		      gen_rtx_REG (SImode, R0_REG));
      }
--- 6254,6273 ----
  	 be pushed onto the stack live, so that register renaming
  	 doesn't overwrite them.  */
        for (reg = 0; reg < NPARM_REGS (SImode); reg++)
! 	if (CALL_COOKIE_STACKSEQ_GET (rtl.args.info.call_cookie)
  	    >= NPARM_REGS (SImode) - reg)
  	  for (; reg < NPARM_REGS (SImode); reg++)
  	    emit_insn (gen_shcompact_preserve_incoming_args
  		       (gen_rtx_REG (SImode, FIRST_PARM_REG + reg)));
  	else if (CALL_COOKIE_INT_REG_GET
! 		 (rtl.args.info.call_cookie, reg) == 1)
  	  emit_insn (gen_shcompact_preserve_incoming_args
  		     (gen_rtx_REG (SImode, FIRST_PARM_REG + reg)));
  
        emit_move_insn (gen_rtx_REG (Pmode, MACL_REG),
  		      stack_pointer_rtx);
        emit_move_insn (gen_rtx_REG (SImode, R0_REG),
! 		      GEN_INT (rtl.args.info.call_cookie));
        emit_move_insn (gen_rtx_REG (SImode, MACH_REG),
  		      gen_rtx_REG (SImode, R0_REG));
      }
*************** sh_expand_prologue (void)
*** 6292,6298 ****
  	      rtx insn;
  
  	      if (i >= (NPARM_REGS(SImode)
! 			- current_function_args_info.arg_count[(int) SH_ARG_INT]
  			))
  		break;
  	      insn = push (rn);
--- 6292,6298 ----
  	      rtx insn;
  
  	      if (i >= (NPARM_REGS(SImode)
! 			- rtl.args.info.arg_count[(int) SH_ARG_INT]
  			))
  		break;
  	      insn = push (rn);
*************** sh_expand_prologue (void)
*** 6552,6558 ****
      frame_insn (GEN_MOV (hard_frame_pointer_rtx, stack_pointer_rtx));
  
    if (TARGET_SHCOMPACT
!       && (current_function_args_info.call_cookie & ~ CALL_COOKIE_RET_TRAMP(1)))
      {
        /* This must NOT go through the PLT, otherwise mach and macl
  	 may be clobbered.  */
--- 6552,6558 ----
      frame_insn (GEN_MOV (hard_frame_pointer_rtx, stack_pointer_rtx));
  
    if (TARGET_SHCOMPACT
!       && (rtl.args.info.call_cookie & ~ CALL_COOKIE_RET_TRAMP(1)))
      {
        /* This must NOT go through the PLT, otherwise mach and macl
  	 may be clobbered.  */
*************** sh_expand_epilogue (bool sibcall_p)
*** 6821,6829 ****
      emit_insn (gen_toggle_sz ());
    target_flags = save_flags;
  
!   output_stack_adjust (current_function_pretend_args_size
  		       + save_size + d_rounding
! 		       + current_function_args_info.stack_regs * 8,
  		       stack_pointer_rtx, e, NULL);
  
    if (current_function_calls_eh_return)
--- 6821,6829 ----
      emit_insn (gen_toggle_sz ());
    target_flags = save_flags;
  
!   output_stack_adjust (rtl.args.pretend_args_size
  		       + save_size + d_rounding
! 		       + rtl.args.info.stack_regs * 8,
  		       stack_pointer_rtx, e, NULL);
  
    if (current_function_calls_eh_return)
*************** static rtx
*** 6940,6950 ****
  sh_builtin_saveregs (void)
  {
    /* First unnamed integer register.  */
!   int first_intreg = current_function_args_info.arg_count[(int) SH_ARG_INT];
    /* Number of integer registers we need to save.  */
    int n_intregs = MAX (0, NPARM_REGS (SImode) - first_intreg);
    /* First unnamed SFmode float reg */
!   int first_floatreg = current_function_args_info.arg_count[(int) SH_ARG_FLOAT];
    /* Number of SFmode float regs to save.  */
    int n_floatregs = MAX (0, NPARM_REGS (SFmode) - first_floatreg);
    rtx regbuf, fpregs;
--- 6940,6950 ----
  sh_builtin_saveregs (void)
  {
    /* First unnamed integer register.  */
!   int first_intreg = rtl.args.info.arg_count[(int) SH_ARG_INT];
    /* Number of integer registers we need to save.  */
    int n_intregs = MAX (0, NPARM_REGS (SImode) - first_intreg);
    /* First unnamed SFmode float reg */
!   int first_floatreg = rtl.args.info.arg_count[(int) SH_ARG_FLOAT];
    /* Number of SFmode float regs to save.  */
    int n_floatregs = MAX (0, NPARM_REGS (SFmode) - first_floatreg);
    rtx regbuf, fpregs;
*************** sh_builtin_saveregs (void)
*** 6959,6983 ****
  
  	  while (pushregs < NPARM_REGS (SImode) - 1
  		 && (CALL_COOKIE_INT_REG_GET
! 			(current_function_args_info.call_cookie,
  			 NPARM_REGS (SImode) - pushregs)
  		     == 1))
  	    {
! 	      current_function_args_info.call_cookie
  		&= ~ CALL_COOKIE_INT_REG (NPARM_REGS (SImode)
  					  - pushregs, 1);
  	      pushregs++;
  	    }
  
  	  if (pushregs == NPARM_REGS (SImode))
! 	    current_function_args_info.call_cookie
  	      |= (CALL_COOKIE_INT_REG (0, 1)
  		  | CALL_COOKIE_STACKSEQ (pushregs - 1));
  	  else
! 	    current_function_args_info.call_cookie
  	      |= CALL_COOKIE_STACKSEQ (pushregs);
  
! 	  current_function_pretend_args_size += 8 * n_intregs;
  	}
        if (TARGET_SHCOMPACT)
  	return const0_rtx;
--- 6959,6983 ----
  
  	  while (pushregs < NPARM_REGS (SImode) - 1
  		 && (CALL_COOKIE_INT_REG_GET
! 			(rtl.args.info.call_cookie,
  			 NPARM_REGS (SImode) - pushregs)
  		     == 1))
  	    {
! 	      rtl.args.info.call_cookie
  		&= ~ CALL_COOKIE_INT_REG (NPARM_REGS (SImode)
  					  - pushregs, 1);
  	      pushregs++;
  	    }
  
  	  if (pushregs == NPARM_REGS (SImode))
! 	    rtl.args.info.call_cookie
  	      |= (CALL_COOKIE_INT_REG (0, 1)
  		  | CALL_COOKIE_STACKSEQ (pushregs - 1));
  	  else
! 	    rtl.args.info.call_cookie
  	      |= CALL_COOKIE_STACKSEQ (pushregs);
  
! 	  rtl.args.pretend_args_size += 8 * n_intregs;
  	}
        if (TARGET_SHCOMPACT)
  	return const0_rtx;
*************** sh_va_start (tree valist, rtx nextarg)
*** 7175,7181 ****
    TREE_SIDE_EFFECTS (t) = 1;
    expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
  
!   nfp = current_function_args_info.arg_count[SH_ARG_FLOAT];
    if (nfp < 8)
      nfp = 8 - nfp;
    else
--- 7175,7181 ----
    TREE_SIDE_EFFECTS (t) = 1;
    expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
  
!   nfp = rtl.args.info.arg_count[SH_ARG_FLOAT];
    if (nfp < 8)
      nfp = 8 - nfp;
    else
*************** sh_va_start (tree valist, rtx nextarg)
*** 7190,7196 ****
    TREE_SIDE_EFFECTS (t) = 1;
    expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
  
!   nint = current_function_args_info.arg_count[SH_ARG_INT];
    if (nint < 4)
      nint = 4 - nint;
    else
--- 7190,7196 ----
    TREE_SIDE_EFFECTS (t) = 1;
    expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
  
!   nint = rtl.args.info.arg_count[SH_ARG_INT];
    if (nint < 4)
      nint = 4 - nint;
    else
*************** initial_elimination_offset (int from, in
*** 7904,7914 ****
  
    if (from == ARG_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM)
      return total_saved_regs_space + total_auto_space
!       + current_function_args_info.byref_regs * 8;
  
    if (from == ARG_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
      return total_saved_regs_space + total_auto_space
!       + current_function_args_info.byref_regs * 8;
  
    /* Initial gap between fp and sp is 0.  */
    if (from == HARD_FRAME_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
--- 7904,7914 ----
  
    if (from == ARG_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM)
      return total_saved_regs_space + total_auto_space
!       + rtl.args.info.byref_regs * 8;
  
    if (from == ARG_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
      return total_saved_regs_space + total_auto_space
!       + rtl.args.info.byref_regs * 8;
  
    /* Initial gap between fp and sp is 0.  */
    if (from == HARD_FRAME_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
*************** sh_allocate_initial_value (rtx hard_reg)
*** 9190,9196 ****
        if (current_function_is_leaf
  	  && ! sh_pr_n_sets ()
  	  && ! (TARGET_SHCOMPACT
! 		&& ((current_function_args_info.call_cookie
  		     & ~ CALL_COOKIE_RET_TRAMP (1))
  		    || current_function_saves_all_registers)))
  	x = hard_reg;
--- 9190,9196 ----
        if (current_function_is_leaf
  	  && ! sh_pr_n_sets ()
  	  && ! (TARGET_SHCOMPACT
! 		&& ((rtl.args.info.call_cookie
  		     & ~ CALL_COOKIE_RET_TRAMP (1))
  		    || current_function_saves_all_registers)))
  	x = hard_reg;
*************** sh_function_ok_for_sibcall (tree decl, t
*** 9789,9795 ****
  {
    return (1
  	  && (! TARGET_SHCOMPACT
! 	      || current_function_args_info.stack_regs == 0)
  	  && ! sh_cfun_interrupt_handler_p ()
  	  && (! flag_pic
  	      || (decl && ! TREE_PUBLIC (decl))
--- 9789,9795 ----
  {
    return (1
  	  && (! TARGET_SHCOMPACT
! 	      || rtl.args.info.stack_regs == 0)
  	  && ! sh_cfun_interrupt_handler_p ()
  	  && (! flag_pic
  	      || (decl && ! TREE_PUBLIC (decl))
*************** sh_get_pr_initial_val (void)
*** 10585,10591 ****
       PR register on SHcompact, because it might be clobbered by the prologue.
       We check first if that is known to be the case.  */
    if (TARGET_SHCOMPACT
!       && ((current_function_args_info.call_cookie
  	   & ~ CALL_COOKIE_RET_TRAMP (1))
  	  || current_function_saves_all_registers))
      return gen_frame_mem (SImode, return_address_pointer_rtx);
--- 10585,10591 ----
       PR register on SHcompact, because it might be clobbered by the prologue.
       We check first if that is known to be the case.  */
    if (TARGET_SHCOMPACT
!       && ((rtl.args.info.call_cookie
  	   & ~ CALL_COOKIE_RET_TRAMP (1))
  	  || current_function_saves_all_registers))
      return gen_frame_mem (SImode, return_address_pointer_rtx);
Index: config/sh/sh.md
===================================================================
*** config/sh/sh.md	(revision 133756)
--- config/sh/sh.md	(working copy)
*************** mov.l\\t1f,r0\\n\\
*** 9360,9366 ****
      }
  
    if (TARGET_SHCOMPACT
!       && (current_function_args_info.call_cookie & CALL_COOKIE_RET_TRAMP (1)))
      {
        emit_jump_insn (gen_shcompact_return_tramp ());
        DONE;
--- 9360,9366 ----
      }
  
    if (TARGET_SHCOMPACT
!       && (rtl.args.info.call_cookie & CALL_COOKIE_RET_TRAMP (1)))
      {
        emit_jump_insn (gen_shcompact_return_tramp ());
        DONE;
*************** mov.l\\t1f,r0\\n\\
*** 9370,9376 ****
  (define_insn "*return_i"
    [(return)]
    "TARGET_SH1 && ! (TARGET_SHCOMPACT
! 		    && (current_function_args_info.call_cookie
  			& CALL_COOKIE_RET_TRAMP (1)))
     && reload_completed
     && lookup_attribute (\"trap_exit\",
--- 9370,9376 ----
  (define_insn "*return_i"
    [(return)]
    "TARGET_SH1 && ! (TARGET_SHCOMPACT
! 		    && (rtl.args.info.call_cookie
  			& CALL_COOKIE_RET_TRAMP (1)))
     && reload_completed
     && lookup_attribute (\"trap_exit\",
*************** mov.l\\t1f,r0\\n\\
*** 9397,9403 ****
  (define_expand "shcompact_return_tramp"
    [(return)]
    "TARGET_SHCOMPACT
!    && (current_function_args_info.call_cookie & CALL_COOKIE_RET_TRAMP (1))"
    "
  {
    rtx reg = gen_rtx_REG (Pmode, R0_REG);
--- 9397,9403 ----
  (define_expand "shcompact_return_tramp"
    [(return)]
    "TARGET_SHCOMPACT
!    && (rtl.args.info.call_cookie & CALL_COOKIE_RET_TRAMP (1))"
    "
  {
    rtx reg = gen_rtx_REG (Pmode, R0_REG);
*************** mov.l\\t1f,r0\\n\\
*** 9410,9416 ****
  (define_insn "shcompact_return_tramp_i"
    [(parallel [(return) (use (reg:SI R0_REG))])]
    "TARGET_SHCOMPACT
!    && (current_function_args_info.call_cookie & CALL_COOKIE_RET_TRAMP (1))"
    "jmp	@r0%#"
    [(set_attr "type" "jump_ind")
     (set_attr "needs_delay_slot" "yes")])
--- 9410,9416 ----
  (define_insn "shcompact_return_tramp_i"
    [(parallel [(return) (use (reg:SI R0_REG))])]
    "TARGET_SHCOMPACT
!    && (rtl.args.info.call_cookie & CALL_COOKIE_RET_TRAMP (1))"
    "jmp	@r0%#"
    [(set_attr "type" "jump_ind")
     (set_attr "needs_delay_slot" "yes")])
Index: config/avr/avr.c
===================================================================
*** config/avr/avr.c	(revision 133756)
--- config/avr/avr.c	(working copy)
*************** int
*** 2739,2745 ****
  frame_pointer_required_p (void)
  {
    return (current_function_calls_alloca
! 	  || current_function_args_info.nregs == 0
    	  || get_frame_size () > 0);
  }
  
--- 2739,2745 ----
  frame_pointer_required_p (void)
  {
    return (current_function_calls_alloca
! 	  || rtl.args.info.nregs == 0
    	  || get_frame_size () > 0);
  }
  
Index: config/crx/crx.c
===================================================================
*** config/crx/crx.c	(revision 133756)
--- config/crx/crx.c	(working copy)
*************** crx_compute_frame (void)
*** 318,324 ****
    local_vars_size += padding_locals;
  
    size_for_adjusting_sp = local_vars_size + (ACCUMULATE_OUTGOING_ARGS ?
! 				     current_function_outgoing_args_size : 0);
  }
  
  /* Implements the macro INITIAL_ELIMINATION_OFFSET, return the OFFSET. */
--- 318,324 ----
    local_vars_size += padding_locals;
  
    size_for_adjusting_sp = local_vars_size + (ACCUMULATE_OUTGOING_ARGS ?
! 				     rtl.outgoing_args_size : 0);
  }
  
  /* Implements the macro INITIAL_ELIMINATION_OFFSET, return the OFFSET. */
*************** crx_initial_elimination_offset (int from
*** 334,346 ****
  
    if ((from) == FRAME_POINTER_REGNUM && (to) == STACK_POINTER_REGNUM)
      return (ACCUMULATE_OUTGOING_ARGS ?
! 	    current_function_outgoing_args_size : 0);
    else if ((from) == ARG_POINTER_REGNUM && (to) == FRAME_POINTER_REGNUM)
      return (sum_regs + local_vars_size);
    else if ((from) == ARG_POINTER_REGNUM && (to) == STACK_POINTER_REGNUM)
      return (sum_regs + local_vars_size +
  	    (ACCUMULATE_OUTGOING_ARGS ?
! 	     current_function_outgoing_args_size : 0));
    else
      abort ();
  }
--- 334,346 ----
  
    if ((from) == FRAME_POINTER_REGNUM && (to) == STACK_POINTER_REGNUM)
      return (ACCUMULATE_OUTGOING_ARGS ?
! 	    rtl.outgoing_args_size : 0);
    else if ((from) == ARG_POINTER_REGNUM && (to) == FRAME_POINTER_REGNUM)
      return (sum_regs + local_vars_size);
    else if ((from) == ARG_POINTER_REGNUM && (to) == STACK_POINTER_REGNUM)
      return (sum_regs + local_vars_size +
  	    (ACCUMULATE_OUTGOING_ARGS ?
! 	     rtl.outgoing_args_size : 0));
    else
      abort ();
  }
Index: config/xtensa/xtensa.c
===================================================================
*** config/xtensa/xtensa.c	(revision 133756)
--- config/xtensa/xtensa.c	(working copy)
*************** compute_frame_size (int size)
*** 2292,2298 ****
  
    xtensa_current_frame_size =
      XTENSA_STACK_ALIGN (size
! 			+ current_function_outgoing_args_size
  			+ (WINDOW_SIZE * UNITS_PER_WORD));
    return xtensa_current_frame_size;
  }
--- 2292,2298 ----
  
    xtensa_current_frame_size =
      XTENSA_STACK_ALIGN (size
! 			+ rtl.outgoing_args_size
  			+ (WINDOW_SIZE * UNITS_PER_WORD));
    return xtensa_current_frame_size;
  }
*************** static rtx
*** 2485,2491 ****
  xtensa_builtin_saveregs (void)
  {
    rtx gp_regs;
!   int arg_words = current_function_args_info.arg_words;
    int gp_left = MAX_ARGS_IN_REGISTERS - arg_words;
  
    if (gp_left <= 0)
--- 2485,2491 ----
  xtensa_builtin_saveregs (void)
  {
    rtx gp_regs;
!   int arg_words = rtl.args.info.arg_words;
    int gp_left = MAX_ARGS_IN_REGISTERS - arg_words;
  
    if (gp_left <= 0)
*************** xtensa_va_start (tree valist, rtx nextar
*** 2522,2528 ****
    tree t, u;
    int arg_words;
  
!   arg_words = current_function_args_info.arg_words;
  
    f_stk = TYPE_FIELDS (va_list_type_node);
    f_reg = TREE_CHAIN (f_stk);
--- 2522,2528 ----
    tree t, u;
    int arg_words;
  
!   arg_words = rtl.args.info.arg_words;
  
    f_stk = TYPE_FIELDS (va_list_type_node);
    f_reg = TREE_CHAIN (f_stk);
*************** order_regs_for_local_alloc (void)
*** 2867,2873 ****
  
        /* Use the AR registers in increasing order (skipping a0 and a1)
  	 but save the incoming argument registers for a last resort.  */
!       num_arg_regs = current_function_args_info.arg_words;
        if (num_arg_regs > MAX_ARGS_IN_REGISTERS)
  	num_arg_regs = MAX_ARGS_IN_REGISTERS;
        for (i = GP_ARG_FIRST; i < 16 - num_arg_regs; i++)
--- 2867,2873 ----
  
        /* Use the AR registers in increasing order (skipping a0 and a1)
  	 but save the incoming argument registers for a last resort.  */
!       num_arg_regs = rtl.args.info.arg_words;
        if (num_arg_regs > MAX_ARGS_IN_REGISTERS)
  	num_arg_regs = MAX_ARGS_IN_REGISTERS;
        for (i = GP_ARG_FIRST; i < 16 - num_arg_regs; i++)
Index: config/stormy16/stormy16.c
===================================================================
*** config/stormy16/stormy16.c	(revision 133756)
--- config/stormy16/stormy16.c	(working copy)
*************** xstormy16_compute_stack_layout (void)
*** 1005,1017 ****
  		       + layout.register_save_size 
  		       + layout.stdarg_save_size);
    
!   if (current_function_args_size <= 2048 && current_function_args_size != -1)
      {
        if (layout.frame_size + INCOMING_FRAME_SP_OFFSET 
! 	  + current_function_args_size <= 2048)
  	layout.fp_minus_ap = layout.frame_size + INCOMING_FRAME_SP_OFFSET;
        else
! 	layout.fp_minus_ap = 2048 - current_function_args_size;
      }
    else
      layout.fp_minus_ap = (layout.stdarg_save_size 
--- 1005,1017 ----
  		       + layout.register_save_size 
  		       + layout.stdarg_save_size);
    
!   if (rtl.args.size <= 2048 && rtl.args.size != -1)
      {
        if (layout.frame_size + INCOMING_FRAME_SP_OFFSET 
! 	  + rtl.args.size <= 2048)
  	layout.fp_minus_ap = layout.frame_size + INCOMING_FRAME_SP_OFFSET;
        else
! 	layout.fp_minus_ap = 2048 - rtl.args.size;
      }
    else
      layout.fp_minus_ap = (layout.stdarg_save_size 
*************** xstormy16_expand_builtin_va_start (tree 
*** 1356,1362 ****
  
    t = build2 (GIMPLE_MODIFY_STMT, TREE_TYPE (count), count, 
  	      build_int_cst (NULL_TREE,
! 			     current_function_args_info * UNITS_PER_WORD));
    TREE_SIDE_EFFECTS (t) = 1;
    expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
  }
--- 1356,1362 ----
  
    t = build2 (GIMPLE_MODIFY_STMT, TREE_TYPE (count), count, 
  	      build_int_cst (NULL_TREE,
! 			     rtl.args.info * UNITS_PER_WORD));
    TREE_SIDE_EFFECTS (t) = 1;
    expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
  }
Index: config/fr30/fr30.c
===================================================================
*** config/fr30/fr30.c	(revision 133756)
--- config/fr30/fr30.c	(working copy)
*************** fr30_compute_frame_size (int from_reg, i
*** 181,188 ****
    unsigned int 	gmask;
  
    var_size	= WORD_ALIGN (get_frame_size ());
!   args_size	= WORD_ALIGN (current_function_outgoing_args_size);
!   pretend_size	= current_function_pretend_args_size;
  
    reg_size	= 0;
    gmask		= 0;
--- 181,188 ----
    unsigned int 	gmask;
  
    var_size	= WORD_ALIGN (get_frame_size ());
!   args_size	= WORD_ALIGN (rtl.outgoing_args_size);
!   pretend_size	= rtl.args.pretend_args_size;
  
    reg_size	= 0;
    gmask		= 0;
Index: config/m68hc11/m68hc11.md
===================================================================
*** config/m68hc11/m68hc11.md	(revision 133756)
--- config/m68hc11/m68hc11.md	(working copy)
***************
*** 6722,6729 ****
  {
    int ret_size = 0;
  
!   if (current_function_return_rtx)
!     ret_size = GET_MODE_SIZE (GET_MODE (current_function_return_rtx));
  
    /* Emit use notes only when HAVE_return is true.  */
    if (m68hc11_total_frame_size () != 0)
--- 6722,6729 ----
  {
    int ret_size = 0;
  
!   if (rtl.return_rtx)
!     ret_size = GET_MODE_SIZE (GET_MODE (rtl.return_rtx));
  
    /* Emit use notes only when HAVE_return is true.  */
    if (m68hc11_total_frame_size () != 0)
***************
*** 6768,6775 ****
      {
        int ret_size = 0;
  
!       if (current_function_return_rtx)
!         ret_size = GET_MODE_SIZE (GET_MODE (current_function_return_rtx));
  
        if (ret_size == 0)
          return \"jmp\\t__return_void\";
--- 6768,6775 ----
      {
        int ret_size = 0;
  
!       if (rtl.return_rtx)
!         ret_size = GET_MODE_SIZE (GET_MODE (rtl.return_rtx));
  
        if (ret_size == 0)
          return \"jmp\\t__return_void\";
Index: config/m68hc11/m68hc11.c
===================================================================
*** config/m68hc11/m68hc11.c	(revision 133756)
--- config/m68hc11/m68hc11.c	(working copy)
*************** expand_prologue (void)
*** 1597,1603 ****
       If the first argument is a 32-bit quantity, the D+X registers
       are used.  Use Y to compute the frame.  Otherwise, X is cheaper.
       For 68HC12, this scratch register is not used.  */
!   if (current_function_args_info.nregs == 2)
      scratch = iy_reg;
    else
      scratch = ix_reg;
--- 1597,1603 ----
       If the first argument is a 32-bit quantity, the D+X registers
       are used.  Use Y to compute the frame.  Otherwise, X is cheaper.
       For 68HC12, this scratch register is not used.  */
!   if (rtl.args.info.nregs == 2)
      scratch = iy_reg;
    else
      scratch = ix_reg;
*************** expand_epilogue (void)
*** 1685,1696 ****
    /* If we are returning a value in two registers, we have to preserve the
       X register and use the Y register to restore the stack and the saved
       registers.  Otherwise, use X because it's faster (and smaller).  */
!   if (current_function_return_rtx == 0)
      return_size = 0;
!   else if (GET_CODE (current_function_return_rtx) == MEM)
      return_size = HARD_REG_SIZE;
    else
!     return_size = GET_MODE_SIZE (GET_MODE (current_function_return_rtx));
  
    if (return_size > HARD_REG_SIZE && return_size <= 2 * HARD_REG_SIZE)
      scratch = iy_reg;
--- 1685,1696 ----
    /* If we are returning a value in two registers, we have to preserve the
       X register and use the Y register to restore the stack and the saved
       registers.  Otherwise, use X because it's faster (and smaller).  */
!   if (rtl.return_rtx == 0)
      return_size = 0;
!   else if (GET_CODE (rtl.return_rtx) == MEM)
      return_size = HARD_REG_SIZE;
    else
!     return_size = GET_MODE_SIZE (GET_MODE (rtl.return_rtx));
  
    if (return_size > HARD_REG_SIZE && return_size <= 2 * HARD_REG_SIZE)
      scratch = iy_reg;
Index: config/cris/cris.c
===================================================================
*** config/cris/cris.c	(revision 133756)
--- config/cris/cris.c	(working copy)
*************** cris_initial_frame_pointer_offset (void)
*** 1206,1212 ****
    offs += get_frame_size ();
  
    /* And more; the accumulated args size.  */
!   offs += current_function_outgoing_args_size;
  
    /* Then round it off, in case we use aligned stack.  */
    if (TARGET_STACK_ALIGN)
--- 1206,1212 ----
    offs += get_frame_size ();
  
    /* And more; the accumulated args size.  */
!   offs += rtl.outgoing_args_size;
  
    /* Then round it off, in case we use aligned stack.  */
    if (TARGET_STACK_ALIGN)
*************** cris_simple_epilogue (void)
*** 1700,1708 ****
    if (! reload_completed
        || frame_pointer_needed
        || get_frame_size () != 0
!       || current_function_pretend_args_size
!       || current_function_args_size
!       || current_function_outgoing_args_size
        || current_function_calls_eh_return
  
        /* If we're not supposed to emit prologue and epilogue, we must
--- 1700,1708 ----
    if (! reload_completed
        || frame_pointer_needed
        || get_frame_size () != 0
!       || rtl.args.pretend_args_size
!       || rtl.args.size
!       || rtl.outgoing_args_size
        || current_function_calls_eh_return
  
        /* If we're not supposed to emit prologue and epilogue, we must
*************** cris_expand_prologue (void)
*** 2731,2744 ****
    int regno;
    int size = get_frame_size ();
    /* Shorten the used name for readability.  */
!   int cfoa_size = current_function_outgoing_args_size;
    int last_movem_reg = -1;
    int framesize = 0;
    rtx mem, insn;
    int return_address_on_stack = cris_return_address_on_stack ();
    int got_really_used = false;
    int n_movem_regs = 0;
!   int pretend = current_function_pretend_args_size;
  
    /* Don't do anything if no prologues or epilogues are wanted.  */
    if (!TARGET_PROLOGUE_EPILOGUE)
--- 2731,2744 ----
    int regno;
    int size = get_frame_size ();
    /* Shorten the used name for readability.  */
!   int cfoa_size = rtl.outgoing_args_size;
    int last_movem_reg = -1;
    int framesize = 0;
    rtx mem, insn;
    int return_address_on_stack = cris_return_address_on_stack ();
    int got_really_used = false;
    int n_movem_regs = 0;
!   int pretend = rtl.args.pretend_args_size;
  
    /* Don't do anything if no prologues or epilogues are wanted.  */
    if (!TARGET_PROLOGUE_EPILOGUE)
*************** cris_expand_prologue (void)
*** 2765,2771 ****
      {
        /* See also cris_setup_incoming_varargs where
  	 cfun->machine->stdarg_regs is set.  There are other setters of
! 	 current_function_pretend_args_size than stdarg handling, like
  	 for an argument passed with parts in R13 and stack.  We must
  	 not store R13 into the pretend-area for that case, as GCC does
  	 that itself.  "Our" store would be marked as redundant and GCC
--- 2765,2771 ----
      {
        /* See also cris_setup_incoming_varargs where
  	 cfun->machine->stdarg_regs is set.  There are other setters of
! 	 rtl.args.pretend_args_size than stdarg handling, like
  	 for an argument passed with parts in R13 and stack.  We must
  	 not store R13 into the pretend-area for that case, as GCC does
  	 that itself.  "Our" store would be marked as redundant and GCC
*************** cris_expand_prologue (void)
*** 2799,2805 ****
  	     get confused.  */
  	}
  
!       /* For other setters of current_function_pretend_args_size, we
  	 just adjust the stack by leaving the remaining size in
  	 "pretend", handled below.  */
      }
--- 2799,2805 ----
  	     get confused.  */
  	}
  
!       /* For other setters of rtl.args.pretend_args_size, we
  	 just adjust the stack by leaving the remaining size in
  	 "pretend", handled below.  */
      }
*************** cris_expand_epilogue (void)
*** 3012,3019 ****
    int regno;
    int size = get_frame_size ();
    int last_movem_reg = -1;
!   int argspace_offset = current_function_outgoing_args_size;
!   int pretend =	 current_function_pretend_args_size;
    rtx mem;
    bool return_address_on_stack = cris_return_address_on_stack ();
    /* A reference may have been optimized out
--- 3012,3019 ----
    int regno;
    int size = get_frame_size ();
    int last_movem_reg = -1;
!   int argspace_offset = rtl.outgoing_args_size;
!   int pretend =	 rtl.args.pretend_args_size;
    rtx mem;
    bool return_address_on_stack = cris_return_address_on_stack ();
    /* A reference may have been optimized out
Index: config/iq2000/iq2000.c
===================================================================
*** config/iq2000/iq2000.c	(revision 133756)
--- config/iq2000/iq2000.c	(working copy)
*************** iq2000_va_start (tree valist, rtx nextar
*** 1368,1374 ****
    /* Find out how many non-float named formals.  */
    int gpr_save_area_size;
    /* Note UNITS_PER_WORD is 4 bytes.  */
!   int_arg_words = current_function_args_info.arg_words;
  
    if (int_arg_words < 8 )
      /* Adjust for the prologue's economy measure.  */
--- 1368,1374 ----
    /* Find out how many non-float named formals.  */
    int gpr_save_area_size;
    /* Note UNITS_PER_WORD is 4 bytes.  */
!   int_arg_words = rtl.args.info.arg_words;
  
    if (int_arg_words < 8 )
      /* Adjust for the prologue's economy measure.  */
*************** compute_frame_size (HOST_WIDE_INT size)
*** 1615,1621 ****
    mask = 0;
    extra_size = IQ2000_STACK_ALIGN ((0));
    var_size = IQ2000_STACK_ALIGN (size);
!   args_size = IQ2000_STACK_ALIGN (current_function_outgoing_args_size);
  
    /* If a function dynamically allocates the stack and
       has 0 for STACK_DYNAMIC_OFFSET then allocate some stack space.  */
--- 1615,1621 ----
    mask = 0;
    extra_size = IQ2000_STACK_ALIGN ((0));
    var_size = IQ2000_STACK_ALIGN (size);
!   args_size = IQ2000_STACK_ALIGN (rtl.outgoing_args_size);
  
    /* If a function dynamically allocates the stack and
       has 0 for STACK_DYNAMIC_OFFSET then allocate some stack space.  */
*************** compute_frame_size (HOST_WIDE_INT size)
*** 1660,1666 ****
        && ! profile_flag)
      total_size = extra_size = 0;
  
!   total_size += IQ2000_STACK_ALIGN (current_function_pretend_args_size);
  
    /* Save other computed information.  */
    cfun->machine->total_size = total_size;
--- 1660,1666 ----
        && ! profile_flag)
      total_size = extra_size = 0;
  
!   total_size += IQ2000_STACK_ALIGN (rtl.args.pretend_args_size);
  
    /* Save other computed information.  */
    cfun->machine->total_size = total_size;
Index: config/mt/mt.c
===================================================================
*** config/mt/mt.c	(revision 133756)
--- config/mt/mt.c	(working copy)
*************** mt_compute_frame_size (int size)
*** 866,873 ****
    unsigned int  reg_mask;
  
    var_size      = size;
!   args_size     = current_function_outgoing_args_size;
!   pretend_size  = current_function_pretend_args_size;
    extra_size    = FIRST_PARM_OFFSET (0);
    total_size    = extra_size + pretend_size + args_size + var_size;
    reg_size      = 0;
--- 866,873 ----
    unsigned int  reg_mask;
  
    var_size      = size;
!   args_size     = rtl.outgoing_args_size;
!   pretend_size  = rtl.args.pretend_args_size;
    extra_size    = FIRST_PARM_OFFSET (0);
    total_size    = extra_size + pretend_size + args_size + var_size;
    reg_size      = 0;
Index: config/mn10300/mn10300.c
===================================================================
*** config/mn10300/mn10300.c	(revision 133756)
--- config/mn10300/mn10300.c	(working copy)
*************** int
*** 585,594 ****
  can_use_return_insn (void)
  {
    /* size includes the fixed stack space needed for function calls.  */
!   int size = get_frame_size () + current_function_outgoing_args_size;
  
    /* And space for the return pointer.  */
!   size += current_function_outgoing_args_size ? 4 : 0;
  
    return (reload_completed
  	  && size == 0
--- 585,594 ----
  can_use_return_insn (void)
  {
    /* size includes the fixed stack space needed for function calls.  */
!   int size = get_frame_size () + rtl.outgoing_args_size;
  
    /* And space for the return pointer.  */
!   size += rtl.outgoing_args_size ? 4 : 0;
  
    return (reload_completed
  	  && size == 0
*************** expand_prologue (void)
*** 697,704 ****
    HOST_WIDE_INT size;
  
    /* SIZE includes the fixed stack space needed for function calls.  */
!   size = get_frame_size () + current_function_outgoing_args_size;
!   size += (current_function_outgoing_args_size ? 4 : 0);
  
    /* If we use any of the callee-saved registers, save them now.  */
    mn10300_gen_multiple_store (mn10300_get_live_callee_saved_regs ());
--- 697,704 ----
    HOST_WIDE_INT size;
  
    /* SIZE includes the fixed stack space needed for function calls.  */
!   size = get_frame_size () + rtl.outgoing_args_size;
!   size += (rtl.outgoing_args_size ? 4 : 0);
  
    /* If we use any of the callee-saved registers, save them now.  */
    mn10300_gen_multiple_store (mn10300_get_live_callee_saved_regs ());
*************** expand_epilogue (void)
*** 956,963 ****
    HOST_WIDE_INT size;
  
    /* SIZE includes the fixed stack space needed for function calls.  */
!   size = get_frame_size () + current_function_outgoing_args_size;
!   size += (current_function_outgoing_args_size ? 4 : 0);
  
    if (TARGET_AM33_2 && fp_regs_to_save ())
      {
--- 956,963 ----
    HOST_WIDE_INT size;
  
    /* SIZE includes the fixed stack space needed for function calls.  */
!   size = get_frame_size () + rtl.outgoing_args_size;
!   size += (rtl.outgoing_args_size ? 4 : 0);
  
    if (TARGET_AM33_2 && fp_regs_to_save ())
      {
*************** initial_offset (int from, int to)
*** 1408,1419 ****
  	  || frame_pointer_needed)
  	return (get_frame_size () + REG_SAVE_BYTES
  		+ 4 * fp_regs_to_save ()
! 		+ (current_function_outgoing_args_size
! 		   ? current_function_outgoing_args_size + 4 : 0));
        else
  	return (get_frame_size ()
! 		+ (current_function_outgoing_args_size
! 		   ? current_function_outgoing_args_size + 4 : 0));
      }
  
    /* The difference between the frame pointer and stack pointer is the sum
--- 1408,1419 ----
  	  || frame_pointer_needed)
  	return (get_frame_size () + REG_SAVE_BYTES
  		+ 4 * fp_regs_to_save ()
! 		+ (rtl.outgoing_args_size
! 		   ? rtl.outgoing_args_size + 4 : 0));
        else
  	return (get_frame_size ()
! 		+ (rtl.outgoing_args_size
! 		   ? rtl.outgoing_args_size + 4 : 0));
      }
  
    /* The difference between the frame pointer and stack pointer is the sum
*************** initial_offset (int from, int to)
*** 1421,1428 ****
       for function calls (if any).  */
    if (from == FRAME_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
      return (get_frame_size ()
! 	    + (current_function_outgoing_args_size
! 	       ? current_function_outgoing_args_size + 4 : 0));
  
    gcc_unreachable ();
  }
--- 1421,1428 ----
       for function calls (if any).  */
    if (from == FRAME_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
      return (get_frame_size ()
! 	    + (rtl.outgoing_args_size
! 	       ? rtl.outgoing_args_size + 4 : 0));
  
    gcc_unreachable ();
  }
*************** mn10300_builtin_saveregs (void)
*** 1452,1472 ****
    alias_set_type set = get_varargs_alias_set ();
  
    if (argadj)
!     offset = plus_constant (current_function_arg_offset_rtx, argadj);
    else
!     offset = current_function_arg_offset_rtx;
  
!   mem = gen_rtx_MEM (SImode, current_function_internal_arg_pointer);
    set_mem_alias_set (mem, set);
    emit_move_insn (mem, gen_rtx_REG (SImode, 0));
  
    mem = gen_rtx_MEM (SImode,
! 		     plus_constant (current_function_internal_arg_pointer, 4));
    set_mem_alias_set (mem, set);
    emit_move_insn (mem, gen_rtx_REG (SImode, 1));
  
    return copy_to_reg (expand_binop (Pmode, add_optab,
! 				    current_function_internal_arg_pointer,
  				    offset, 0, 0, OPTAB_LIB_WIDEN));
  }
  
--- 1452,1472 ----
    alias_set_type set = get_varargs_alias_set ();
  
    if (argadj)
!     offset = plus_constant (rtl.args.arg_offset_rtx, argadj);
    else
!     offset = rtl.args.arg_offset_rtx;
  
!   mem = gen_rtx_MEM (SImode, rtl.args.internal_arg_pointer);
    set_mem_alias_set (mem, set);
    emit_move_insn (mem, gen_rtx_REG (SImode, 0));
  
    mem = gen_rtx_MEM (SImode,
! 		     plus_constant (rtl.args.internal_arg_pointer, 4));
    set_mem_alias_set (mem, set);
    emit_move_insn (mem, gen_rtx_REG (SImode, 1));
  
    return copy_to_reg (expand_binop (Pmode, add_optab,
! 				    rtl.args.internal_arg_pointer,
  				    offset, 0, 0, OPTAB_LIB_WIDEN));
  }
  
Index: config/mn10300/mn10300.md
===================================================================
*** config/mn10300/mn10300.md	(revision 133756)
--- config/mn10300/mn10300.md	(working copy)
***************
*** 2589,2595 ****
  {
    rtx sp_reg = gen_rtx_REG (SImode, SP_REG);
    int need_stack_space = (get_frame_size () == 0
! 			  && current_function_outgoing_args_size == 0);
  
    if (need_stack_space)
      emit_move_insn (sp_reg, plus_constant (sp_reg, -4));
--- 2589,2595 ----
  {
    rtx sp_reg = gen_rtx_REG (SImode, SP_REG);
    int need_stack_space = (get_frame_size () == 0
! 			  && rtl.outgoing_args_size == 0);
  
    if (need_stack_space)
      emit_move_insn (sp_reg, plus_constant (sp_reg, -4));
Index: config/ia64/ia64.c
===================================================================
*** config/ia64/ia64.c	(revision 133756)
--- config/ia64/ia64.c	(working copy)
*************** ia64_compute_frame_size (HOST_WIDE_INT s
*** 2575,2586 ****
       the stack, then the FR save area will be unaligned.  We round the
       size of this area up to keep things 16 byte aligned.  */
    if (spilled_fr_p)
!     pretend_args_size = IA64_STACK_ALIGN (current_function_pretend_args_size);
    else
!     pretend_args_size = current_function_pretend_args_size;
  
    total_size = (spill_size + extra_spill_size + size + pretend_args_size
! 		+ current_function_outgoing_args_size);
    total_size = IA64_STACK_ALIGN (total_size);
  
    /* We always use the 16-byte scratch area provided by the caller, but
--- 2575,2586 ----
       the stack, then the FR save area will be unaligned.  We round the
       size of this area up to keep things 16 byte aligned.  */
    if (spilled_fr_p)
!     pretend_args_size = IA64_STACK_ALIGN (rtl.args.pretend_args_size);
    else
!     pretend_args_size = rtl.args.pretend_args_size;
  
    total_size = (spill_size + extra_spill_size + size + pretend_args_size
! 		+ rtl.outgoing_args_size);
    total_size = IA64_STACK_ALIGN (total_size);
  
    /* We always use the 16-byte scratch area provided by the caller, but
*************** ia64_initial_elimination_offset (int fro
*** 2616,2629 ****
  	    offset = -current_frame_info.total_size;
  	  else
  	    offset = -(current_frame_info.total_size
! 		       - current_function_outgoing_args_size - 16);
  	  break;
  
  	case STACK_POINTER_REGNUM:
  	  if (current_function_is_leaf)
  	    offset = 0;
  	  else
! 	    offset = 16 + current_function_outgoing_args_size;
  	  break;
  
  	default:
--- 2616,2629 ----
  	    offset = -current_frame_info.total_size;
  	  else
  	    offset = -(current_frame_info.total_size
! 		       - rtl.outgoing_args_size - 16);
  	  break;
  
  	case STACK_POINTER_REGNUM:
  	  if (current_function_is_leaf)
  	    offset = 0;
  	  else
! 	    offset = 16 + rtl.outgoing_args_size;
  	  break;
  
  	default:
*************** ia64_initial_elimination_offset (int fro
*** 2637,2648 ****
        switch (to)
  	{
  	case HARD_FRAME_POINTER_REGNUM:
! 	  offset = 16 - current_function_pretend_args_size;
  	  break;
  
  	case STACK_POINTER_REGNUM:
  	  offset = (current_frame_info.total_size
! 		    + 16 - current_function_pretend_args_size);
  	  break;
  
  	default:
--- 2637,2648 ----
        switch (to)
  	{
  	case HARD_FRAME_POINTER_REGNUM:
! 	  offset = 16 - rtl.args.pretend_args_size;
  	  break;
  
  	case STACK_POINTER_REGNUM:
  	  offset = (current_frame_info.total_size
! 		    + 16 - rtl.args.pretend_args_size);
  	  break;
  
  	default:
*************** ia64_expand_prologue (void)
*** 2994,3000 ****
    /* We don't need an alloc instruction if we've used no outputs or locals.  */
    if (current_frame_info.n_local_regs == 0
        && current_frame_info.n_output_regs == 0
!       && current_frame_info.n_input_regs <= current_function_args_info.int_regs
        && !TEST_HARD_REG_BIT (current_frame_info.mask, AR_PFS_REGNUM))
      {
        /* If there is no alloc, but there are input registers used, then we
--- 2994,3000 ----
    /* We don't need an alloc instruction if we've used no outputs or locals.  */
    if (current_frame_info.n_local_regs == 0
        && current_frame_info.n_output_regs == 0
!       && current_frame_info.n_input_regs <= rtl.args.info.int_regs
        && !TEST_HARD_REG_BIT (current_frame_info.mask, AR_PFS_REGNUM))
      {
        /* If there is no alloc, but there are input registers used, then we
Index: config/m68k/m68k.md
===================================================================
*** config/m68k/m68k.md	(revision 133756)
--- config/m68k/m68k.md	(working copy)
***************
*** 7153,7161 ****
        return "sleep";
  
      default:
!       if (current_function_pops_args)
  	{
! 	  operands[0] = GEN_INT (current_function_pops_args);
  	  return "rtd %0";
  	}
        else
--- 7153,7161 ----
        return "sleep";
  
      default:
!       if (rtl.args.pops_args)
  	{
! 	  operands[0] = GEN_INT (rtl.args.pops_args);
  	  return "rtd %0";
  	}
        else
Index: config/rs6000/rs6000.c
===================================================================
*** config/rs6000/rs6000.c	(revision 133756)
--- config/rs6000/rs6000.c	(working copy)
*************** rs6000_va_start (tree valist, rtx nextar
*** 6656,6665 ****
    sav = build3 (COMPONENT_REF, TREE_TYPE (f_sav), valist, f_sav, NULL_TREE);
  
    /* Count number of gp and fp argument registers used.  */
!   words = current_function_args_info.words;
!   n_gpr = MIN (current_function_args_info.sysv_gregno - GP_ARG_MIN_REG,
  	       GP_ARG_NUM_REG);
!   n_fpr = MIN (current_function_args_info.fregno - FP_ARG_MIN_REG,
  	       FP_ARG_NUM_REG);
  
    if (TARGET_DEBUG_ARG)
--- 6656,6665 ----
    sav = build3 (COMPONENT_REF, TREE_TYPE (f_sav), valist, f_sav, NULL_TREE);
  
    /* Count number of gp and fp argument registers used.  */
!   words = rtl.args.info.words;
!   n_gpr = MIN (rtl.args.info.sysv_gregno - GP_ARG_MIN_REG,
  	       GP_ARG_NUM_REG);
!   n_fpr = MIN (rtl.args.info.fregno - FP_ARG_MIN_REG,
  	       FP_ARG_NUM_REG);
  
    if (TARGET_DEBUG_ARG)
*************** rs6000_stack_info (void)
*** 14489,14495 ****
    info_ptr->reg_size     = reg_size;
    info_ptr->fixed_size   = RS6000_SAVE_AREA;
    info_ptr->vars_size    = RS6000_ALIGN (get_frame_size (), 8);
!   info_ptr->parm_size    = RS6000_ALIGN (current_function_outgoing_args_size,
  					 TARGET_ALTIVEC ? 16 : 8);
    if (FRAME_GROWS_DOWNWARD)
      info_ptr->vars_size
--- 14489,14495 ----
    info_ptr->reg_size     = reg_size;
    info_ptr->fixed_size   = RS6000_SAVE_AREA;
    info_ptr->vars_size    = RS6000_ALIGN (get_frame_size (), 8);
!   info_ptr->parm_size    = RS6000_ALIGN (rtl.outgoing_args_size,
  					 TARGET_ALTIVEC ? 16 : 8);
    if (FRAME_GROWS_DOWNWARD)
      info_ptr->vars_size
Index: config/mcore/mcore.c
===================================================================
*** config/mcore/mcore.c	(revision 133756)
--- config/mcore/mcore.c	(working copy)
*************** layout_mcore_frame (struct mcore_frame *
*** 1651,1657 ****
  
    /* Might have to spill bytes to re-assemble a big argument that
       was passed partially in registers and partially on the stack.  */
!   nbytes = current_function_pretend_args_size;
    
    /* Determine how much space for spilled anonymous args (e.g., stdarg).  */
    if (current_function_anonymous_args)
--- 1651,1657 ----
  
    /* Might have to spill bytes to re-assemble a big argument that
       was passed partially in registers and partially on the stack.  */
!   nbytes = rtl.args.pretend_args_size;
    
    /* Determine how much space for spilled anonymous args (e.g., stdarg).  */
    if (current_function_anonymous_args)
*************** layout_mcore_frame (struct mcore_frame *
*** 1665,1671 ****
  
    /* And the rest of it... locals and space for overflowed outbounds.  */
    infp->local_size = get_frame_size ();
!   infp->outbound_size = current_function_outgoing_args_size;
  
    /* Make sure we have a whole number of words for the locals.  */
    if (infp->local_size % STACK_BYTES)
--- 1665,1671 ----
  
    /* And the rest of it... locals and space for overflowed outbounds.  */
    infp->local_size = get_frame_size ();
!   infp->outbound_size = rtl.outgoing_args_size;
  
    /* Make sure we have a whole number of words for the locals.  */
    if (infp->local_size % STACK_BYTES)
*************** mcore_expand_prolog (void)
*** 1962,1968 ****
    /* If we have a parameter passed partially in regs and partially in memory,
       the registers will have been stored to memory already in function.c.  So
       we only need to do something here for varargs functions.  */
!   if (fi.arg_size != 0 && current_function_pretend_args_size == 0)
      {
        int offset;
        int rn = FIRST_PARM_REG + NPARM_REGS - 1;
--- 1962,1968 ----
    /* If we have a parameter passed partially in regs and partially in memory,
       the registers will have been stored to memory already in function.c.  So
       we only need to do something here for varargs functions.  */
!   if (fi.arg_size != 0 && rtl.args.pretend_args_size == 0)
      {
        int offset;
        int rn = FIRST_PARM_REG + NPARM_REGS - 1;
Index: config/arc/arc.c
===================================================================
*** config/arc/arc.c	(revision 133756)
--- config/arc/arc.c	(working copy)
*************** arc_compute_frame_size (int size /* # of
*** 1079,1089 ****
    int interrupt_p;
  
    var_size	= size;
!   args_size	= current_function_outgoing_args_size;
!   pretend_size	= current_function_pretend_args_size;
    extra_size	= FIRST_PARM_OFFSET (0);
    total_size	= extra_size + pretend_size + args_size + var_size;
!   reg_offset	= FIRST_PARM_OFFSET(0) + current_function_outgoing_args_size;
    reg_size	= 0;
    gmask		= 0;
  
--- 1079,1089 ----
    int interrupt_p;
  
    var_size	= size;
!   args_size	= rtl.outgoing_args_size;
!   pretend_size	= rtl.args.pretend_args_size;
    extra_size	= FIRST_PARM_OFFSET (0);
    total_size	= extra_size + pretend_size + args_size + var_size;
!   reg_offset	= FIRST_PARM_OFFSET(0) + rtl.outgoing_args_size;
    reg_size	= 0;
    gmask		= 0;
  
*************** static void
*** 2282,2289 ****
  arc_va_start (tree valist, rtx nextarg)
  {
    /* See arc_setup_incoming_varargs for reasons for this oddity.  */
!   if (current_function_args_info < 8
!       && (current_function_args_info & 1))
      nextarg = plus_constant (nextarg, UNITS_PER_WORD);
  
    std_expand_builtin_va_start (valist, nextarg);
--- 2282,2289 ----
  arc_va_start (tree valist, rtx nextarg)
  {
    /* See arc_setup_incoming_varargs for reasons for this oddity.  */
!   if (rtl.args.info < 8
!       && (rtl.args.info & 1))
      nextarg = plus_constant (nextarg, UNITS_PER_WORD);
  
    std_expand_builtin_va_start (valist, nextarg);
Index: config/score/score3.c
===================================================================
*** config/score/score3.c	(revision 133756)
--- config/score/score3.c	(working copy)
*************** score3_compute_frame_size (HOST_WIDE_INT
*** 183,189 ****
    f->gp_reg_size = 0;
    f->mask = 0;
    f->var_size = SCORE3_STACK_ALIGN (size);
!   f->args_size = current_function_outgoing_args_size;
    f->cprestore_size = flag_pic ? UNITS_PER_WORD : 0;
  
    if (f->var_size == 0 && current_function_is_leaf)
--- 183,189 ----
    f->gp_reg_size = 0;
    f->mask = 0;
    f->var_size = SCORE3_STACK_ALIGN (size);
!   f->args_size = rtl.outgoing_args_size;
    f->cprestore_size = flag_pic ? UNITS_PER_WORD : 0;
  
    if (f->var_size == 0 && current_function_is_leaf)
Index: config/score/score7.c
===================================================================
*** config/score/score7.c	(revision 133756)
--- config/score/score7.c	(working copy)
*************** score7_compute_frame_size (HOST_WIDE_INT
*** 183,189 ****
    f->gp_reg_size = 0;
    f->mask = 0;
    f->var_size = SCORE7_STACK_ALIGN (size);
!   f->args_size = current_function_outgoing_args_size;
    f->cprestore_size = flag_pic ? UNITS_PER_WORD : 0;
    if (f->var_size == 0 && current_function_is_leaf)
      f->args_size = f->cprestore_size = 0;
--- 183,189 ----
    f->gp_reg_size = 0;
    f->mask = 0;
    f->var_size = SCORE7_STACK_ALIGN (size);
!   f->args_size = rtl.outgoing_args_size;
    f->cprestore_size = flag_pic ? UNITS_PER_WORD : 0;
    if (f->var_size == 0 && current_function_is_leaf)
      f->args_size = f->cprestore_size = 0;
Index: config/arm/arm.c
===================================================================
*** config/arm/arm.c	(revision 133756)
--- config/arm/arm.c	(working copy)
*************** use_return_insn (int iscond, rtx sibling
*** 1653,1659 ****
    stack_adjust = offsets->outgoing_args - offsets->saved_regs;
  
    /* As do variadic functions.  */
!   if (current_function_pretend_args_size
        || cfun->machine->uses_anonymous_args
        /* Or if the function calls __builtin_eh_return () */
        || current_function_calls_eh_return
--- 1653,1659 ----
    stack_adjust = offsets->outgoing_args - offsets->saved_regs;
  
    /* As do variadic functions.  */
!   if (rtl.args.pretend_args_size
        || cfun->machine->uses_anonymous_args
        /* Or if the function calls __builtin_eh_return () */
        || current_function_calls_eh_return
*************** thumb_find_work_register (unsigned long 
*** 3544,3558 ****
       the variable argument list and so we can be sure that it will be
       pushed right at the start of the function.  Hence it will be available
       for the rest of the prologue.
!      (*): ie current_function_pretend_args_size is greater than 0.  */
    if (cfun->machine->uses_anonymous_args
!       && current_function_pretend_args_size > 0)
      return LAST_ARG_REGNUM;
  
    /* The other case is when we have fixed arguments but less than 4 registers
       worth.  In this case r3 might be used in the body of the function, but
       it is not being used to convey an argument into the function.  In theory
!      we could just check current_function_args_size to see how many bytes are
       being passed in argument registers, but it seems that it is unreliable.
       Sometimes it will have the value 0 when in fact arguments are being
       passed.  (See testcase execute/20021111-1.c for an example).  So we also
--- 3544,3558 ----
       the variable argument list and so we can be sure that it will be
       pushed right at the start of the function.  Hence it will be available
       for the rest of the prologue.
!      (*): ie rtl.args.pretend_args_size is greater than 0.  */
    if (cfun->machine->uses_anonymous_args
!       && rtl.args.pretend_args_size > 0)
      return LAST_ARG_REGNUM;
  
    /* The other case is when we have fixed arguments but less than 4 registers
       worth.  In this case r3 might be used in the body of the function, but
       it is not being used to convey an argument into the function.  In theory
!      we could just check rtl.args.size to see how many bytes are
       being passed in argument registers, but it seems that it is unreliable.
       Sometimes it will have the value 0 when in fact arguments are being
       passed.  (See testcase execute/20021111-1.c for an example).  So we also
*************** thumb_find_work_register (unsigned long 
*** 3562,3569 ****
       when a function has an unused argument in r3.  But it is better to be
       safe than to be sorry.  */
    if (! cfun->machine->uses_anonymous_args
!       && current_function_args_size >= 0
!       && current_function_args_size <= (LAST_ARG_REGNUM * UNITS_PER_WORD)
        && cfun->args_info.nregs < 4)
      return LAST_ARG_REGNUM;
  
--- 3562,3569 ----
       when a function has an unused argument in r3.  But it is better to be
       safe than to be sorry.  */
    if (! cfun->machine->uses_anonymous_args
!       && rtl.args.size >= 0
!       && rtl.args.size <= (LAST_ARG_REGNUM * UNITS_PER_WORD)
        && cfun->args_info.nregs < 4)
      return LAST_ARG_REGNUM;
  
*************** arm_compute_save_reg_mask (void)
*** 10833,10839 ****
  
    if (TARGET_REALLY_IWMMXT
        && ((bit_count (save_reg_mask)
! 	   + ARM_NUM_INTS (current_function_pretend_args_size)) % 2) != 0)
      {
        /* The total number of registers that are going to be pushed
  	 onto the stack is odd.  We need to ensure that the stack
--- 10833,10839 ----
  
    if (TARGET_REALLY_IWMMXT
        && ((bit_count (save_reg_mask)
! 	   + ARM_NUM_INTS (rtl.args.pretend_args_size)) % 2) != 0)
      {
        /* The total number of registers that are going to be pushed
  	 onto the stack is odd.  We need to ensure that the stack
*************** arm_output_function_prologue (FILE *f, H
*** 11258,11265 ****
      asm_fprintf (f, "\t%@ Stack Align: May be called with mis-aligned SP.\n");
  
    asm_fprintf (f, "\t%@ args = %d, pretend = %d, frame = %wd\n",
! 	       current_function_args_size,
! 	       current_function_pretend_args_size, frame_size);
  
    asm_fprintf (f, "\t%@ frame_needed = %d, uses_anonymous_args = %d\n",
  	       frame_pointer_needed,
--- 11258,11265 ----
      asm_fprintf (f, "\t%@ Stack Align: May be called with mis-aligned SP.\n");
  
    asm_fprintf (f, "\t%@ args = %d, pretend = %d, frame = %wd\n",
! 	       rtl.args.size,
! 	       rtl.args.pretend_args_size, frame_size);
  
    asm_fprintf (f, "\t%@ frame_needed = %d, uses_anonymous_args = %d\n",
  	       frame_pointer_needed,
*************** arm_output_epilogue (rtx sibling)
*** 11626,11632 ****
  	  && (TARGET_ARM || ARM_FUNC_TYPE (func_type) == ARM_FT_NORMAL)
  	  && !IS_STACKALIGN (func_type)
  	  && really_return
! 	  && current_function_pretend_args_size == 0
  	  && saved_regs_mask & (1 << LR_REGNUM)
  	  && !current_function_calls_eh_return)
  	{
--- 11626,11632 ----
  	  && (TARGET_ARM || ARM_FUNC_TYPE (func_type) == ARM_FT_NORMAL)
  	  && !IS_STACKALIGN (func_type)
  	  && really_return
! 	  && rtl.args.pretend_args_size == 0
  	  && saved_regs_mask & (1 << LR_REGNUM)
  	  && !current_function_calls_eh_return)
  	{
*************** arm_output_epilogue (rtx sibling)
*** 11661,11671 ****
  	    print_multi_reg (f, "pop\t", SP_REGNUM, saved_regs_mask, 0);
  	}
  
!       if (current_function_pretend_args_size)
  	{
  	  /* Unwind the pre-pushed regs.  */
  	  operands[0] = operands[1] = stack_pointer_rtx;
! 	  operands[2] = GEN_INT (current_function_pretend_args_size);
  	  output_add_immediate (operands);
  	}
      }
--- 11661,11671 ----
  	    print_multi_reg (f, "pop\t", SP_REGNUM, saved_regs_mask, 0);
  	}
  
!       if (rtl.args.pretend_args_size)
  	{
  	  /* Unwind the pre-pushed regs.  */
  	  operands[0] = operands[1] = stack_pointer_rtx;
! 	  operands[2] = GEN_INT (rtl.args.pretend_args_size);
  	  output_add_immediate (operands);
  	}
      }
*************** arm_size_return_regs (void)
*** 11890,11897 ****
  {
    enum machine_mode mode;
  
!   if (current_function_return_rtx != 0)
!     mode = GET_MODE (current_function_return_rtx);
    else
      mode = DECL_MODE (DECL_RESULT (current_function_decl));
  
--- 11890,11897 ----
  {
    enum machine_mode mode;
  
!   if (rtl.return_rtx != 0)
!     mode = GET_MODE (rtl.return_rtx);
    else
      mode = DECL_MODE (DECL_RESULT (current_function_decl));
  
*************** arm_get_frame_offsets (void)
*** 12050,12056 ****
    leaf = leaf_function_p ();
  
    /* Space for variadic functions.  */
!   offsets->saved_args = current_function_pretend_args_size;
  
    /* In Thumb mode this is incorrect, but never used.  */
    offsets->frame = offsets->saved_args + (frame_pointer_needed ? 4 : 0);
--- 12050,12056 ----
    leaf = leaf_function_p ();
  
    /* Space for variadic functions.  */
!   offsets->saved_args = rtl.args.pretend_args_size;
  
    /* In Thumb mode this is incorrect, but never used.  */
    offsets->frame = offsets->saved_args + (frame_pointer_needed ? 4 : 0);
*************** arm_get_frame_offsets (void)
*** 12119,12125 ****
        /* Try to align stack by pushing an extra reg.  Don't bother doing this
           when there is a stack frame as the alignment will be rolled into
  	 the normal stack adjustment.  */
!       if (frame_size + current_function_outgoing_args_size == 0)
  	{
  	  int reg = -1;
  
--- 12119,12125 ----
        /* Try to align stack by pushing an extra reg.  Don't bother doing this
           when there is a stack frame as the alignment will be rolled into
  	 the normal stack adjustment.  */
!       if (frame_size + rtl.outgoing_args_size == 0)
  	{
  	  int reg = -1;
  
*************** arm_get_frame_offsets (void)
*** 12150,12156 ****
  
    offsets->locals_base = offsets->soft_frame + frame_size;
    offsets->outgoing_args = (offsets->locals_base
! 			    + current_function_outgoing_args_size);
  
    if (ARM_DOUBLEWORD_ALIGN)
      {
--- 12150,12156 ----
  
    offsets->locals_base = offsets->soft_frame + frame_size;
    offsets->outgoing_args = (offsets->locals_base
! 			    + rtl.outgoing_args_size);
  
    if (ARM_DOUBLEWORD_ALIGN)
      {
*************** arm_expand_prologue (void)
*** 12399,12405 ****
      return;
  
    /* Make a copy of c_f_p_a_s as we may need to modify it locally.  */
!   args_to_push = current_function_pretend_args_size;
  
    /* Compute which register we will have to save onto the stack.  */
    offsets = arm_get_frame_offsets ();
--- 12399,12405 ----
      return;
  
    /* Make a copy of c_f_p_a_s as we may need to modify it locally.  */
!   args_to_push = rtl.args.pretend_args_size;
  
    /* Compute which register we will have to save onto the stack.  */
    offsets = arm_get_frame_offsets ();
*************** arm_expand_prologue (void)
*** 12599,12605 ****
  	      if (!df_regs_ever_live_p (3)
  		  || saved_pretend_args)
  		insn = gen_rtx_REG (SImode, 3);
! 	      else /* if (current_function_pretend_args_size == 0) */
  		{
  		  insn = plus_constant (hard_frame_pointer_rtx, 4);
  		  insn = gen_frame_mem (SImode, insn);
--- 12599,12605 ----
  	      if (!df_regs_ever_live_p (3)
  		  || saved_pretend_args)
  		insn = gen_rtx_REG (SImode, 3);
! 	      else /* if (rtl.args.pretend_args_size == 0) */
  		{
  		  insn = plus_constant (hard_frame_pointer_rtx, 4);
  		  insn = gen_frame_mem (SImode, insn);
*************** thumb_exit (FILE *f, int reg_containing_
*** 16288,16295 ****
  	 ever used in the function, not just if the register is used
  	 to hold a return value.  */
  
!       if (current_function_return_rtx != 0)
! 	mode = GET_MODE (current_function_return_rtx);
        else
  	mode = DECL_MODE (DECL_RESULT (current_function_decl));
  
--- 16288,16295 ----
  	 ever used in the function, not just if the register is used
  	 to hold a return value.  */
  
!       if (rtl.return_rtx != 0)
! 	mode = GET_MODE (rtl.return_rtx);
        else
  	mode = DECL_MODE (DECL_RESULT (current_function_decl));
  
*************** thumb_unexpanded_epilogue (void)
*** 16705,16711 ****
    had_to_push_lr = (live_regs_mask & (1 << LR_REGNUM)) != 0;
    live_regs_mask &= 0xff;
  
!   if (current_function_pretend_args_size == 0 || TARGET_BACKTRACE)
      {
        /* Pop the return address into the PC.  */
        if (had_to_push_lr)
--- 16705,16711 ----
    had_to_push_lr = (live_regs_mask & (1 << LR_REGNUM)) != 0;
    live_regs_mask &= 0xff;
  
!   if (rtl.args.pretend_args_size == 0 || TARGET_BACKTRACE)
      {
        /* Pop the return address into the PC.  */
        if (had_to_push_lr)
*************** thumb_unexpanded_epilogue (void)
*** 16762,16768 ****
        /* Remove the argument registers that were pushed onto the stack.  */
        asm_fprintf (asm_out_file, "\tadd\t%r, %r, #%d\n",
  		   SP_REGNUM, SP_REGNUM,
! 		   current_function_pretend_args_size);
  
        thumb_exit (asm_out_file, regno);
      }
--- 16762,16768 ----
        /* Remove the argument registers that were pushed onto the stack.  */
        asm_fprintf (asm_out_file, "\tadd\t%r, %r, #%d\n",
  		   SP_REGNUM, SP_REGNUM,
! 		   rtl.args.pretend_args_size);
  
        thumb_exit (asm_out_file, regno);
      }
*************** thumb1_output_function_prologue (FILE *f
*** 17105,17116 ****
        asm_fprintf (f, "%s%U%s:\n", STUB_NAME, name);
      }
  
!   if (current_function_pretend_args_size)
      {
        /* Output unwind directive for the stack adjustment.  */
        if (ARM_EABI_UNWIND_TABLES)
  	fprintf (f, "\t.pad #%d\n",
! 		 current_function_pretend_args_size);
  
        if (cfun->machine->uses_anonymous_args)
  	{
--- 17105,17116 ----
        asm_fprintf (f, "%s%U%s:\n", STUB_NAME, name);
      }
  
!   if (rtl.args.pretend_args_size)
      {
        /* Output unwind directive for the stack adjustment.  */
        if (ARM_EABI_UNWIND_TABLES)
  	fprintf (f, "\t.pad #%d\n",
! 		 rtl.args.pretend_args_size);
  
        if (cfun->machine->uses_anonymous_args)
  	{
*************** thumb1_output_function_prologue (FILE *f
*** 17118,17124 ****
  
  	  fprintf (f, "\tpush\t{");
  
! 	  num_pushes = ARM_NUM_INTS (current_function_pretend_args_size);
  
  	  for (regno = LAST_ARG_REGNUM + 1 - num_pushes;
  	       regno <= LAST_ARG_REGNUM;
--- 17118,17124 ----
  
  	  fprintf (f, "\tpush\t{");
  
! 	  num_pushes = ARM_NUM_INTS (rtl.args.pretend_args_size);
  
  	  for (regno = LAST_ARG_REGNUM + 1 - num_pushes;
  	       regno <= LAST_ARG_REGNUM;
*************** thumb1_output_function_prologue (FILE *f
*** 17131,17137 ****
        else
  	asm_fprintf (f, "\tsub\t%r, %r, #%d\n",
  		     SP_REGNUM, SP_REGNUM,
! 		     current_function_pretend_args_size);
  
        /* We don't need to record the stores for unwinding (would it
  	 help the debugger any if we did?), but record the change in
--- 17131,17137 ----
        else
  	asm_fprintf (f, "\tsub\t%r, %r, #%d\n",
  		     SP_REGNUM, SP_REGNUM,
! 		     rtl.args.pretend_args_size);
  
        /* We don't need to record the stores for unwinding (would it
  	 help the debugger any if we did?), but record the change in
*************** thumb1_output_function_prologue (FILE *f
*** 17140,17146 ****
  	{
  	  char *l = dwarf2out_cfi_label ();
  
! 	  cfa_offset = cfa_offset + current_function_pretend_args_size;
  	  dwarf2out_def_cfa (l, SP_REGNUM, cfa_offset);
  	}
      }
--- 17140,17146 ----
  	{
  	  char *l = dwarf2out_cfi_label ();
  
! 	  cfa_offset = cfa_offset + rtl.args.pretend_args_size;
  	  dwarf2out_def_cfa (l, SP_REGNUM, cfa_offset);
  	}
      }
*************** thumb1_output_function_prologue (FILE *f
*** 17202,17208 ****
  	offset = 0;
  
        asm_fprintf (f, "\tadd\t%r, %r, #%d\n", work_register, SP_REGNUM,
! 		   offset + 16 + current_function_pretend_args_size);
  
        asm_fprintf (f, "\tstr\t%r, [%r, #%d]\n", work_register, SP_REGNUM,
  		   offset + 4);
--- 17202,17208 ----
  	offset = 0;
  
        asm_fprintf (f, "\tadd\t%r, %r, #%d\n", work_register, SP_REGNUM,
! 		   offset + 16 + rtl.args.pretend_args_size);
  
        asm_fprintf (f, "\tstr\t%r, [%r, #%d]\n", work_register, SP_REGNUM,
  		   offset + 4);
Index: config/pa/pa.md
===================================================================
*** config/pa/pa.md	(revision 133756)
--- config/pa/pa.md	(working copy)
*************** add,l %2,%3,%3\;bv,n %%r0(%3)"
*** 7628,7634 ****
  	     the only method that we have for doing DImode multiplication
  	     is with a libcall.  This could be trouble if we haven't
  	     allocated enough space for the outgoing arguments.  */
! 	  gcc_assert (INTVAL (nb) <= current_function_outgoing_args_size);
  
  	  emit_move_insn (arg_pointer_rtx,
  			  gen_rtx_PLUS (word_mode, stack_pointer_rtx,
--- 7628,7634 ----
  	     the only method that we have for doing DImode multiplication
  	     is with a libcall.  This could be trouble if we haven't
  	     allocated enough space for the outgoing arguments.  */
! 	  gcc_assert (INTVAL (nb) <= rtl.outgoing_args_size);
  
  	  emit_move_insn (arg_pointer_rtx,
  			  gen_rtx_PLUS (word_mode, stack_pointer_rtx,
*************** add,l %2,%3,%3\;bv,n %%r0(%3)"
*** 8127,8133 ****
  	     the only method that we have for doing DImode multiplication
  	     is with a libcall.  This could be trouble if we haven't
  	     allocated enough space for the outgoing arguments.  */
! 	  gcc_assert (INTVAL (nb) <= current_function_outgoing_args_size);
  
  	  emit_move_insn (arg_pointer_rtx,
  			  gen_rtx_PLUS (word_mode, stack_pointer_rtx,
--- 8127,8133 ----
  	     the only method that we have for doing DImode multiplication
  	     is with a libcall.  This could be trouble if we haven't
  	     allocated enough space for the outgoing arguments.  */
! 	  gcc_assert (INTVAL (nb) <= rtl.outgoing_args_size);
  
  	  emit_move_insn (arg_pointer_rtx,
  			  gen_rtx_PLUS (word_mode, stack_pointer_rtx,
*************** add,l %2,%3,%3\;bv,n %%r0(%3)"
*** 8645,8651 ****
  	     the only method that we have for doing DImode multiplication
  	     is with a libcall.  This could be trouble if we haven't
  	     allocated enough space for the outgoing arguments.  */
! 	  gcc_assert (INTVAL (nb) <= current_function_outgoing_args_size);
  
  	  emit_move_insn (arg_pointer_rtx,
  			  gen_rtx_PLUS (word_mode, stack_pointer_rtx,
--- 8645,8651 ----
  	     the only method that we have for doing DImode multiplication
  	     is with a libcall.  This could be trouble if we haven't
  	     allocated enough space for the outgoing arguments.  */
! 	  gcc_assert (INTVAL (nb) <= rtl.outgoing_args_size);
  
  	  emit_move_insn (arg_pointer_rtx,
  			  gen_rtx_PLUS (word_mode, stack_pointer_rtx,
*************** add,l %2,%3,%3\;bv,n %%r0(%3)"
*** 8726,8732 ****
  	     the only method that we have for doing DImode multiplication
  	     is with a libcall.  This could be trouble if we haven't
  	     allocated enough space for the outgoing arguments.  */
! 	  gcc_assert (INTVAL (nb) <= current_function_outgoing_args_size);
  
  	  emit_move_insn (arg_pointer_rtx,
  			  gen_rtx_PLUS (word_mode, stack_pointer_rtx,
--- 8726,8732 ----
  	     the only method that we have for doing DImode multiplication
  	     is with a libcall.  This could be trouble if we haven't
  	     allocated enough space for the outgoing arguments.  */
! 	  gcc_assert (INTVAL (nb) <= rtl.outgoing_args_size);
  
  	  emit_move_insn (arg_pointer_rtx,
  			  gen_rtx_PLUS (word_mode, stack_pointer_rtx,
Index: config/pa/pa.c
===================================================================
*** config/pa/pa.c	(revision 133756)
--- config/pa/pa.c	(working copy)
*************** compute_frame_size (HOST_WIDE_INT size, 
*** 3570,3576 ****
       size of the current function's stack frame.  We don't need to align
       for the outgoing arguments as their alignment is set by the final
       rounding for the frame as a whole.  */
!   size += current_function_outgoing_args_size;
  
    /* Allocate space for the fixed frame marker.  This space must be
       allocated for any function that makes calls or allocates
--- 3570,3576 ----
       size of the current function's stack frame.  We don't need to align
       for the outgoing arguments as their alignment is set by the final
       rounding for the frame as a whole.  */
!   size += rtl.outgoing_args_size;
  
    /* Allocate space for the fixed frame marker.  This space must be
       allocated for any function that makes calls or allocates
*************** hppa_builtin_saveregs (void)
*** 5935,5943 ****
  		? UNITS_PER_WORD : 0);
  
    if (argadj)
!     offset = plus_constant (current_function_arg_offset_rtx, argadj);
    else
!     offset = current_function_arg_offset_rtx;
  
    if (TARGET_64BIT)
      {
--- 5935,5943 ----
  		? UNITS_PER_WORD : 0);
  
    if (argadj)
!     offset = plus_constant (rtl.args.arg_offset_rtx, argadj);
    else
!     offset = rtl.args.arg_offset_rtx;
  
    if (TARGET_64BIT)
      {
*************** hppa_builtin_saveregs (void)
*** 5945,5953 ****
  
        /* Adjust for varargs/stdarg differences.  */
        if (argadj)
! 	offset = plus_constant (current_function_arg_offset_rtx, -argadj);
        else
! 	offset = current_function_arg_offset_rtx;
  
        /* We need to save %r26 .. %r19 inclusive starting at offset -64
  	 from the incoming arg pointer and growing to larger addresses.  */
--- 5945,5953 ----
  
        /* Adjust for varargs/stdarg differences.  */
        if (argadj)
! 	offset = plus_constant (rtl.args.arg_offset_rtx, -argadj);
        else
! 	offset = rtl.args.arg_offset_rtx;
  
        /* We need to save %r26 .. %r19 inclusive starting at offset -64
  	 from the incoming arg pointer and growing to larger addresses.  */
*************** hppa_builtin_saveregs (void)
*** 5971,5977 ****
  
    /* Store general registers on the stack.  */
    dest = gen_rtx_MEM (BLKmode,
! 		      plus_constant (current_function_internal_arg_pointer,
  				     -16));
    set_mem_alias_set (dest, get_varargs_alias_set ());
    set_mem_align (dest, BITS_PER_WORD);
--- 5971,5977 ----
  
    /* Store general registers on the stack.  */
    dest = gen_rtx_MEM (BLKmode,
! 		      plus_constant (rtl.args.internal_arg_pointer,
  				     -16));
    set_mem_alias_set (dest, get_varargs_alias_set ());
    set_mem_align (dest, BITS_PER_WORD);
*************** hppa_builtin_saveregs (void)
*** 5989,5995 ****
    emit_insn (gen_blockage ());
  
    return copy_to_reg (expand_binop (Pmode, add_optab,
! 				    current_function_internal_arg_pointer,
  				    offset, 0, 0, OPTAB_LIB_WIDEN));
  }
  
--- 5989,5995 ----
    emit_insn (gen_blockage ());
  
    return copy_to_reg (expand_binop (Pmode, add_optab,
! 				    rtl.args.internal_arg_pointer,
  				    offset, 0, 0, OPTAB_LIB_WIDEN));
  }
  
Index: config/mips/mips.c
===================================================================
*** config/mips/mips.c	(revision 133756)
--- config/mips/mips.c	(working copy)
*************** mips_va_start (tree valist, rtx nextarg)
*** 4784,4790 ****
        int fpr_save_area_size;
        int fpr_offset;
  
!       cum = &current_function_args_info;
        gpr_save_area_size
  	= (MAX_ARGS_IN_REGISTERS - cum->num_gprs) * UNITS_PER_WORD;
        fpr_save_area_size
--- 4784,4790 ----
        int fpr_save_area_size;
        int fpr_offset;
  
!       cum = &rtl.args.info;
        gpr_save_area_size
  	= (MAX_ARGS_IN_REGISTERS - cum->num_gprs) * UNITS_PER_WORD;
        fpr_save_area_size
*************** mips16_build_function_stub (void)
*** 5160,5166 ****
    fprintf (asm_out_file, "\t# Stub function for %s (",
  	   current_function_name ());
    separator = "";
!   for (f = (unsigned int) current_function_args_info.fp_code; f != 0; f >>= 2)
      {
        fprintf (asm_out_file, "%s%s", separator,
  	       (f & 3) == 1 ? "float" : "double");
--- 5160,5166 ----
    fprintf (asm_out_file, "\t# Stub function for %s (",
  	   current_function_name ());
    separator = "";
!   for (f = (unsigned int) rtl.args.info.fp_code; f != 0; f >>= 2)
      {
        fprintf (asm_out_file, "%s%s", separator,
  	       (f & 3) == 1 ? "float" : "double");
*************** mips16_build_function_stub (void)
*** 5196,5202 ****
    fprintf (asm_out_file, "\n");
  
    /* Move the arguments from floating-point registers to general registers.  */
!   mips_output_args_xfer (current_function_args_info.fp_code, 'f');
  
    /* Jump to the MIPS16 function.  */
    fprintf (asm_out_file, "\tjr\t%s\n", reg_names[GP_REG_FIRST + 1]);
--- 5196,5202 ----
    fprintf (asm_out_file, "\n");
  
    /* Move the arguments from floating-point registers to general registers.  */
!   mips_output_args_xfer (rtl.args.info.fp_code, 'f');
  
    /* Jump to the MIPS16 function.  */
    fprintf (asm_out_file, "\tjr\t%s\n", reg_names[GP_REG_FIRST + 1]);
*************** mips_compute_frame_info (void)
*** 7846,7852 ****
      }
    else
      {
!       frame->args_size = current_function_outgoing_args_size;
        frame->cprestore_size = STARTING_FRAME_OFFSET - frame->args_size;
      }
    offset = frame->args_size + frame->cprestore_size;
--- 7846,7852 ----
      }
    else
      {
!       frame->args_size = rtl.outgoing_args_size;
        frame->cprestore_size = STARTING_FRAME_OFFSET - frame->args_size;
      }
    offset = frame->args_size + frame->cprestore_size;
*************** mips_compute_frame_info (void)
*** 7912,7918 ****
    frame->arg_pointer_offset = offset;
  
    /* Move above the callee-allocated area for pretend stack arguments.  */
!   offset += current_function_pretend_args_size;
    frame->total_size = offset;
  
    /* Work out the offsets of the save areas from the top of the frame.  */
--- 7912,7918 ----
    frame->arg_pointer_offset = offset;
  
    /* Move above the callee-allocated area for pretend stack arguments.  */
!   offset += rtl.args.pretend_args_size;
    frame->total_size = offset;
  
    /* Work out the offsets of the save areas from the top of the frame.  */
*************** mips_restore_gp (void)
*** 8059,8065 ****
  
    base = frame_pointer_needed ? hard_frame_pointer_rtx : stack_pointer_rtx;
    address = mips_add_offset (pic_offset_table_rtx, base,
! 			     current_function_outgoing_args_size);
    mips_emit_move (pic_offset_table_rtx, gen_frame_mem (Pmode, address));
    if (!TARGET_EXPLICIT_RELOCS)
      emit_insn (gen_blockage ());
--- 8059,8065 ----
  
    base = frame_pointer_needed ? hard_frame_pointer_rtx : stack_pointer_rtx;
    address = mips_add_offset (pic_offset_table_rtx, base,
! 			     rtl.outgoing_args_size);
    mips_emit_move (pic_offset_table_rtx, gen_frame_mem (Pmode, address));
    if (!TARGET_EXPLICIT_RELOCS)
      emit_insn (gen_blockage ());
*************** mips_output_function_prologue (FILE *fil
*** 8149,8155 ****
       floating-point arguments.  */
    if (TARGET_MIPS16
        && TARGET_HARD_FLOAT_ABI
!       && current_function_args_info.fp_code != 0)
      mips16_build_function_stub ();
  
    /* Select the MIPS16 mode for this function.  */
--- 8149,8155 ----
       floating-point arguments.  */
    if (TARGET_MIPS16
        && TARGET_HARD_FLOAT_ABI
!       && rtl.args.info.fp_code != 0)
      mips16_build_function_stub ();
  
    /* Select the MIPS16 mode for this function.  */
*************** mips_expand_prologue (void)
*** 8486,8492 ****
  
    /* Initialize the $gp save slot.  */
    if (frame->cprestore_size > 0)
!     emit_insn (gen_cprestore (GEN_INT (current_function_outgoing_args_size)));
  
    /* If we are profiling, make sure no instructions are scheduled before
       the call to mcount.  */
--- 8486,8492 ----
  
    /* Initialize the $gp save slot.  */
    if (frame->cprestore_size > 0)
!     emit_insn (gen_cprestore (GEN_INT (rtl.outgoing_args_size)));
  
    /* If we are profiling, make sure no instructions are scheduled before
       the call to mcount.  */
Index: config/v850/v850.c
===================================================================
*** config/v850/v850.c	(revision 133756)
--- config/v850/v850.c	(working copy)
*************** compute_frame_size (int size, long * p_r
*** 1488,1494 ****
  {
    return (size
  	  + compute_register_save_size (p_reg_saved)
! 	  + current_function_outgoing_args_size);
  }
  
  
--- 1488,1494 ----
  {
    return (size
  	  + compute_register_save_size (p_reg_saved)
! 	  + rtl.outgoing_args_size);
  }
  
  
*************** expand_prologue (void)
*** 1525,1531 ****
      }
  
    /* Save arg registers to the stack if necessary.  */
!   else if (current_function_args_info.anonymous_args)
      {
        if (TARGET_PROLOG_FUNCTION && TARGET_V850E && !TARGET_DISABLE_CALLT)
  	emit_insn (gen_save_r6_r9_v850e ());
--- 1525,1531 ----
      }
  
    /* Save arg registers to the stack if necessary.  */
!   else if (rtl.args.info.anonymous_args)
      {
        if (TARGET_PROLOG_FUNCTION && TARGET_V850E && !TARGET_DISABLE_CALLT)
  	emit_insn (gen_save_r6_r9_v850e ());
Index: config/mmix/mmix.c
===================================================================
*** config/mmix/mmix.c	(revision 133756)
--- config/mmix/mmix.c	(working copy)
*************** along with GCC; see the file COPYING3.  
*** 95,104 ****
  /* The %d in "POP %d,0".  */
  #define MMIX_POP_ARGUMENT()						\
   ((! TARGET_ABI_GNU							\
!    && current_function_return_rtx != NULL				\
     && ! current_function_returns_struct)				\
!   ? (GET_CODE (current_function_return_rtx) == PARALLEL			\
!      ? GET_NUM_ELEM (XVEC (current_function_return_rtx, 0)) : 1)	\
    : 0)
  
  /* The canonical saved comparison operands for non-cc0 machines, set in
--- 95,104 ----
  /* The %d in "POP %d,0".  */
  #define MMIX_POP_ARGUMENT()						\
   ((! TARGET_ABI_GNU							\
!    && rtl.return_rtx != NULL				\
     && ! current_function_returns_struct)				\
!   ? (GET_CODE (rtl.return_rtx) == PARALLEL			\
!      ? GET_NUM_ELEM (XVEC (rtl.return_rtx, 0)) : 1)	\
    : 0)
  
  /* The canonical saved comparison operands for non-cc0 machines, set in
*************** mmix_initial_elimination_offset (int fro
*** 531,537 ****
  {
    int regno;
    int fp_sp_offset
!     = (get_frame_size () + current_function_outgoing_args_size + 7) & ~7;
  
    /* There is no actual offset between these two virtual values, but for
       the frame-pointer, we have the old one in the stack position below
--- 531,537 ----
  {
    int regno;
    int fp_sp_offset
!     = (get_frame_size () + rtl.outgoing_args_size + 7) & ~7;
  
    /* There is no actual offset between these two virtual values, but for
       the frame-pointer, we have the old one in the stack position below
*************** mmix_reorg (void)
*** 795,803 ****
       wasteful to optimize for unused parameter registers.  As of
       2002-04-30, df_regs_ever_live_p (n) seems to be set for only-reads too, but
       that might change.  */
!   if (!TARGET_ABI_GNU && regno < current_function_args_info.regs - 1)
      {
!       regno = current_function_args_info.regs - 1;
  
        /* We don't want to let this cause us to go over the limit and make
  	 incoming parameter registers be misnumbered and treating the last
--- 795,803 ----
       wasteful to optimize for unused parameter registers.  As of
       2002-04-30, df_regs_ever_live_p (n) seems to be set for only-reads too, but
       that might change.  */
!   if (!TARGET_ABI_GNU && regno < rtl.args.info.regs - 1)
      {
!       regno = rtl.args.info.regs - 1;
  
        /* We don't want to let this cause us to go over the limit and make
  	 incoming parameter registers be misnumbered and treating the last
*************** mmix_use_simple_return (void)
*** 1838,1845 ****
    int regno;
  
    int stack_space_to_allocate
!     = (current_function_outgoing_args_size
!        + current_function_pretend_args_size
         + get_frame_size () + 7) & ~7;
  
    if (!TARGET_USE_RETURN_INSN || !reload_completed)
--- 1838,1845 ----
    int regno;
  
    int stack_space_to_allocate
!     = (rtl.outgoing_args_size
!        + rtl.args.pretend_args_size
         + get_frame_size () + 7) & ~7;
  
    if (!TARGET_USE_RETURN_INSN || !reload_completed)
*************** mmix_expand_prologue (void)
*** 1875,1882 ****
    HOST_WIDE_INT locals_size = get_frame_size ();
    int regno;
    HOST_WIDE_INT stack_space_to_allocate
!     = (current_function_outgoing_args_size
!        + current_function_pretend_args_size
         + locals_size + 7) & ~7;
    HOST_WIDE_INT offset = -8;
  
--- 1875,1882 ----
    HOST_WIDE_INT locals_size = get_frame_size ();
    int regno;
    HOST_WIDE_INT stack_space_to_allocate
!     = (rtl.outgoing_args_size
!        + rtl.args.pretend_args_size
         + locals_size + 7) & ~7;
    HOST_WIDE_INT offset = -8;
  
*************** mmix_expand_prologue (void)
*** 1909,1920 ****
      internal_error ("stack frame not a multiple of 8 bytes: %wd",
  		    stack_space_to_allocate);
  
!   if (current_function_pretend_args_size)
      {
        int mmix_first_vararg_reg
  	= (MMIX_FIRST_INCOMING_ARG_REGNUM
  	   + (MMIX_MAX_ARGS_IN_REGS
! 	      - current_function_pretend_args_size / 8));
  
        for (regno
  	     = MMIX_FIRST_INCOMING_ARG_REGNUM + MMIX_MAX_ARGS_IN_REGS - 1;
--- 1909,1920 ----
      internal_error ("stack frame not a multiple of 8 bytes: %wd",
  		    stack_space_to_allocate);
  
!   if (rtl.args.pretend_args_size)
      {
        int mmix_first_vararg_reg
  	= (MMIX_FIRST_INCOMING_ARG_REGNUM
  	   + (MMIX_MAX_ARGS_IN_REGS
! 	      - rtl.args.pretend_args_size / 8));
  
        for (regno
  	     = MMIX_FIRST_INCOMING_ARG_REGNUM + MMIX_MAX_ARGS_IN_REGS - 1;
*************** mmix_expand_epilogue (void)
*** 2110,2121 ****
    HOST_WIDE_INT locals_size = get_frame_size ();
    int regno;
    HOST_WIDE_INT stack_space_to_deallocate
!     = (current_function_outgoing_args_size
!        + current_function_pretend_args_size
         + locals_size + 7) & ~7;
  
    /* The first address to access is beyond the outgoing_args area.  */
!   HOST_WIDE_INT offset = current_function_outgoing_args_size;
  
    /* Add the space for global non-register-stack registers.
       It is assumed that the frame-pointer register can be one of these
--- 2110,2121 ----
    HOST_WIDE_INT locals_size = get_frame_size ();
    int regno;
    HOST_WIDE_INT stack_space_to_deallocate
!     = (rtl.outgoing_args_size
!        + rtl.args.pretend_args_size
         + locals_size + 7) & ~7;
  
    /* The first address to access is beyond the outgoing_args area.  */
!   HOST_WIDE_INT offset = rtl.outgoing_args_size;
  
    /* Add the space for global non-register-stack registers.
       It is assumed that the frame-pointer register can be one of these
Index: config/bfin/bfin.c
===================================================================
*** config/bfin/bfin.c	(revision 133756)
--- config/bfin/bfin.c	(working copy)
*************** bfin_initial_elimination_offset (int fro
*** 779,787 ****
  
    if (to == STACK_POINTER_REGNUM)
      {
!       if (current_function_outgoing_args_size >= FIXED_STACK_AREA)
! 	offset += current_function_outgoing_args_size;
!       else if (current_function_outgoing_args_size)
  	offset += FIXED_STACK_AREA;
  
        offset += get_frame_size ();
--- 779,787 ----
  
    if (to == STACK_POINTER_REGNUM)
      {
!       if (rtl.outgoing_args_size >= FIXED_STACK_AREA)
! 	offset += rtl.outgoing_args_size;
!       else if (rtl.outgoing_args_size)
  	offset += FIXED_STACK_AREA;
  
        offset += get_frame_size ();
*************** emit_link_insn (rtx spreg, HOST_WIDE_INT
*** 945,954 ****
  static HOST_WIDE_INT
  arg_area_size (void)
  {
!   if (current_function_outgoing_args_size)
      {
!       if (current_function_outgoing_args_size >= FIXED_STACK_AREA)
! 	return current_function_outgoing_args_size;
        else
  	return FIXED_STACK_AREA;
      }
--- 945,954 ----
  static HOST_WIDE_INT
  arg_area_size (void)
  {
!   if (rtl.outgoing_args_size)
      {
!       if (rtl.outgoing_args_size >= FIXED_STACK_AREA)
! 	return rtl.outgoing_args_size;
        else
  	return FIXED_STACK_AREA;
      }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]