+2019-08-13 Richard Sandiford <richard.sandiford@arm.com>
+
+ PR middle-end/91421
+ * attribs.c (decl_attributes): Check the DECL_BUILT_IN_CLASS
+ before the DECL_FUNCTION_CODE.
+ * calls.c (maybe_warn_alloc_args_overflow): Use fndecl_built_in_p
+ to check for a BUILT_IN_ALLOCA call.
+ * ipa-cp.c (ipa_get_indirect_edge_target_1): Likewise for
+ BUILT_IN_UNREACHABLE. Don't check for a FUNCTION_TYPE.
+ * ipa-devirt.c (possible_polymorphic_call_target_p): Likewise.
+ * ipa-prop.c (try_make_edge_direct_virtual_call): Likewise.
+ * gimple-ssa-isolate-paths.c (is_addr_local): Check specifically
+ for BUILT_IN_NORMAL functions.
+ * trans-mem.c (expand_block_edges): Use gimple_call_builtin_p to
+ test for BUILT_IN_TM_ABORT.
+ * tree-ssa-ccp.c (optimize_stack_restore): Use fndecl_built_in_p
+ to check for a BUILT_IN_STACK_RESTORE call.
+ (optimize_stdarg_builtin): Remove redundant check for GIMPLE_CALL.
+ * tree-ssa-threadedge.c
+ (record_temporary_equivalences_from_stmts_at_dest): Check for a
+ BUILT_IN_NORMAL decl before checking its DECL_FUNCTION_CODE.
+ * tree-vect-patterns.c (vect_recog_pow_pattern): Use a positive
+ test for a BUILT_IN_NORMAL call instead of a negative test for
+ an internal function call.
+
2019-08-13 Richard Sandiford <richard.sandiford@arm.com>
* tree.h (build_vector_a_then_b): Declare.
if (!built_in
|| !DECL_P (*anode)
+ || DECL_BUILT_IN_CLASS (*anode) != BUILT_IN_NORMAL
|| (DECL_FUNCTION_CODE (*anode) != BUILT_IN_UNREACHABLE
&& (DECL_FUNCTION_CODE (*anode)
!= BUILT_IN_UBSAN_HANDLE_BUILTIN_UNREACHABLE)))
+2019-08-13 Richard Sandiford <richard.sandiford@arm.com>
+
+ PR middle-end/91421
+ * c-decl.c (header_for_builtin_fn): Take a FUNCTION_DECL instead
+ of a built_in_function.
+ (diagnose_mismatched_decls, implicitly_declare): Update accordingly.
+
2019-08-10 Jakub Jelinek <jakub@redhat.com>
* c-parser.c (c_parser_omp_clause_name): Parse device_type.
static void layout_array_type (tree);
static void warn_defaults_to (location_t, int, const char *, ...)
ATTRIBUTE_GCC_DIAG(3,4);
-static const char *header_for_builtin_fn (enum built_in_function);
+static const char *header_for_builtin_fn (tree);
\f
/* T is a statement. Add it to the statement-tree. This is the
C/ObjC version--C++ has a slightly different version of this
if (!comptypes (oldtype, newtype))
{
if (TREE_CODE (olddecl) == FUNCTION_DECL
- && fndecl_built_in_p (olddecl) && !C_DECL_DECLARED_BUILTIN (olddecl))
+ && fndecl_built_in_p (olddecl, BUILT_IN_NORMAL)
+ && !C_DECL_DECLARED_BUILTIN (olddecl))
{
/* Accept "harmless" mismatches in function types such
as missing qualifiers or pointer vs same size integer
/* If types don't match for a built-in, throw away the
built-in. No point in calling locate_old_decl here, it
won't print anything. */
- const char *header
- = header_for_builtin_fn (DECL_FUNCTION_CODE (olddecl));
+ const char *header = header_for_builtin_fn (olddecl);
location_t loc = DECL_SOURCE_LOCATION (newdecl);
if (warning_at (loc, OPT_Wbuiltin_declaration_mismatch,
"conflicting types for built-in function %q+D; "
hint.suppress ();
}
-/* This function represents mapping of a function code FCODE
- to its respective header. */
+/* Return the name of the header file that declares built-in function
+ FNDECL, or null if either we don't know or don't expect to see an
+ explicit declaration. */
static const char *
-header_for_builtin_fn (enum built_in_function fcode)
+header_for_builtin_fn (tree fndecl)
{
- switch (fcode)
+ if (DECL_BUILT_IN_CLASS (fndecl) != BUILT_IN_NORMAL)
+ return NULL;
+
+ switch (DECL_FUNCTION_CODE (fndecl))
{
CASE_FLT_FN (BUILT_IN_ACOS):
CASE_FLT_FN (BUILT_IN_ACOSH):
"declaration of built-in "
"function %qD", decl);
/* See if we can hint which header to include. */
- const char *header
- = header_for_builtin_fn (DECL_FUNCTION_CODE (decl));
+ const char *header = header_for_builtin_fn (decl);
if (header != NULL && warned)
{
rich_location richloc (line_table, loc);
location_t loc = EXPR_LOCATION (exp);
tree fntype = fn ? TREE_TYPE (fn) : TREE_TYPE (TREE_TYPE (exp));
- built_in_function fncode = fn ? DECL_FUNCTION_CODE (fn) : BUILT_IN_NONE;
bool warned = false;
/* Validate each argument individually. */
friends.
Also avoid issuing the warning for calls to function named
"alloca". */
- if ((fncode == BUILT_IN_ALLOCA
- && IDENTIFIER_LENGTH (DECL_NAME (fn)) != 6)
- || (fncode != BUILT_IN_ALLOCA
- && !lookup_attribute ("returns_nonnull",
- TYPE_ATTRIBUTES (fntype))))
+ if (fn && fndecl_built_in_p (fn, BUILT_IN_ALLOCA)
+ ? IDENTIFIER_LENGTH (DECL_NAME (fn)) != 6
+ : !lookup_attribute ("returns_nonnull",
+ TYPE_ATTRIBUTES (fntype)))
warned = warning_at (loc, OPT_Walloc_zero,
"%Kargument %i value is zero",
exp, idx[i] + 1);
}
if (code == GIMPLE_CALL
- && gimple_call_builtin_p (def_stmt))
+ && gimple_call_builtin_p (def_stmt, BUILT_IN_NORMAL))
{
/* Handle alloca and friends that return pointers to automatic
storage. */
if (can_refer)
{
if (!target
- || (TREE_CODE (TREE_TYPE (target)) == FUNCTION_TYPE
- && DECL_FUNCTION_CODE (target) == BUILT_IN_UNREACHABLE)
+ || fndecl_built_in_p (target, BUILT_IN_UNREACHABLE)
|| !possible_polymorphic_call_target_p
(ie, cgraph_node::get (target)))
{
{
vec <cgraph_node *> targets;
unsigned int i;
- enum built_in_function fcode;
bool final;
- if (TREE_CODE (TREE_TYPE (n->decl)) == FUNCTION_TYPE
- && ((fcode = DECL_FUNCTION_CODE (n->decl)) == BUILT_IN_UNREACHABLE
- || fcode == BUILT_IN_TRAP))
+ if (fndecl_built_in_p (n->decl, BUILT_IN_UNREACHABLE)
+ || fndecl_built_in_p (n->decl, BUILT_IN_TRAP))
return true;
if (is_cxa_pure_virtual_p (n->decl))
if (can_refer)
{
if (!t
- || (TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE
- && DECL_FUNCTION_CODE (t) == BUILT_IN_UNREACHABLE)
+ || fndecl_built_in_p (t, BUILT_IN_UNREACHABLE)
|| !possible_polymorphic_call_target_p
(ie, cgraph_node::get (t)))
{
|| (gimple_call_flags (call_stmt) & ECF_TM_BUILTIN) == 0)
continue;
- if (DECL_FUNCTION_CODE (gimple_call_fndecl (call_stmt))
- == BUILT_IN_TM_ABORT)
+ if (gimple_call_builtin_p (call_stmt, BUILT_IN_TM_ABORT))
{
// If we have a ``_transaction_cancel [[outer]]'', there is only
// one abnormal edge: to the transaction marked OUTER.
|| ALLOCA_FUNCTION_CODE_P (DECL_FUNCTION_CODE (callee)))
return NULL_TREE;
- if (DECL_FUNCTION_CODE (callee) == BUILT_IN_STACK_RESTORE)
+ if (fndecl_built_in_p (callee, BUILT_IN_STACK_RESTORE))
goto second_stack_restore;
}
bool va_list_simple_ptr;
location_t loc = gimple_location (call);
- if (gimple_code (call) != GIMPLE_CALL)
- return NULL_TREE;
-
callee = gimple_call_fndecl (call);
cfun_va_list = targetm.fn_abi_va_list (callee);
{
tree fndecl = gimple_call_fndecl (stmt);
if (fndecl
+ && fndecl_built_in_p (fndecl, BUILT_IN_NORMAL)
&& (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_OBJECT_SIZE
|| DECL_FUNCTION_CODE (fndecl) == BUILT_IN_CONSTANT_P))
continue;
{
if (flag_unsafe_math_optimizations
&& TREE_CODE (base) == REAL_CST
- && !gimple_call_internal_p (last_stmt))
+ && gimple_call_builtin_p (last_stmt, BUILT_IN_NORMAL))
{
combined_fn log_cfn;
built_in_function exp_bfn;