Am Samstag, dem 12.10.2024 um 18:44 +0200 schrieb Richard Biener:
>
> > Am 12.10.2024 um 16:43 schrieb Martin Uecker <[email protected]>:
> >
> >
> > There is code which should not fail at run-time. For this,
> > it is helpful to get a warning when a compiler inserts traps
> > (e.g. sanitizers, hardbools, __builtin_trap(), etc.).
> >
> > Having a warning for this also has many other use cases, e.g.
> > one can use it with some sanitizer to rule out that some
> > piece of code has certain undefined behavior such as
> > signed overflow or undefined behavior in left-shifts
> > (one gets a warning if the optimizer does not prove the
> > trap is dead and it is emitted).
> >
> > Another potential use case could be writing tests.
> >
> >
> > Bootstrapped and regression tested on x64_84.
> >
> >
> > Add warning option that warns when a trap is generated.
> >
> > This adds a warning option -Wtrap that is emitted in
> > expand_builtin_trap. It can be used to verify that traps
> > are generated or - more importantly - are not generated
> > under various conditions, e.g. for UBSan with -fsanitize-trap,
> > hardbools, etc.
>
> Isn’t it better to diagnose with more context from the callers that insert
> the trap?
More context would be better. Should there be additional
arguments when creating the call to the builtin?
Martin
>
> > gcc/ChangeLog:
> > * common.opt (Wtrap): Add warning.
> > * builtins.cc (expand_builtin_trap): Add warning.
> > * doc/invoke.texi (Wtrap): Document warning.
> >
> > gcc/testsuite/ChangeLog:
> > * gcc.dg/Wtrap.c: New test.
> >
> > diff --git a/gcc/builtins.cc b/gcc/builtins.cc
> > index 37c7c98e5c7..76268f62481 100644
> > --- a/gcc/builtins.cc
> > +++ b/gcc/builtins.cc
> > @@ -5896,6 +5896,14 @@ expand_builtin_assume_aligned (tree exp, rtx target)
> > void
> > expand_builtin_trap (void)
> > {
> > + if (warn_trap)
> > + {
> > + location_t current_location =
> > + linemap_unwind_to_first_non_reserved_loc (line_table, input_location,
> > + NULL);
> > + warning_at (current_location, OPT_Wtrap, "trap generated");
> > + }
> > +
> > if (targetm.have_trap ())
> > {
> > rtx_insn *insn = emit_insn (targetm.gen_trap ());
> > diff --git a/gcc/common.opt b/gcc/common.opt
> > index 12b25ff486d..1cc4936ebbf 100644
> > --- a/gcc/common.opt
> > +++ b/gcc/common.opt
> > @@ -812,6 +812,10 @@ Wsystem-headers
> > Common Var(warn_system_headers) Warning
> > Do not suppress warnings from system headers.
> >
> > +Wtrap
> > +Common Var(warn_trap) Warning
> > +Warn whenever a trap is generated.
> > +
> > Wtrampolines
> > Common Var(warn_trampolines) Warning
> > Warn whenever a trampoline is generated.
> > diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
> > index 575dffd2a2f..68833c4350f 100644
> > --- a/gcc/doc/invoke.texi
> > +++ b/gcc/doc/invoke.texi
> > @@ -8784,6 +8784,14 @@ made up of data only and thus requires no special
> > treatment. But, for
> > most targets, it is made up of code and thus requires the stack to be
> > made executable in order for the program to work properly.
> >
> > +@opindex Wtrap
> > +@opindex Wno-trap
> > +@item -Wtrap
> > +Warn when explicit traps are generated. Traps may be generated for
> > +a variety of reasons, e.g. when using the undefined behavior sanitizer
> > +together with @option{-fsanitize-trap=undefined}.
> > +
> > +
> > @opindex Wfloat-equal
> > @opindex Wno-float-equal
> > @item -Wfloat-equal
> > diff --git a/gcc/testsuite/gcc.dg/Wtrap.c b/gcc/testsuite/gcc.dg/Wtrap.c
> > new file mode 100644
> > index 00000000000..2f2878f9d45
> > --- /dev/null
> > +++ b/gcc/testsuite/gcc.dg/Wtrap.c
> > @@ -0,0 +1,8 @@
> > +/* { dg-do compile } */
> > +/* { dg-options "-O2 -Wtrap" } */
> > +
> > +void foo(void)
> > +{
> > + __builtin_trap(); /* { dg-warning "trap generated" } */
> > +}
> > +
> >