]> git.ipfire.org Git - thirdparty/gcc.git/blobdiff - gcc/builtins.h
Update copyright years.
[thirdparty/gcc.git] / gcc / builtins.h
index b00af6272233d9b686e8e87dfaf86ed14e71d02a..8d93f75a9a4ea3518f37c0dded424c6b77c449ee 100644 (file)
@@ -1,5 +1,5 @@
 /* Expand builtin functions.
-   Copyright (C) 1988-2020 Free Software Foundation, Inc.
+   Copyright (C) 1988-2024 Free Software Foundation, Inc.
 
 This file is part of GCC.
 
@@ -37,6 +37,13 @@ struct target_builtins {
      register windows, this gives only the outbound registers.
      INCOMING_REGNO gives the corresponding inbound register.  */
   fixed_size_mode_pod x_apply_result_mode[FIRST_PSEUDO_REGISTER];
+
+  /* Nonzero iff the arrays above have been initialized.  The _plus_one suffix
+     is for zero initialization to make it an unreasonable size, used to signal
+     that the size and the corresponding mode array has not been
+     initialized.  */
+  int x_apply_args_size_plus_one;
+  int x_apply_result_size_plus_one;
 };
 
 extern struct target_builtins default_target_builtins;
@@ -52,6 +59,8 @@ extern bool force_folding_builtin_constant_p;
 extern bool called_as_built_in (tree);
 extern bool get_object_alignment_1 (tree, unsigned int *,
                                    unsigned HOST_WIDE_INT *);
+extern bool get_object_alignment_2 (tree, unsigned int *,
+                                   unsigned HOST_WIDE_INT *, bool);
 extern unsigned int get_object_alignment (tree);
 extern bool get_pointer_alignment_1 (tree, unsigned int *,
                                     unsigned HOST_WIDE_INT *);
@@ -103,15 +112,18 @@ struct c_strlen_data
 };
 
 extern tree c_strlen (tree, int, c_strlen_data * = NULL, unsigned = 1);
-extern rtx c_readstr (const char *, scalar_int_mode, bool = true);
+extern rtx c_readstr (const char *, fixed_size_mode, bool = true);
 extern void expand_builtin_setjmp_setup (rtx, rtx);
 extern void expand_builtin_setjmp_receiver (rtx);
 extern void expand_builtin_update_setjmp_buf (rtx);
 extern tree mathfn_built_in (tree, enum built_in_function fn);
 extern tree mathfn_built_in (tree, combined_fn);
 extern tree mathfn_built_in_type (combined_fn);
-extern rtx builtin_strncpy_read_str (void *, HOST_WIDE_INT, scalar_int_mode);
-extern rtx builtin_memset_read_str (void *, HOST_WIDE_INT, scalar_int_mode);
+extern rtx builtin_strncpy_read_str (void *, void *, HOST_WIDE_INT,
+                                    fixed_size_mode);
+extern rtx builtin_memset_read_str (void *, void *, HOST_WIDE_INT,
+                                   fixed_size_mode);
+extern rtx expand_builtin_memset (tree, rtx, machine_mode);
 extern rtx expand_builtin_saveregs (void);
 extern tree std_build_builtin_va_list (void);
 extern tree std_fn_abi_va_list (tree);
@@ -120,6 +132,7 @@ extern void std_expand_builtin_va_start (tree, rtx);
 extern void expand_builtin_trap (void);
 extern void expand_ifn_atomic_bit_test_and (gcall *);
 extern void expand_ifn_atomic_compare_exchange (gcall *);
+extern void expand_ifn_atomic_op_fetch_cmp_0 (gcall *);
 extern rtx expand_builtin (tree, rtx, rtx, machine_mode, int);
 extern enum built_in_function builtin_mathfn_code (const_tree);
 extern tree fold_builtin_expect (location_t, tree, tree, tree, tree);
@@ -128,6 +141,7 @@ extern tree fold_call_expr (location_t, tree, bool);
 extern tree fold_builtin_call_array (location_t, tree, tree, int, tree *);
 extern bool validate_gimple_arglist (const gcall *, ...);
 extern rtx default_expand_builtin (tree, rtx, rtx, machine_mode, int);
+extern void maybe_emit_call_builtin___clear_cache (rtx, rtx);
 extern bool fold_builtin_next_arg (tree, bool);
 extern tree do_mpc_arg2 (tree, tree, tree, int, int (*)(mpc_ptr, mpc_srcptr, mpc_srcptr, mpc_rnd_t));
 extern tree fold_call_stmt (gcall *, bool);
@@ -142,163 +156,13 @@ extern char target_percent_s[3];
 extern char target_percent_c[3];
 extern char target_percent_s_newline[4];
 extern bool target_char_cst_p (tree t, char *p);
+extern rtx get_memory_rtx (tree exp, tree len);
 
+extern internal_fn associated_internal_fn (combined_fn, tree);
 extern internal_fn associated_internal_fn (tree);
 extern internal_fn replacement_internal_fn (gcall *);
 
-extern bool check_nul_terminated_array (tree, tree, tree = NULL_TREE);
-extern void warn_string_no_nul (location_t, tree, const char *, tree,
-                               tree, tree = NULL_TREE, bool = false,
-                               const wide_int[2] = NULL);
-extern tree unterminated_array (tree, tree * = NULL, bool * = NULL);
 extern bool builtin_with_linkage_p (tree);
-
-/* Describes recursion limits used by functions that follow use-def
-   chains of SSA_NAMEs.  */
-
-class ssa_name_limit_t
-{
-  bitmap visited;         /* Bitmap of visited SSA_NAMEs.  */
-  unsigned ssa_def_max;   /* Longest chain of SSA_NAMEs to follow.  */
-
-  /* Not copyable or assignable.  */
-  DISABLE_COPY_AND_ASSIGN (ssa_name_limit_t);
-
-public:
-
-  ssa_name_limit_t ()
-    : visited (),
-      ssa_def_max (param_ssa_name_def_chain_limit) { }
-
-  /* Set a bit for the PHI in VISITED and return true if it wasn't
-     already set.  */
-  bool visit_phi (tree);
-  /* Clear a bit for the PHI in VISITED.  */
-  void leave_phi (tree);
-  /* Return false if the SSA_NAME chain length counter has reached
-     the limit, otherwise increment the counter and return true.  */
-  bool next ();
-
-  /* If the SSA_NAME has already been "seen" return a positive value.
-     Otherwise add it to VISITED.  If the SSA_NAME limit has been
-     reached, return a negative value.  Otherwise return zero.  */
-  int next_phi (tree);
-
-  ~ssa_name_limit_t ();
-};
-
-class range_query;
-
-/* Describes a reference to an object used in an access.  */
-struct access_ref
-{
-  /* Set the bounds of the reference to at most as many bytes
-     as the first argument or unknown when null, and at least
-     one when the second argument is true unless the first one
-     is a constant zero.  */
-  access_ref (tree = NULL_TREE, bool = false);
-
-  /* Return the PHI node REF refers to or null if it doesn't.  */
-  gphi *phi () const;
-
-  /* Return the object to which REF refers.  */
-  tree get_ref (vec<access_ref> *, access_ref * = NULL, int = 1,
-               ssa_name_limit_t * = NULL, range_query * = NULL) const;
-
-  /* Return true if OFFRNG is the constant zero.  */
-  bool offset_zero () const
-  {
-    return offrng[0] == 0 && offrng[1] == 0;
-  }
-
-  /* Return true if OFFRNG is bounded to a subrange of offset values
-     valid for the largest possible object.  */
-  bool offset_bounded () const;
-
-  /* Return the maximum amount of space remaining and if non-null, set
-     argument to the minimum.  */
-  offset_int size_remaining (offset_int * = NULL) const;
-
-  /* Set the size range to the maximum.  */
-  void set_max_size_range ()
-  {
-    sizrng[0] = 0;
-    sizrng[1] = wi::to_offset (max_object_size ());
-  }
-
-  /* Add OFF to the offset range.  */
-  void add_offset (const offset_int &off)
-  {
-    add_offset (off, off);
-  }
-
-  /* Add the range [MIN, MAX] to the offset range.  */
-  void add_offset (const offset_int &, const offset_int &);
-
-  /* Add the maximum representable offset to the offset range.  */
-  void add_max_offset ()
-  {
-    offset_int maxoff = wi::to_offset (TYPE_MAX_VALUE (ptrdiff_type_node));
-    add_offset (-maxoff - 1, maxoff);
-  }
-
-  /* Issue an informational message describing the target of an access
-     with the given mode.  */
-  void inform_access (access_mode) const;
-
-  /* Reference to the accessed object(s).  */
-  tree ref;
-
-  /* Range of byte offsets into and sizes of the object(s).  */
-  offset_int offrng[2];
-  offset_int sizrng[2];
-  /* Range of the bound of the access: denotes that the access
-     is at least BNDRNG[0] bytes but no more than BNDRNG[1].
-     For string functions the size of the actual access is
-     further constrained by the length of the string.  */
-  offset_int bndrng[2];
-
-  /* Used to fold integer expressions when called from front ends.  */
-  tree (*eval)(tree);
-  /* Set if trailing one-element arrays should be treated as flexible
-     array members.  */
-  bool trail1special;
-  /* Set if valid offsets must start at zero (for declared and allocated
-     objects but not for others referenced by pointers).  */
-  bool base0;
-  /* Set if REF refers to a function array parameter not declared
-     static.  */
-  bool parmarray;
-};
-
-/* Describes a pair of references used in an access by built-in
-   functions like memcpy.  */
-struct access_data
-{
-  /* Set the access to at most MAXWRITE and MAXREAD bytes, and
-     at least 1 when MINWRITE or MINREAD, respectively, is set.  */
-  access_data (tree expr, access_mode mode,
-              tree maxwrite = NULL_TREE, bool minwrite = false,
-              tree maxread = NULL_TREE, bool minread = false)
-    : call (expr),
-      dst (maxwrite, minwrite), src (maxread, minread), mode (mode) { }
-
-  /* Built-in function call.  */
-  tree call;
-  /* Destination and source of the access.  */
-  access_ref dst, src;
-  /* Read-only for functions like memcmp or strlen, write-only
-     for memset, read-write for memcpy or strcat.  */
-  access_mode mode;
-};
-
-extern tree gimple_call_alloc_size (gimple *, wide_int[2] = NULL,
-                                   range_query * = NULL);
-extern tree gimple_parm_array_size (tree, wide_int[2], bool * = NULL);
-extern tree compute_objsize (tree, int, access_ref *, range_query * = NULL);
-extern tree compute_objsize (tree, int, tree * = NULL, tree * = NULL,
-                            range_query * = NULL);
-extern bool check_access (tree, tree, tree, tree, tree,
-                         access_mode, const access_data * = NULL);
+extern int type_to_class (tree);
 
 #endif /* GCC_BUILTINS_H */