summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>2002-03-31 09:52:42 +0000
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>2002-03-31 09:52:42 +0000
commita0ef17252aacb249f46fe16983accbf45fc6fe8d (patch)
tree08485e14eaa9f1372587d43f25c3a7c01bc9dfc4
parent87f83b2f8fdaf6bc2bdc4b61ea0106de1baab5e9 (diff)
downloadgcc-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/ChangeLog11
-rw-r--r--gcc/builtins.c39
-rw-r--r--gcc/expr.h4
-rw-r--r--gcc/libfuncs.h2
-rw-r--r--gcc/optabs.c1
-rw-r--r--gcc/stmt.c4
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/va-arg-1.c6
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" } */
}