11debfc3dSmrg /* Declarations and data types for RTL call insn generation. 2*8feb0f0bSmrg Copyright (C) 2013-2020 Free Software Foundation, Inc. 31debfc3dSmrg 41debfc3dSmrg This file is part of GCC. 51debfc3dSmrg 61debfc3dSmrg GCC is free software; you can redistribute it and/or modify it under 71debfc3dSmrg the terms of the GNU General Public License as published by the Free 81debfc3dSmrg Software Foundation; either version 3, or (at your option) any later 91debfc3dSmrg version. 101debfc3dSmrg 111debfc3dSmrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY 121debfc3dSmrg WARRANTY; without even the implied warranty of MERCHANTABILITY or 131debfc3dSmrg FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 141debfc3dSmrg for more details. 151debfc3dSmrg 161debfc3dSmrg You should have received a copy of the GNU General Public License 171debfc3dSmrg along with GCC; see the file COPYING3. If not see 181debfc3dSmrg <http://www.gnu.org/licenses/>. */ 191debfc3dSmrg 201debfc3dSmrg #ifndef GCC_CALLS_H 211debfc3dSmrg #define GCC_CALLS_H 221debfc3dSmrg 23*8feb0f0bSmrg /* Describes a function argument. 24*8feb0f0bSmrg 25*8feb0f0bSmrg Each argument conceptually has a gimple-level type. Usually this type 26*8feb0f0bSmrg is available directly as a tree via the TYPE field, but when calling 27*8feb0f0bSmrg libgcc support functions it might instead be inferred from a mode, 28*8feb0f0bSmrg in which case the type isn't available directly. 29*8feb0f0bSmrg 30*8feb0f0bSmrg This gimple-level type might go through promotion before being passed to 31*8feb0f0bSmrg the target function. Depending on the context, the MODE field is either 32*8feb0f0bSmrg the mode of the gimple-level type (whether explicitly given or not) 33*8feb0f0bSmrg or the mode after promotion has been performed. */ 34*8feb0f0bSmrg class function_arg_info 35*8feb0f0bSmrg { 36*8feb0f0bSmrg public: function_arg_info()37*8feb0f0bSmrg function_arg_info () 38*8feb0f0bSmrg : type (NULL_TREE), mode (VOIDmode), named (false), 39*8feb0f0bSmrg pass_by_reference (false) 40*8feb0f0bSmrg {} 41*8feb0f0bSmrg 42*8feb0f0bSmrg /* Initialize an argument of mode MODE, either before or after promotion. */ function_arg_info(machine_mode mode,bool named)43*8feb0f0bSmrg function_arg_info (machine_mode mode, bool named) 44*8feb0f0bSmrg : type (NULL_TREE), mode (mode), named (named), pass_by_reference (false) 45*8feb0f0bSmrg {} 46*8feb0f0bSmrg 47*8feb0f0bSmrg /* Initialize an unpromoted argument of type TYPE. */ function_arg_info(tree type,bool named)48*8feb0f0bSmrg function_arg_info (tree type, bool named) 49*8feb0f0bSmrg : type (type), mode (TYPE_MODE (type)), named (named), 50*8feb0f0bSmrg pass_by_reference (false) 51*8feb0f0bSmrg {} 52*8feb0f0bSmrg 53*8feb0f0bSmrg /* Initialize an argument with explicit properties. */ function_arg_info(tree type,machine_mode mode,bool named)54*8feb0f0bSmrg function_arg_info (tree type, machine_mode mode, bool named) 55*8feb0f0bSmrg : type (type), mode (mode), named (named), pass_by_reference (false) 56*8feb0f0bSmrg {} 57*8feb0f0bSmrg 58*8feb0f0bSmrg /* Return true if the gimple-level type is an aggregate. */ aggregate_type_p()59*8feb0f0bSmrg bool aggregate_type_p () const { return type && AGGREGATE_TYPE_P (type); } 60*8feb0f0bSmrg 61*8feb0f0bSmrg /* Return the size of the gimple-level type, or -1 if the size is 62*8feb0f0bSmrg variable or otherwise not representable as a poly_int64. 63*8feb0f0bSmrg 64*8feb0f0bSmrg Use this function when MODE is the mode of the type before promotion, 65*8feb0f0bSmrg or in any context if the target never promotes function arguments. */ type_size_in_bytes()66*8feb0f0bSmrg poly_int64 type_size_in_bytes () const 67*8feb0f0bSmrg { 68*8feb0f0bSmrg if (type) 69*8feb0f0bSmrg return int_size_in_bytes (type); 70*8feb0f0bSmrg return GET_MODE_SIZE (mode); 71*8feb0f0bSmrg } 72*8feb0f0bSmrg 73*8feb0f0bSmrg /* Return the size of the argument after promotion, or -1 if the size 74*8feb0f0bSmrg is variable or otherwise not representable as a poly_int64. 75*8feb0f0bSmrg 76*8feb0f0bSmrg Use this function when MODE is the mode of the type after promotion. */ promoted_size_in_bytes()77*8feb0f0bSmrg poly_int64 promoted_size_in_bytes () const 78*8feb0f0bSmrg { 79*8feb0f0bSmrg if (mode == BLKmode) 80*8feb0f0bSmrg return int_size_in_bytes (type); 81*8feb0f0bSmrg return GET_MODE_SIZE (mode); 82*8feb0f0bSmrg } 83*8feb0f0bSmrg 84*8feb0f0bSmrg /* True if the argument represents the end of the argument list, 85*8feb0f0bSmrg as returned by end_marker (). */ end_marker_p()86*8feb0f0bSmrg bool end_marker_p () const { return mode == VOIDmode; } 87*8feb0f0bSmrg 88*8feb0f0bSmrg /* Return a function_arg_info that represents the end of the 89*8feb0f0bSmrg argument list. */ end_marker()90*8feb0f0bSmrg static function_arg_info end_marker () 91*8feb0f0bSmrg { 92*8feb0f0bSmrg return function_arg_info (void_type_node, /*named=*/true); 93*8feb0f0bSmrg } 94*8feb0f0bSmrg 95*8feb0f0bSmrg /* The type of the argument, or null if not known (which is true for 96*8feb0f0bSmrg libgcc support functions). */ 97*8feb0f0bSmrg tree type; 98*8feb0f0bSmrg 99*8feb0f0bSmrg /* The mode of the argument. Depending on context, this might be 100*8feb0f0bSmrg the mode of the argument type or the mode after promotion. */ 101*8feb0f0bSmrg machine_mode mode; 102*8feb0f0bSmrg 103*8feb0f0bSmrg /* True if the argument is treated as a named argument, false if it is 104*8feb0f0bSmrg treated as an unnamed variadic argument (i.e. one passed through 105*8feb0f0bSmrg "..."). See also TARGET_STRICT_ARGUMENT_NAMING. */ 106*8feb0f0bSmrg unsigned int named : 1; 107*8feb0f0bSmrg 108*8feb0f0bSmrg /* True if we have decided to pass the argument by reference, in which case 109*8feb0f0bSmrg the function_arg_info describes a pointer to the original argument. */ 110*8feb0f0bSmrg unsigned int pass_by_reference : 1; 111*8feb0f0bSmrg }; 112*8feb0f0bSmrg 1131debfc3dSmrg extern int flags_from_decl_or_type (const_tree); 1141debfc3dSmrg extern int call_expr_flags (const_tree); 1151debfc3dSmrg extern int setjmp_call_p (const_tree); 1161debfc3dSmrg extern bool gimple_maybe_alloca_call_p (const gimple *); 1171debfc3dSmrg extern bool gimple_alloca_call_p (const gimple *); 1181debfc3dSmrg extern bool alloca_call_p (const_tree); 119*8feb0f0bSmrg extern bool must_pass_in_stack_var_size (const function_arg_info &); 120*8feb0f0bSmrg extern bool must_pass_in_stack_var_size_or_pad (const function_arg_info &); 121*8feb0f0bSmrg extern bool must_pass_va_arg_in_stack (tree); 1221debfc3dSmrg extern rtx prepare_call_address (tree, rtx, rtx, rtx *, int, int); 1231debfc3dSmrg extern bool shift_return_value (machine_mode, bool, rtx); 1241debfc3dSmrg extern rtx expand_call (tree, rtx, int); 1251debfc3dSmrg extern void fixup_tail_calls (void); 1261debfc3dSmrg 127*8feb0f0bSmrg extern bool pass_by_reference (CUMULATIVE_ARGS *, function_arg_info); 128*8feb0f0bSmrg extern bool pass_va_arg_by_reference (tree); 129*8feb0f0bSmrg extern bool apply_pass_by_reference_rules (CUMULATIVE_ARGS *, 130*8feb0f0bSmrg function_arg_info &); 131*8feb0f0bSmrg extern bool reference_callee_copied (CUMULATIVE_ARGS *, 132*8feb0f0bSmrg const function_arg_info &); 1331debfc3dSmrg extern void maybe_warn_alloc_args_overflow (tree, tree, tree[2], int[2]); 134a2dc1f3fSmrg extern tree get_attr_nonstring_decl (tree, tree * = NULL); 135a2dc1f3fSmrg extern void maybe_warn_nonstring_arg (tree, tree); 136a2dc1f3fSmrg extern bool get_size_range (tree, tree[2], bool = false); 137a2dc1f3fSmrg extern rtx rtx_for_static_chain (const_tree, bool); 138*8feb0f0bSmrg extern bool cxx17_empty_base_field_p (const_tree); 1391debfc3dSmrg 1401debfc3dSmrg #endif // GCC_CALLS_H 141