xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/calls.h (revision 8feb0f0b7eaff0608f8350bbfa3098827b4bb91b)
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