aboutsummaryrefslogtreecommitdiff
path: root/gcc/builtins.h
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@golang.org>2021-09-13 10:37:49 -0700
committerIan Lance Taylor <iant@golang.org>2021-09-13 10:37:49 -0700
commite252b51ccde010cbd2a146485d8045103cd99533 (patch)
treee060f101cdc32bf5e520de8e5275db9d4236b74c /gcc/builtins.h
parentf10c7c4596dda99d2ee872c995ae4aeda65adbdf (diff)
parent104c05c5284b7822d770ee51a7d91946c7e56d50 (diff)
downloadgcc-e252b51ccde010cbd2a146485d8045103cd99533.zip
gcc-e252b51ccde010cbd2a146485d8045103cd99533.tar.gz
gcc-e252b51ccde010cbd2a146485d8045103cd99533.tar.bz2
Merge from trunk revision 104c05c5284b7822d770ee51a7d91946c7e56d50.
Diffstat (limited to 'gcc/builtins.h')
-rw-r--r--gcc/builtins.h219
1 files changed, 5 insertions, 214 deletions
diff --git a/gcc/builtins.h b/gcc/builtins.h
index 307a20f..d330b78 100644
--- a/gcc/builtins.h
+++ b/gcc/builtins.h
@@ -110,8 +110,11 @@ 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);
@@ -147,218 +150,6 @@ extern bool target_char_cst_p (tree t, char *p);
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 pointer_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, pointer_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;
-
- /* Return true if *THIS is an access to a declared object. */
- bool ref_declared () const
- {
- return DECL_P (ref) && base0 && deref < 1;
- }
-
- /* 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);
- /* Positive when REF is dereferenced, negative when its address is
- taken. */
- int deref;
- /* 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;
-};
-
-class range_query;
-
-/* Queries and caches compute_objsize results. */
-class pointer_query
-{
- DISABLE_COPY_AND_ASSIGN (pointer_query);
-
-public:
- /* Type of the two-level cache object defined by clients of the class
- to have pointer SSA_NAMEs cached for speedy access. */
- struct cache_type
- {
- /* 1-based indices into cache. */
- vec<unsigned> indices;
- /* The cache itself. */
- vec<access_ref> access_refs;
- };
-
- /* Construct an object with the given Ranger instance and cache. */
- explicit pointer_query (range_query * = NULL, cache_type * = NULL);
-
- /* Retrieve the access_ref for a variable from cache if it's there. */
- const access_ref* get_ref (tree, int = 1) const;
-
- /* Retrieve the access_ref for a variable from cache or compute it. */
- bool get_ref (tree, access_ref*, int = 1);
-
- /* Add an access_ref for the SSA_NAME to the cache. */
- void put_ref (tree, const access_ref&, int = 1);
-
- /* Flush the cache. */
- void flush_cache ();
-
- /* A Ranger instance. May be null to use global ranges. */
- range_query *rvals;
- /* Cache of SSA_NAMEs. May be null to disable caching. */
- cache_type *var_cache;
-
- /* Cache performance counters. */
- mutable unsigned hits;
- mutable unsigned misses;
- mutable unsigned failures;
- mutable unsigned depth;
- mutable unsigned max_depth;
-};
-
-/* 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);
-/* Legacy/transitional API. Should not be used in new code. */
-extern tree compute_objsize (tree, int, access_ref *, pointer_query *);
-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 void maybe_emit_free_warning (tree);
-
#endif /* GCC_BUILTINS_H */