diff options
author | aj <aj@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-06-22 15:03:27 +0000 |
---|---|---|
committer | aj <aj@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-06-22 15:03:27 +0000 |
commit | 4c9e08a4756e16ab5af175be78dcdc0b61b73eab (patch) | |
tree | 1c9f6bed6ad2463273501c132977d557fd474433 /gcc/calls.c | |
parent | 9a59b886c8226deaa58062a7a60fb48ca04aa6c4 (diff) | |
download | gcc-4c9e08a4756e16ab5af175be78dcdc0b61b73eab.tar.gz |
* caller-save.c: Convert to ISO C90.
* calls.c: Likewise.
* cfg.c: Likewise.
* cfganal.c: Likewise.
* cfgbuild.c: Likewise.
* cfgcleanup.c: Likewise.
* cfghooks.c: Likewise.
* cfglayout.c: Likewise.
* cfglayout.h: Likewise.
* cfgloop.c: Likewise.
* cfgloop.h: Likewise.
* cfgloopanal.c: Likewise.
* cfgloopmainip.c: Likewise.
* cfgrtl.c: Likewise.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@68331 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/calls.c')
-rw-r--r-- | gcc/calls.c | 299 |
1 files changed, 96 insertions, 203 deletions
diff --git a/gcc/calls.c b/gcc/calls.c index ad18318627b..d55c2d13189 100644 --- a/gcc/calls.c +++ b/gcc/calls.c @@ -140,59 +140,41 @@ static sbitmap stored_args_map; argument list for the constructor call. */ int stack_arg_under_construction; -static int calls_function PARAMS ((tree, int)); -static int calls_function_1 PARAMS ((tree, int)); - -static void emit_call_1 PARAMS ((rtx, tree, tree, HOST_WIDE_INT, - HOST_WIDE_INT, HOST_WIDE_INT, rtx, - rtx, int, rtx, int, - CUMULATIVE_ARGS *)); -static void precompute_register_parameters PARAMS ((int, - struct arg_data *, - int *)); -static int store_one_arg PARAMS ((struct arg_data *, rtx, int, int, - int)); -static void store_unaligned_arguments_into_pseudos PARAMS ((struct arg_data *, - int)); -static int finalize_must_preallocate PARAMS ((int, int, - struct arg_data *, - struct args_size *)); -static void precompute_arguments PARAMS ((int, int, - struct arg_data *)); -static int compute_argument_block_size PARAMS ((int, - struct args_size *, - int)); -static void initialize_argument_information PARAMS ((int, - struct arg_data *, - struct args_size *, - int, tree, tree, - CUMULATIVE_ARGS *, - int, rtx *, int *, - int *, int *)); -static void compute_argument_addresses PARAMS ((struct arg_data *, - rtx, int)); -static rtx rtx_for_function_call PARAMS ((tree, tree)); -static void load_register_parameters PARAMS ((struct arg_data *, - int, rtx *, int, - int, int *)); -static rtx emit_library_call_value_1 PARAMS ((int, rtx, rtx, - enum libcall_type, - enum machine_mode, - int, va_list)); -static int special_function_p PARAMS ((tree, int)); -static rtx try_to_integrate PARAMS ((tree, tree, rtx, - int, tree, rtx)); -static int check_sibcall_argument_overlap_1 PARAMS ((rtx)); -static int check_sibcall_argument_overlap PARAMS ((rtx, struct arg_data *, - int)); - -static int combine_pending_stack_adjustment_and_call - PARAMS ((int, struct args_size *, int)); -static tree fix_unsafe_tree PARAMS ((tree)); +static int calls_function (tree, int); +static int calls_function_1 (tree, int); + +static void emit_call_1 (rtx, tree, tree, HOST_WIDE_INT, HOST_WIDE_INT, + HOST_WIDE_INT, rtx, rtx, int, rtx, int, + CUMULATIVE_ARGS *); +static void precompute_register_parameters (int, struct arg_data *, int *); +static int store_one_arg (struct arg_data *, rtx, int, int, int); +static void store_unaligned_arguments_into_pseudos (struct arg_data *, int); +static int finalize_must_preallocate (int, int, struct arg_data *, + struct args_size *); +static void precompute_arguments (int, int, struct arg_data *); +static int compute_argument_block_size (int, struct args_size *, int); +static void initialize_argument_information (int, struct arg_data *, + struct args_size *, int, tree, + tree, CUMULATIVE_ARGS *, int, + rtx *, int *, int *, int *); +static void compute_argument_addresses (struct arg_data *, rtx, int); +static rtx rtx_for_function_call (tree, tree); +static void load_register_parameters (struct arg_data *, int, rtx *, int, + int, int *); +static rtx emit_library_call_value_1 (int, rtx, rtx, enum libcall_type, + enum machine_mode, int, va_list); +static int special_function_p (tree, int); +static rtx try_to_integrate (tree, tree, rtx, int, tree, rtx); +static int check_sibcall_argument_overlap_1 (rtx); +static int check_sibcall_argument_overlap (rtx, struct arg_data *, int); + +static int combine_pending_stack_adjustment_and_call (int, struct args_size *, + int); +static tree fix_unsafe_tree (tree); #ifdef REG_PARM_STACK_SPACE -static rtx save_fixed_argument_area PARAMS ((int, rtx, int *, int *)); -static void restore_fixed_argument_area PARAMS ((rtx, rtx, int, int)); +static rtx save_fixed_argument_area (int, rtx, int *, int *); +static void restore_fixed_argument_area (rtx, rtx, int, int); #endif /* If WHICH is 1, return 1 if EXP contains a call to the built-in function @@ -206,9 +188,7 @@ static void restore_fixed_argument_area PARAMS ((rtx, rtx, int, int)); static tree calls_function_save_exprs; static int -calls_function (exp, which) - tree exp; - int which; +calls_function (tree exp, int which) { int val; @@ -221,9 +201,7 @@ calls_function (exp, which) /* Recursive function to do the work of above function. */ static int -calls_function_1 (exp, which) - tree exp; - int which; +calls_function_1 (tree exp, int which) { int i; enum tree_code code = TREE_CODE (exp); @@ -323,12 +301,8 @@ calls_function_1 (exp, which) CALL_INSN_FUNCTION_USAGE information. */ rtx -prepare_call_address (funexp, fndecl, call_fusage, reg_parm_seen, sibcallp) - rtx funexp; - tree fndecl; - rtx *call_fusage; - int reg_parm_seen; - int sibcallp; +prepare_call_address (rtx funexp, tree fndecl, rtx *call_fusage, + int reg_parm_seen, int sibcallp) { rtx static_chain_value = 0; @@ -409,21 +383,13 @@ prepare_call_address (funexp, fndecl, call_fusage, reg_parm_seen, sibcallp) denote registers used by the called function. */ static void -emit_call_1 (funexp, fndecl, funtype, stack_size, rounded_stack_size, - struct_value_size, next_arg_reg, valreg, old_inhibit_defer_pop, - call_fusage, ecf_flags, args_so_far) - rtx funexp; - tree fndecl ATTRIBUTE_UNUSED; - tree funtype ATTRIBUTE_UNUSED; - HOST_WIDE_INT stack_size ATTRIBUTE_UNUSED; - HOST_WIDE_INT rounded_stack_size; - HOST_WIDE_INT struct_value_size ATTRIBUTE_UNUSED; - rtx next_arg_reg ATTRIBUTE_UNUSED; - rtx valreg; - int old_inhibit_defer_pop; - rtx call_fusage; - int ecf_flags; - CUMULATIVE_ARGS *args_so_far ATTRIBUTE_UNUSED; +emit_call_1 (rtx funexp, tree fndecl, tree funtype, + HOST_WIDE_INT stack_size ATTRIBUTE_UNUSED, + HOST_WIDE_INT rounded_stack_size, + HOST_WIDE_INT struct_value_size ATTRIBUTE_UNUSED, + rtx next_arg_reg ATTRIBUTE_UNUSED, rtx valreg, + int old_inhibit_defer_pop, rtx call_fusage, int ecf_flags, + CUMULATIVE_ARGS *args_so_far ATTRIBUTE_UNUSED) { rtx rounded_stack_size_rtx = GEN_INT (rounded_stack_size); rtx call_insn; @@ -437,7 +403,7 @@ emit_call_1 (funexp, fndecl, funtype, stack_size, rounded_stack_size, #ifdef CALL_POPS_ARGS n_popped += CALL_POPS_ARGS (* args_so_far); #endif - + /* Ensure address is valid. SYMBOL_REF is already valid, so no need, and we don't want to load it into a register as an optimization, because prepare_call_address already did it if it should be done. */ @@ -643,9 +609,7 @@ emit_call_1 (funexp, fndecl, funtype, stack_size, rounded_stack_size, space from the stack such as alloca. */ static int -special_function_p (fndecl, flags) - tree fndecl; - int flags; +special_function_p (tree fndecl, int flags) { if (! (flags & ECF_MALLOC) && fndecl && DECL_NAME (fndecl) @@ -725,16 +689,14 @@ special_function_p (fndecl, flags) /* Return nonzero when tree represent call to longjmp. */ int -setjmp_call_p (fndecl) - tree fndecl; +setjmp_call_p (tree fndecl) { return special_function_p (fndecl, 0) & ECF_RETURNS_TWICE; } /* Return true when exp contains alloca call. */ bool -alloca_call_p (exp) - tree exp; +alloca_call_p (tree exp) { if (TREE_CODE (exp) == CALL_EXPR && TREE_CODE (TREE_OPERAND (exp, 0)) == ADDR_EXPR @@ -749,8 +711,7 @@ alloca_call_p (exp) /* Detect flags (function attributes) from the function decl or type node. */ int -flags_from_decl_or_type (exp) - tree exp; +flags_from_decl_or_type (tree exp) { int flags = 0; tree type = exp; @@ -805,10 +766,7 @@ flags_from_decl_or_type (exp) Set REG_PARM_SEEN if we encounter a register parameter. */ static void -precompute_register_parameters (num_actuals, args, reg_parm_seen) - int num_actuals; - struct arg_data *args; - int *reg_parm_seen; +precompute_register_parameters (int num_actuals, struct arg_data *args, int *reg_parm_seen) { int i; @@ -873,12 +831,7 @@ precompute_register_parameters (num_actuals, args, reg_parm_seen) parameters, we must save and restore it. */ static rtx -save_fixed_argument_area (reg_parm_stack_space, argblock, - low_to_save, high_to_save) - int reg_parm_stack_space; - rtx argblock; - int *low_to_save; - int *high_to_save; +save_fixed_argument_area (int reg_parm_stack_space, rtx argblock, int *low_to_save, int *high_to_save) { int low; int high; @@ -945,11 +898,7 @@ save_fixed_argument_area (reg_parm_stack_space, argblock, } static void -restore_fixed_argument_area (save_area, argblock, high_to_save, low_to_save) - rtx save_area; - rtx argblock; - int high_to_save; - int low_to_save; +restore_fixed_argument_area (rtx save_area, rtx argblock, int high_to_save, int low_to_save) { enum machine_mode save_mode = GET_MODE (save_area); int delta; @@ -984,9 +933,7 @@ restore_fixed_argument_area (save_area, argblock, high_to_save, low_to_save) the aligned_regs array if it is nonzero. */ static void -store_unaligned_arguments_into_pseudos (args, num_actuals) - struct arg_data *args; - int num_actuals; +store_unaligned_arguments_into_pseudos (struct arg_data *args, int num_actuals) { int i, j; @@ -1067,23 +1014,15 @@ store_unaligned_arguments_into_pseudos (args, num_actuals) flags which may may be modified by this routine. */ static void -initialize_argument_information (num_actuals, args, args_size, n_named_args, - actparms, fndecl, args_so_far, - reg_parm_stack_space, old_stack_level, - old_pending_adj, must_preallocate, - ecf_flags) - int num_actuals ATTRIBUTE_UNUSED; - struct arg_data *args; - struct args_size *args_size; - int n_named_args ATTRIBUTE_UNUSED; - tree actparms; - tree fndecl; - CUMULATIVE_ARGS *args_so_far; - int reg_parm_stack_space; - rtx *old_stack_level; - int *old_pending_adj; - int *must_preallocate; - int *ecf_flags; +initialize_argument_information (int num_actuals ATTRIBUTE_UNUSED, + struct arg_data *args, + struct args_size *args_size, + int n_named_args ATTRIBUTE_UNUSED, + tree actparms, tree fndecl, + CUMULATIVE_ARGS *args_so_far, + int reg_parm_stack_space, + rtx *old_stack_level, int *old_pending_adj, + int *must_preallocate, int *ecf_flags) { /* 1 if scanning parms front to back, -1 if scanning back to front. */ int inc; @@ -1324,11 +1263,9 @@ initialize_argument_information (num_actuals, args, args_size, n_named_args, for arguments passed in registers. */ static int -compute_argument_block_size (reg_parm_stack_space, args_size, - preferred_stack_boundary) - int reg_parm_stack_space; - struct args_size *args_size; - int preferred_stack_boundary ATTRIBUTE_UNUSED; +compute_argument_block_size (int reg_parm_stack_space, + struct args_size *args_size, + int preferred_stack_boundary ATTRIBUTE_UNUSED) { int unadjusted_args_size = args_size->constant; @@ -1411,10 +1348,7 @@ compute_argument_block_size (reg_parm_stack_space, args_size, precomputed argument. */ static void -precompute_arguments (flags, num_actuals, args) - int flags; - int num_actuals; - struct arg_data *args; +precompute_arguments (int flags, int num_actuals, struct arg_data *args) { int i; @@ -1482,11 +1416,7 @@ precompute_arguments (flags, num_actuals, args) compute and return the final value for MUST_PREALLOCATE. */ static int -finalize_must_preallocate (must_preallocate, num_actuals, args, args_size) - int must_preallocate; - int num_actuals; - struct arg_data *args; - struct args_size *args_size; +finalize_must_preallocate (int must_preallocate, int num_actuals, struct arg_data *args, struct args_size *args_size) { /* See if we have or want to preallocate stack space. @@ -1545,10 +1475,7 @@ finalize_must_preallocate (must_preallocate, num_actuals, args, args_size) ARGBLOCK is an rtx for the address of the outgoing arguments. */ static void -compute_argument_addresses (args, argblock, num_actuals) - struct arg_data *args; - rtx argblock; - int num_actuals; +compute_argument_addresses (struct arg_data *args, rtx argblock, int num_actuals) { if (argblock) { @@ -1609,9 +1536,7 @@ compute_argument_addresses (args, argblock, num_actuals) ADDR is the operand 0 of CALL_EXPR for this call. */ static rtx -rtx_for_function_call (fndecl, addr) - tree fndecl; - tree addr; +rtx_for_function_call (tree fndecl, tree addr) { rtx funexp; @@ -1645,20 +1570,15 @@ rtx_for_function_call (fndecl, addr) expressions were already evaluated. Mark all register-parms as living through the call, putting these USE - insns in the CALL_INSN_FUNCTION_USAGE field. - + insns in the CALL_INSN_FUNCTION_USAGE field. + When IS_SIBCALL, perform the check_sibcall_overlap_argument_overlap checking, setting *SIBCALL_FAILURE if appropriate. */ static void -load_register_parameters (args, num_actuals, call_fusage, flags, - is_sibcall, sibcall_failure) - struct arg_data *args; - int num_actuals; - rtx *call_fusage; - int flags; - int is_sibcall; - int *sibcall_failure; +load_register_parameters (struct arg_data *args, int num_actuals, + rtx *call_fusage, int flags, int is_sibcall, + int *sibcall_failure) { int i, j; @@ -1736,13 +1656,8 @@ load_register_parameters (args, num_actuals, call_fusage, flags, about the parameters. */ static rtx -try_to_integrate (fndecl, actparms, target, ignore, type, structure_value_addr) - tree fndecl; - tree actparms; - rtx target; - int ignore; - tree type; - rtx structure_value_addr; +try_to_integrate (tree fndecl, tree actparms, rtx target, int ignore, + tree type, rtx structure_value_addr) { rtx temp; rtx before_call; @@ -1864,12 +1779,9 @@ try_to_integrate (fndecl, actparms, target, ignore, type, structure_value_addr) be popped after the call. Returns the adjustment. */ static int -combine_pending_stack_adjustment_and_call (unadjusted_args_size, - args_size, - preferred_unit_stack_boundary) - int unadjusted_args_size; - struct args_size *args_size; - int preferred_unit_stack_boundary; +combine_pending_stack_adjustment_and_call (int unadjusted_args_size, + struct args_size *args_size, + int preferred_unit_stack_boundary) { /* The number of bytes to pop so that the stack will be under-aligned by UNADJUSTED_ARGS_SIZE bytes. */ @@ -1920,8 +1832,7 @@ combine_pending_stack_adjustment_and_call (unadjusted_args_size, zero otherwise. */ static int -check_sibcall_argument_overlap_1 (x) - rtx x; +check_sibcall_argument_overlap_1 (rtx x) { RTX_CODE code; int i, j; @@ -1984,10 +1895,7 @@ check_sibcall_argument_overlap_1 (x) slots, zero otherwise. */ static int -check_sibcall_argument_overlap (insn, arg, mark_stored_args_map) - rtx insn; - struct arg_data *arg; - int mark_stored_args_map; +check_sibcall_argument_overlap (rtx insn, struct arg_data *arg, int mark_stored_args_map) { int low, high; @@ -2016,8 +1924,7 @@ check_sibcall_argument_overlap (insn, arg, mark_stored_args_map) } static tree -fix_unsafe_tree (t) - tree t; +fix_unsafe_tree (tree t) { switch (unsafe_for_reeval (t)) { @@ -2051,10 +1958,7 @@ fix_unsafe_tree (t) If IGNORE is nonzero, then we ignore the value of the function call. */ rtx -expand_call (exp, target, ignore) - tree exp; - rtx target; - int ignore; +expand_call (tree exp, rtx target, int ignore) { /* Nonzero if we are currently expanding a call. */ static int currently_expanding_call = 0; @@ -2931,7 +2835,7 @@ expand_call (exp, target, ignore) break; } } - + compute_argument_addresses (args, argblock, num_actuals); /* If we push args individually in reverse order, perform stack alignment @@ -3385,13 +3289,13 @@ expand_call (exp, target, ignore) by at least the delay slot scheduling pass. We do this now instead of adding to call_fusage before the call to emit_call_1 because TARGET may be modified in the meantime. */ - if (structure_value_addr != 0 && target != 0 + if (structure_value_addr != 0 && target != 0 && GET_CODE (target) == MEM && RTX_UNCHANGING_P (target)) add_function_usage_to (last_call_insn (), gen_rtx_EXPR_LIST (VOIDmode, gen_rtx_CLOBBER (VOIDmode, target), NULL_RTX)); - + insns = get_insns (); end_sequence (); @@ -3572,14 +3476,9 @@ split_complex_types (tree types) parameters are documented in the emit_library_call function below. */ static rtx -emit_library_call_value_1 (retval, orgfun, value, fn_type, outmode, nargs, p) - int retval; - rtx orgfun; - rtx value; - enum libcall_type fn_type; - enum machine_mode outmode; - int nargs; - va_list p; +emit_library_call_value_1 (int retval, rtx orgfun, rtx value, + enum libcall_type fn_type, + enum machine_mode outmode, int nargs, va_list p) { /* Total size in bytes of all the stack-parms scanned so far. */ struct args_size args_size; @@ -3799,7 +3698,7 @@ emit_library_call_value_1 (retval, orgfun, value, fn_type, outmode, nargs, p) { rtx slot; int must_copy = 1 -#ifdef FUNCTION_ARG_CALLEE_COPIES +#ifdef FUNCTION_ARG_CALLEE_COPIES && ! FUNCTION_ARG_CALLEE_COPIES (args_so_far, mode, NULL_TREE, 1) #endif @@ -4298,7 +4197,7 @@ emit_library_call (rtx orgfun, enum libcall_type fn_type, enum machine_mode outmode, int nargs, ...) { va_list p; - + va_start (p, nargs); emit_library_call_value_1 (0, orgfun, NULL_RTX, fn_type, outmode, nargs, p); va_end (p); @@ -4319,7 +4218,7 @@ emit_library_call_value (rtx orgfun, rtx value, { rtx result; va_list p; - + va_start (p, nargs); result = emit_library_call_value_1 (1, orgfun, value, fn_type, outmode, nargs, p); @@ -4348,12 +4247,8 @@ emit_library_call_value (rtx orgfun, rtx value, zero otherwise. */ static int -store_one_arg (arg, argblock, flags, variable_size, reg_parm_stack_space) - struct arg_data *arg; - rtx argblock; - int flags; - int variable_size ATTRIBUTE_UNUSED; - int reg_parm_stack_space; +store_one_arg (struct arg_data *arg, rtx argblock, int flags, + int variable_size ATTRIBUTE_UNUSED, int reg_parm_stack_space) { tree pval = arg->tree_value; rtx reg = 0; @@ -4533,7 +4428,7 @@ store_one_arg (arg, argblock, flags, variable_size, reg_parm_stack_space) /* This isn't already where we want it on the stack, so put it there. This can either be done with push or copy insns. */ - emit_push_insn (arg->value, arg->mode, TREE_TYPE (pval), NULL_RTX, + emit_push_insn (arg->value, arg->mode, TREE_TYPE (pval), NULL_RTX, PARM_BOUNDARY, partial, reg, used - size, argblock, ARGS_SIZE_RTX (arg->locate.offset), reg_parm_stack_space, ARGS_SIZE_RTX (arg->locate.alignment_pad)); @@ -4682,9 +4577,7 @@ store_one_arg (arg, argblock, flags, variable_size, reg_parm_stack_space) For a little-endian machine, the reverse is true. */ bool -default_must_pass_in_stack (mode, type) - enum machine_mode mode; - tree type; +default_must_pass_in_stack (enum machine_mode mode, tree type) { if (!type) return false; |