diff options
author | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-03-31 09:52:42 +0000 |
---|---|---|
committer | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-03-31 09:52:42 +0000 |
commit | a0ef17252aacb249f46fe16983accbf45fc6fe8d (patch) | |
tree | 08485e14eaa9f1372587d43f25c3a7c01bc9dfc4 | |
parent | 87f83b2f8fdaf6bc2bdc4b61ea0106de1baab5e9 (diff) | |
download | gcc-a0ef17252aacb249f46fe16983accbf45fc6fe8d.tar.gz |
* 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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@51643 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/builtins.c | 39 | ||||
-rw-r--r-- | gcc/expr.h | 4 | ||||
-rw-r--r-- | gcc/libfuncs.h | 2 | ||||
-rw-r--r-- | gcc/optabs.c | 1 | ||||
-rw-r--r-- | gcc/stmt.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/va-arg-1.c | 6 |
8 files changed, 51 insertions, 20 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index eae2a27d6f0..d71c621fb0a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +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> * gcc.c (LIBGCC_SPEC): Folded %L and duplicate %G here... diff --git a/gcc/builtins.c b/gcc/builtins.c index eb117ceecfe..effd70d43ed 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -3079,7 +3079,7 @@ expand_builtin_va_arg (valist, type) else if ((promoted_type = (*lang_type_promotes_to) (type)) != NULL_TREE) { const char *name = "<anonymous type>", *pname = 0; - static int gave_help; + static bool gave_help; if (TYPE_NAME (type)) { @@ -3098,13 +3098,24 @@ expand_builtin_va_arg (valist, 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) { - gave_help = 1; - error ("(so you should pass `%s' not `%s' to `va_arg')", pname, name); + gave_help = true; + 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; } else @@ -3556,6 +3567,18 @@ expand_builtin_expect_jump (exp, if_false_label, if_true_label) 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, with result going to TARGET if that's convenient @@ -3890,13 +3913,7 @@ expand_builtin (exp, target, subtarget, mode, ignore) } case BUILT_IN_TRAP: -#ifdef HAVE_trap - if (HAVE_trap) - emit_insn (gen_trap ()); - else -#endif - error ("__builtin_trap not supported by this target"); - emit_barrier (); + expand_builtin_trap (); return const0_rtx; case BUILT_IN_PUTCHAR: diff --git a/gcc/expr.h b/gcc/expr.h index 9ffc61fd9a8..91ffa3f0507 100644 --- a/gcc/expr.h +++ b/gcc/expr.h @@ -340,7 +340,6 @@ extern rtx get_condition PARAMS ((rtx, rtx *)); extern rtx gen_cond_trap PARAMS ((enum rtx_code, rtx, rtx, rtx)); /* Functions from builtins.c: */ -#ifdef TREE_CODE extern rtx expand_builtin PARAMS ((tree, rtx, rtx, enum machine_mode, int)); extern void std_expand_builtin_va_start PARAMS ((int, tree, rtx)); extern rtx std_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 rtx default_expand_builtin PARAMS ((tree, rtx, rtx, enum machine_mode, int)); -#endif - extern void expand_builtin_setjmp_setup PARAMS ((rtx, rtx)); extern void expand_builtin_setjmp_receiver PARAMS ((rtx)); extern void expand_builtin_longjmp PARAMS ((rtx, rtx)); 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_frame_alias_set PARAMS ((void)); extern void record_base_value PARAMS ((unsigned int, rtx, int)); diff --git a/gcc/libfuncs.h b/gcc/libfuncs.h index 59e594e801e..c3fa09e760c 100644 --- a/gcc/libfuncs.h +++ b/gcc/libfuncs.h @@ -36,6 +36,7 @@ enum libfunc_index LTI_truncxfdf2, LTI_trunctfdf2, + LTI_abort, LTI_memcpy, LTI_memmove, LTI_bcopy, @@ -162,6 +163,7 @@ extern rtx libfunc_table[LTI_MAX]; #define truncxfdf2_libfunc (libfunc_table[LTI_truncxfdf2]) #define trunctfdf2_libfunc (libfunc_table[LTI_trunctfdf2]) +#define abort_libfunc (libfunc_table[LTI_abort]) #define memcpy_libfunc (libfunc_table[LTI_memcpy]) #define memmove_libfunc (libfunc_table[LTI_memmove]) #define bcopy_libfunc (libfunc_table[LTI_bcopy]) diff --git a/gcc/optabs.c b/gcc/optabs.c index 86c20b08d81..4d1ebda77f6 100644 --- a/gcc/optabs.c +++ b/gcc/optabs.c @@ -5076,6 +5076,7 @@ init_optabs () truncxfdf2_libfunc = init_one_libfunc ("__truncxfdf2"); trunctfdf2_libfunc = init_one_libfunc ("__trunctfdf2"); + abort_libfunc = init_one_libfunc ("abort"); memcpy_libfunc = init_one_libfunc ("memcpy"); memmove_libfunc = init_one_libfunc ("memmove"); bcopy_libfunc = init_one_libfunc ("bcopy"); diff --git a/gcc/stmt.c b/gcc/stmt.c index d732047aaf8..2db32e87060 100644 --- a/gcc/stmt.c +++ b/gcc/stmt.c @@ -3667,9 +3667,7 @@ expand_nl_goto_receivers (thisblock) if (any_invalid) { expand_nl_goto_receiver (); - emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "abort"), LCT_NORETURN, - VOIDmode, 0); - emit_barrier (); + expand_builtin_trap (); } nonlocal_goto_handler_labels = label_list; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f4430292e93..abf2c2072d0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +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> * gcc.dg/weak-1.c: Disable on h8300 port. diff --git a/gcc/testsuite/gcc.dg/va-arg-1.c b/gcc/testsuite/gcc.dg/va-arg-1.c index b29d7eb7f29..a14823725da 100644 --- a/gcc/testsuite/gcc.dg/va-arg-1.c +++ b/gcc/testsuite/gcc.dg/va-arg-1.c @@ -7,7 +7,7 @@ volatile int i; void foo() { - i = va_arg(v, char); /* { dg-error "is promoted to|so you should" "char" } */ - i = va_arg(v, short); /* { dg-error "is promoted to" "short" } */ - i = va_arg(v, float); /* { dg-error "is promoted to" "float" } */ + i = va_arg(v, char); /* { dg-warning "is promoted to|so you should" "char" } */ + i = va_arg(v, short); /* { dg-warning "is promoted to" "short" } */ + i = va_arg(v, float); /* { dg-warning "is promoted to" "float" } */ } |