(root)/
gcc-13.2.0/
gcc/
builtins.h
       1  /* Expand builtin functions.
       2     Copyright (C) 1988-2023 Free Software Foundation, Inc.
       3  
       4  This file is part of GCC.
       5  
       6  GCC is free software; you can redistribute it and/or modify it under
       7  the terms of the GNU General Public License as published by the Free
       8  Software Foundation; either version 3, or (at your option) any later
       9  version.
      10  
      11  GCC is distributed in the hope that it will be useful, but WITHOUT ANY
      12  WARRANTY; without even the implied warranty of MERCHANTABILITY or
      13  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
      14  for more details.
      15  
      16  You should have received a copy of the GNU General Public License
      17  along with GCC; see the file COPYING3.  If not see
      18  <http://www.gnu.org/licenses/>.  */
      19  
      20  #ifndef GCC_BUILTINS_H
      21  #define GCC_BUILTINS_H
      22  
      23  #include <mpc.h>
      24  
      25  /* Target-dependent globals.  */
      26  struct target_builtins {
      27    /* For each register that may be used for calling a function, this
      28       gives a mode used to copy the register's value.  VOIDmode indicates
      29       the register is not used for calling a function.  If the machine
      30       has register windows, this gives only the outbound registers.
      31       INCOMING_REGNO gives the corresponding inbound register.  */
      32    fixed_size_mode_pod x_apply_args_mode[FIRST_PSEUDO_REGISTER];
      33  
      34    /* For each register that may be used for returning values, this gives
      35       a mode used to copy the register's value.  VOIDmode indicates the
      36       register is not used for returning values.  If the machine has
      37       register windows, this gives only the outbound registers.
      38       INCOMING_REGNO gives the corresponding inbound register.  */
      39    fixed_size_mode_pod x_apply_result_mode[FIRST_PSEUDO_REGISTER];
      40  };
      41  
      42  extern struct target_builtins default_target_builtins;
      43  #if SWITCHABLE_TARGET
      44  extern struct target_builtins *this_target_builtins;
      45  #else
      46  #define this_target_builtins (&default_target_builtins)
      47  #endif
      48  
      49  /* Non-zero if __builtin_constant_p should be folded right away.  */
      50  extern bool force_folding_builtin_constant_p;
      51  
      52  extern bool called_as_built_in (tree);
      53  extern bool get_object_alignment_1 (tree, unsigned int *,
      54  				    unsigned HOST_WIDE_INT *);
      55  extern bool get_object_alignment_2 (tree, unsigned int *,
      56  				    unsigned HOST_WIDE_INT *, bool);
      57  extern unsigned int get_object_alignment (tree);
      58  extern bool get_pointer_alignment_1 (tree, unsigned int *,
      59  				     unsigned HOST_WIDE_INT *);
      60  extern unsigned int get_pointer_alignment (tree);
      61  extern unsigned string_length (const void*, unsigned, unsigned);
      62  
      63  struct c_strlen_data
      64  {
      65    /* [MINLEN, MAXBOUND, MAXLEN] is a range describing the length of
      66       one or more strings of possibly unknown length.  For a single
      67       string of known length the range is a constant where
      68       MINLEN == MAXBOUND == MAXLEN holds.
      69       For other strings, MINLEN is the length of the shortest known
      70       string.  MAXBOUND is the length of a string that could be stored
      71       in the largest array referenced by the expression.  MAXLEN is
      72       the length of the longest sequence of non-zero bytes
      73       in an object referenced by the expression.  For such strings,
      74       MINLEN <= MAXBOUND <= MAXLEN holds.  For example, given:
      75         struct A { char a[7], b[]; };
      76         extern struct A *p;
      77         n = strlen (p->a);
      78       the computed range will be [0, 6, ALL_ONES].
      79       However, for a conditional expression involving a string
      80       of known length and an array of unknown bound such as
      81         n = strlen (i ? p->b : "123");
      82       the range will be [3, 3, ALL_ONES].
      83       MINLEN != 0 && MAXLEN == ALL_ONES indicates that MINLEN is
      84       the length of the shortest known string and implies that
      85       the shortest possible string referenced by the expression may
      86       actually be the empty string.  This distinction is useful for
      87       diagnostics.  get_range_strlen() return value distinguishes
      88       between these two cases.
      89       As the tighter (and more optimistic) bound, MAXBOUND is suitable
      90       for diagnostics but not for optimization.
      91       As the more conservative bound, MAXLEN is intended to be used
      92       for optimization.  */
      93    tree minlen;
      94    tree maxlen;
      95    tree maxbound;
      96    /* When non-null, DECL refers to the declaration known to store
      97       an unterminated constant character array, as in:
      98       const char s[] = { 'a', 'b', 'c' };
      99       It is used to diagnose uses of such arrays in functions such as
     100       strlen() that expect a nul-terminated string as an argument.  */
     101    tree decl;
     102    /* Non-constant offset from the beginning of a string not accounted
     103       for in the length range.  Used to improve diagnostics.  */
     104    tree off;
     105  };
     106  
     107  extern tree c_strlen (tree, int, c_strlen_data * = NULL, unsigned = 1);
     108  extern rtx c_readstr (const char *, scalar_int_mode, bool = true);
     109  extern void expand_builtin_setjmp_setup (rtx, rtx);
     110  extern void expand_builtin_setjmp_receiver (rtx);
     111  extern void expand_builtin_update_setjmp_buf (rtx);
     112  extern tree mathfn_built_in (tree, enum built_in_function fn);
     113  extern tree mathfn_built_in (tree, combined_fn);
     114  extern tree mathfn_built_in_type (combined_fn);
     115  extern rtx builtin_strncpy_read_str (void *, void *, HOST_WIDE_INT,
     116  				     fixed_size_mode);
     117  extern rtx builtin_memset_read_str (void *, void *, HOST_WIDE_INT,
     118  				    fixed_size_mode);
     119  extern rtx expand_builtin_memset (tree, rtx, machine_mode);
     120  extern rtx expand_builtin_saveregs (void);
     121  extern tree std_build_builtin_va_list (void);
     122  extern tree std_fn_abi_va_list (tree);
     123  extern tree std_canonical_va_list_type (tree);
     124  extern void std_expand_builtin_va_start (tree, rtx);
     125  extern void expand_builtin_trap (void);
     126  extern void expand_ifn_atomic_bit_test_and (gcall *);
     127  extern void expand_ifn_atomic_compare_exchange (gcall *);
     128  extern void expand_ifn_atomic_op_fetch_cmp_0 (gcall *);
     129  extern rtx expand_builtin (tree, rtx, rtx, machine_mode, int);
     130  extern enum built_in_function builtin_mathfn_code (const_tree);
     131  extern tree fold_builtin_expect (location_t, tree, tree, tree, tree);
     132  extern bool avoid_folding_inline_builtin (tree);
     133  extern tree fold_call_expr (location_t, tree, bool);
     134  extern tree fold_builtin_call_array (location_t, tree, tree, int, tree *);
     135  extern bool validate_gimple_arglist (const gcall *, ...);
     136  extern rtx default_expand_builtin (tree, rtx, rtx, machine_mode, int);
     137  extern void maybe_emit_call_builtin___clear_cache (rtx, rtx);
     138  extern bool fold_builtin_next_arg (tree, bool);
     139  extern tree do_mpc_arg2 (tree, tree, tree, int, int (*)(mpc_ptr, mpc_srcptr, mpc_srcptr, mpc_rnd_t));
     140  extern tree fold_call_stmt (gcall *, bool);
     141  extern void set_builtin_user_assembler_name (tree decl, const char *asmspec);
     142  extern bool is_simple_builtin (tree);
     143  extern bool is_inexpensive_builtin (tree);
     144  extern bool readonly_data_expr (tree exp);
     145  extern bool init_target_chars (void);
     146  extern unsigned HOST_WIDE_INT target_newline;
     147  extern unsigned HOST_WIDE_INT target_percent;
     148  extern char target_percent_s[3];
     149  extern char target_percent_c[3];
     150  extern char target_percent_s_newline[4];
     151  extern bool target_char_cst_p (tree t, char *p);
     152  extern rtx get_memory_rtx (tree exp, tree len);
     153  
     154  extern internal_fn associated_internal_fn (combined_fn, tree);
     155  extern internal_fn associated_internal_fn (tree);
     156  extern internal_fn replacement_internal_fn (gcall *);
     157  
     158  extern bool builtin_with_linkage_p (tree);
     159  
     160  #endif /* GCC_BUILTINS_H */