Commit 9602f5a0 by Richard Henderson Committed by Richard Henderson

builtins.c (expand_builtin_va_arg): Give warnings not errors for promoted…

builtins.c (expand_builtin_va_arg): Give warnings not errors for promoted argument types; build trap.

        * builtins.c (expand_builtin_va_arg): Give warnings not errors for
        promoted argument types; build trap.
        (expand_builtin_trap): New.
        (expand_builtin): Use it.
        * stmt.c (expand_nl_goto_receivers): Likewise.
        * expr.h (expand_builtin_trap): Declare.
        * libfuncs.h (LTI_abort, abort_libfunc): New.
        * optabs.c (init_optabs): Init abort_libfunc.

        * gcc.dg/va-arg-1.c: Expect warnings, not errors.

From-SVN: r51643
parent b56bc85a
2002-03-31 Richard Henderson <rth@redhat.com>
* builtins.c (expand_builtin_va_arg): Give warnings not errors for
promoted argument types; build trap.
(expand_builtin_trap): New.
(expand_builtin): Use it.
* stmt.c (expand_nl_goto_receivers): Likewise.
* expr.h (expand_builtin_trap): Declare.
* libfuncs.h (LTI_abort, abort_libfunc): New.
* optabs.c (init_optabs): Init abort_libfunc.
2002-03-31 Alexandre Oliva <aoliva@redhat.com> 2002-03-31 Alexandre Oliva <aoliva@redhat.com>
* gcc.c (LIBGCC_SPEC): Folded %L and duplicate %G here... * gcc.c (LIBGCC_SPEC): Folded %L and duplicate %G here...
......
...@@ -3079,7 +3079,7 @@ expand_builtin_va_arg (valist, type) ...@@ -3079,7 +3079,7 @@ expand_builtin_va_arg (valist, type)
else if ((promoted_type = (*lang_type_promotes_to) (type)) != NULL_TREE) else if ((promoted_type = (*lang_type_promotes_to) (type)) != NULL_TREE)
{ {
const char *name = "<anonymous type>", *pname = 0; const char *name = "<anonymous type>", *pname = 0;
static int gave_help; static bool gave_help;
if (TYPE_NAME (type)) if (TYPE_NAME (type))
{ {
...@@ -3098,13 +3098,24 @@ expand_builtin_va_arg (valist, type) ...@@ -3098,13 +3098,24 @@ expand_builtin_va_arg (valist, type)
pname = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (promoted_type))); pname = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (promoted_type)));
} }
error ("`%s' is promoted to `%s' when passed through `...'", name, pname); /* Unfortunately, this is merely undefined, rather than a constraint
violation, so we cannot make this an error. If this call is never
executed, the program is still strictly conforming. */
warning ("`%s' is promoted to `%s' when passed through `...'",
name, pname);
if (! gave_help) if (! gave_help)
{ {
gave_help = 1; gave_help = true;
error ("(so you should pass `%s' not `%s' to `va_arg')", pname, name); warning ("(so you should pass `%s' not `%s' to `va_arg')",
pname, name);
} }
/* We can, however, treat "undefined" any way we please.
Call abort to encourage the user to fix the program. */
expand_builtin_trap ();
/* This is dead code, but go ahead and finish so that the
mode of the result comes out right. */
addr = const0_rtx; addr = const0_rtx;
} }
else else
...@@ -3557,6 +3568,18 @@ expand_builtin_expect_jump (exp, if_false_label, if_true_label) ...@@ -3557,6 +3568,18 @@ expand_builtin_expect_jump (exp, if_false_label, if_true_label)
return ret; return ret;
} }
void
expand_builtin_trap ()
{
#ifdef HAVE_trap
if (HAVE_trap)
emit_insn (gen_trap ());
else
#endif
emit_library_call (abort_libfunc, LCT_NORETURN, VOIDmode, 0);
emit_barrier ();
}
/* Expand an expression EXP that calls a built-in function, /* Expand an expression EXP that calls a built-in function,
with result going to TARGET if that's convenient with result going to TARGET if that's convenient
(and in mode MODE if that's convenient). (and in mode MODE if that's convenient).
...@@ -3890,13 +3913,7 @@ expand_builtin (exp, target, subtarget, mode, ignore) ...@@ -3890,13 +3913,7 @@ expand_builtin (exp, target, subtarget, mode, ignore)
} }
case BUILT_IN_TRAP: case BUILT_IN_TRAP:
#ifdef HAVE_trap expand_builtin_trap ();
if (HAVE_trap)
emit_insn (gen_trap ());
else
#endif
error ("__builtin_trap not supported by this target");
emit_barrier ();
return const0_rtx; return const0_rtx;
case BUILT_IN_PUTCHAR: case BUILT_IN_PUTCHAR:
......
...@@ -340,7 +340,6 @@ extern rtx get_condition PARAMS ((rtx, rtx *)); ...@@ -340,7 +340,6 @@ extern rtx get_condition PARAMS ((rtx, rtx *));
extern rtx gen_cond_trap PARAMS ((enum rtx_code, rtx, rtx, rtx)); extern rtx gen_cond_trap PARAMS ((enum rtx_code, rtx, rtx, rtx));
/* Functions from builtins.c: */ /* Functions from builtins.c: */
#ifdef TREE_CODE
extern rtx expand_builtin PARAMS ((tree, rtx, rtx, enum machine_mode, int)); extern rtx expand_builtin PARAMS ((tree, rtx, rtx, enum machine_mode, int));
extern void std_expand_builtin_va_start PARAMS ((int, tree, rtx)); extern void std_expand_builtin_va_start PARAMS ((int, tree, rtx));
extern rtx std_expand_builtin_va_arg PARAMS ((tree, tree)); extern rtx std_expand_builtin_va_arg PARAMS ((tree, tree));
...@@ -348,12 +347,11 @@ extern rtx expand_builtin_va_arg PARAMS ((tree, tree)); ...@@ -348,12 +347,11 @@ extern rtx expand_builtin_va_arg PARAMS ((tree, tree));
extern void default_init_builtins PARAMS ((void)); extern void default_init_builtins PARAMS ((void));
extern rtx default_expand_builtin PARAMS ((tree, rtx, rtx, extern rtx default_expand_builtin PARAMS ((tree, rtx, rtx,
enum machine_mode, int)); enum machine_mode, int));
#endif
extern void expand_builtin_setjmp_setup PARAMS ((rtx, rtx)); extern void expand_builtin_setjmp_setup PARAMS ((rtx, rtx));
extern void expand_builtin_setjmp_receiver PARAMS ((rtx)); extern void expand_builtin_setjmp_receiver PARAMS ((rtx));
extern void expand_builtin_longjmp PARAMS ((rtx, rtx)); extern void expand_builtin_longjmp PARAMS ((rtx, rtx));
extern rtx expand_builtin_saveregs PARAMS ((void)); extern rtx expand_builtin_saveregs PARAMS ((void));
extern void expand_builtin_trap PARAMS ((void));
extern HOST_WIDE_INT get_varargs_alias_set PARAMS ((void)); extern HOST_WIDE_INT get_varargs_alias_set PARAMS ((void));
extern HOST_WIDE_INT get_frame_alias_set PARAMS ((void)); extern HOST_WIDE_INT get_frame_alias_set PARAMS ((void));
extern void record_base_value PARAMS ((unsigned int, rtx, int)); extern void record_base_value PARAMS ((unsigned int, rtx, int));
......
...@@ -36,6 +36,7 @@ enum libfunc_index ...@@ -36,6 +36,7 @@ enum libfunc_index
LTI_truncxfdf2, LTI_truncxfdf2,
LTI_trunctfdf2, LTI_trunctfdf2,
LTI_abort,
LTI_memcpy, LTI_memcpy,
LTI_memmove, LTI_memmove,
LTI_bcopy, LTI_bcopy,
...@@ -162,6 +163,7 @@ extern rtx libfunc_table[LTI_MAX]; ...@@ -162,6 +163,7 @@ extern rtx libfunc_table[LTI_MAX];
#define truncxfdf2_libfunc (libfunc_table[LTI_truncxfdf2]) #define truncxfdf2_libfunc (libfunc_table[LTI_truncxfdf2])
#define trunctfdf2_libfunc (libfunc_table[LTI_trunctfdf2]) #define trunctfdf2_libfunc (libfunc_table[LTI_trunctfdf2])
#define abort_libfunc (libfunc_table[LTI_abort])
#define memcpy_libfunc (libfunc_table[LTI_memcpy]) #define memcpy_libfunc (libfunc_table[LTI_memcpy])
#define memmove_libfunc (libfunc_table[LTI_memmove]) #define memmove_libfunc (libfunc_table[LTI_memmove])
#define bcopy_libfunc (libfunc_table[LTI_bcopy]) #define bcopy_libfunc (libfunc_table[LTI_bcopy])
......
...@@ -5076,6 +5076,7 @@ init_optabs () ...@@ -5076,6 +5076,7 @@ init_optabs ()
truncxfdf2_libfunc = init_one_libfunc ("__truncxfdf2"); truncxfdf2_libfunc = init_one_libfunc ("__truncxfdf2");
trunctfdf2_libfunc = init_one_libfunc ("__trunctfdf2"); trunctfdf2_libfunc = init_one_libfunc ("__trunctfdf2");
abort_libfunc = init_one_libfunc ("abort");
memcpy_libfunc = init_one_libfunc ("memcpy"); memcpy_libfunc = init_one_libfunc ("memcpy");
memmove_libfunc = init_one_libfunc ("memmove"); memmove_libfunc = init_one_libfunc ("memmove");
bcopy_libfunc = init_one_libfunc ("bcopy"); bcopy_libfunc = init_one_libfunc ("bcopy");
......
...@@ -3667,9 +3667,7 @@ expand_nl_goto_receivers (thisblock) ...@@ -3667,9 +3667,7 @@ expand_nl_goto_receivers (thisblock)
if (any_invalid) if (any_invalid)
{ {
expand_nl_goto_receiver (); expand_nl_goto_receiver ();
emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "abort"), LCT_NORETURN, expand_builtin_trap ();
VOIDmode, 0);
emit_barrier ();
} }
nonlocal_goto_handler_labels = label_list; nonlocal_goto_handler_labels = label_list;
......
2002-03-31 Richard Henderson <rth@redhat.com>
* gcc.dg/va-arg-1.c: Expect warnings, not errors.
2002-03-31 Kazu Hirata <kazu@hxi.com> 2002-03-31 Kazu Hirata <kazu@hxi.com>
* gcc.dg/weak-1.c: Disable on h8300 port. * gcc.dg/weak-1.c: Disable on h8300 port.
......
...@@ -7,7 +7,7 @@ volatile int i; ...@@ -7,7 +7,7 @@ volatile int i;
void foo() void foo()
{ {
i = va_arg(v, char); /* { dg-error "is promoted to|so you should" "char" } */ i = va_arg(v, char); /* { dg-warning "is promoted to|so you should" "char" } */
i = va_arg(v, short); /* { dg-error "is promoted to" "short" } */ i = va_arg(v, short); /* { dg-warning "is promoted to" "short" } */
i = va_arg(v, float); /* { dg-error "is promoted to" "float" } */ i = va_arg(v, float); /* { dg-warning "is promoted to" "float" } */
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment