diff options
author | Ian Lance Taylor <iant@golang.org> | 2021-09-13 10:37:49 -0700 |
---|---|---|
committer | Ian Lance Taylor <iant@golang.org> | 2021-09-13 10:37:49 -0700 |
commit | e252b51ccde010cbd2a146485d8045103cd99533 (patch) | |
tree | e060f101cdc32bf5e520de8e5275db9d4236b74c /gcc/builtins.h | |
parent | f10c7c4596dda99d2ee872c995ae4aeda65adbdf (diff) | |
parent | 104c05c5284b7822d770ee51a7d91946c7e56d50 (diff) | |
download | gcc-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.h | 219 |
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 */ |