mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-09 17:31:09 +08:00
calls.c: refactor special_function_p for use by analyzer (v2)
This patch refactors some code in special_function_p that checks for the function being sane to match by name, splitting it out into a new maybe_special_function_p, and using it it two places in the analyzer. gcc/analyzer/ChangeLog: * analyzer.cc (is_named_call_p): Replace tests for fndecl being extern at file scope and having a non-NULL DECL_NAME with a call to maybe_special_function_p. * function-set.cc (function_set::contains_decl_p): Add call to maybe_special_function_p. gcc/ChangeLog: * calls.c (special_function_p): Split out the check for DECL_NAME being non-NULL and fndecl being extern at file scope into a new maybe_special_function_p and call it. Drop check for fndecl being non-NULL that was after a usage of DECL_NAME (fndecl). * tree.h (maybe_special_function_p): New inline function.
This commit is contained in:
parent
45eb3e4944
commit
182ce042e7
@ -1,3 +1,11 @@
|
||||
2020-01-31 David Malcolm <dmalcolm@redhat.com>
|
||||
|
||||
* calls.c (special_function_p): Split out the check for DECL_NAME
|
||||
being non-NULL and fndecl being extern at file scope into a
|
||||
new maybe_special_function_p and call it. Drop check for fndecl
|
||||
being non-NULL that was after a usage of DECL_NAME (fndecl).
|
||||
* tree.h (maybe_special_function_p): New inline function.
|
||||
|
||||
2020-01-30 Andrew Stubbs <ams@codesourcery.com>
|
||||
|
||||
* config/gcn/gcn-valu.md (gather<mode>_exec): Move contents ...
|
||||
|
@ -1,3 +1,11 @@
|
||||
2020-01-31 David Malcolm <dmalcolm@redhat.com>
|
||||
|
||||
* analyzer.cc (is_named_call_p): Replace tests for fndecl being
|
||||
extern at file scope and having a non-NULL DECL_NAME with a call
|
||||
to maybe_special_function_p.
|
||||
* function-set.cc (function_set::contains_decl_p): Add call to
|
||||
maybe_special_function_p.
|
||||
|
||||
2020-01-31 David Malcolm <dmalcolm@redhat.com>
|
||||
|
||||
PR analyzer/93450
|
||||
|
@ -65,18 +65,10 @@ is_named_call_p (tree fndecl, const char *funcname)
|
||||
gcc_assert (fndecl);
|
||||
gcc_assert (funcname);
|
||||
|
||||
/* Exclude functions not at the file scope, or not `extern',
|
||||
since they are not the magic functions we would otherwise
|
||||
think they are. */
|
||||
if (!((DECL_CONTEXT (fndecl) == NULL_TREE
|
||||
|| TREE_CODE (DECL_CONTEXT (fndecl)) == TRANSLATION_UNIT_DECL)
|
||||
&& TREE_PUBLIC (fndecl)))
|
||||
if (!maybe_special_function_p (fndecl))
|
||||
return false;
|
||||
|
||||
tree identifier = DECL_NAME (fndecl);
|
||||
if (identifier == NULL)
|
||||
return false;
|
||||
|
||||
const char *name = IDENTIFIER_POINTER (identifier);
|
||||
const char *tname = name;
|
||||
|
||||
|
@ -59,6 +59,8 @@ bool
|
||||
function_set::contains_decl_p (tree fndecl) const
|
||||
{
|
||||
gcc_assert (fndecl && DECL_P (fndecl));
|
||||
if (!maybe_special_function_p (fndecl))
|
||||
return false;
|
||||
return contains_name_p (IDENTIFIER_POINTER (DECL_NAME (fndecl)));
|
||||
}
|
||||
|
||||
|
14
gcc/calls.c
14
gcc/calls.c
@ -586,18 +586,8 @@ special_function_p (const_tree fndecl, int flags)
|
||||
{
|
||||
tree name_decl = DECL_NAME (fndecl);
|
||||
|
||||
if (fndecl && name_decl
|
||||
&& IDENTIFIER_LENGTH (name_decl) <= 11
|
||||
/* Exclude functions not at the file scope, or not `extern',
|
||||
since they are not the magic functions we would otherwise
|
||||
think they are.
|
||||
FIXME: this should be handled with attributes, not with this
|
||||
hacky imitation of DECL_ASSEMBLER_NAME. It's (also) wrong
|
||||
because you can declare fork() inside a function if you
|
||||
wish. */
|
||||
&& (DECL_CONTEXT (fndecl) == NULL_TREE
|
||||
|| TREE_CODE (DECL_CONTEXT (fndecl)) == TRANSLATION_UNIT_DECL)
|
||||
&& TREE_PUBLIC (fndecl))
|
||||
if (maybe_special_function_p (fndecl)
|
||||
&& IDENTIFIER_LENGTH (name_decl) <= 11)
|
||||
{
|
||||
const char *name = IDENTIFIER_POINTER (name_decl);
|
||||
const char *tname = name;
|
||||
|
25
gcc/tree.h
25
gcc/tree.h
@ -5611,6 +5611,31 @@ builtin_decl_declared_p (enum built_in_function fncode)
|
||||
&& builtin_info[uns_fncode].declared_p);
|
||||
}
|
||||
|
||||
/* Determine if the function identified by FNDECL is one that
|
||||
makes sense to match by name, for those places where we detect
|
||||
"magic" functions by name.
|
||||
|
||||
Return true if FNDECL has a name and is an extern fndecl at file scope.
|
||||
FNDECL must be a non-NULL decl.
|
||||
|
||||
Avoid using this, as it's generally better to use attributes rather
|
||||
than to check for functions by name. */
|
||||
|
||||
static inline bool
|
||||
maybe_special_function_p (const_tree fndecl)
|
||||
{
|
||||
tree name_decl = DECL_NAME (fndecl);
|
||||
if (name_decl
|
||||
/* Exclude functions not at the file scope, or not `extern',
|
||||
since they are not the magic functions we would otherwise
|
||||
think they are. */
|
||||
&& (DECL_CONTEXT (fndecl) == NULL_TREE
|
||||
|| TREE_CODE (DECL_CONTEXT (fndecl)) == TRANSLATION_UNIT_DECL)
|
||||
&& TREE_PUBLIC (fndecl))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Return true if T (assumed to be a DECL) is a global variable.
|
||||
A variable is considered global if its storage is not automatic. */
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user