options: Fix up -fsanitize-coverage= [PR104158]

Message ID 20220122004931.GP2646553@tucnak
State New
Headers
Series options: Fix up -fsanitize-coverage= [PR104158] |

Commit Message

Jakub Jelinek Jan. 22, 2022, 12:49 a.m. UTC
  Hi!

This is incremental patch to fix up -fsanitize-coverage= option
handling, allow -fno-sanitize-coverage= again, allow both
options together in one option or make
-fsanitize-coverage=trace-pc -fsanitize-coverage=trace-cmp
actually enable both suboptions rather than the last one.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2022-01-21  Jakub Jelinek  <jakub@redhat.com>

	PR sanitizer/104158
	* common.opt (flag_sanitize_coverage): Remove Variable entry.
	(fsanitize-coverage=): Remove RejectNegative property, add
	Var(flag_sanitize_coverage) and EnumSet properties.
	(trace-pc): Add Set(1) property.
	(trace-cmp): Add Set(2) property.
	* opts.cc (common_handle_option): Don't handle
	OPT_fsanitize_coverage_.

	* gcc.dg/spellcheck-options-24.c: New test.
	* gcc.dg/sancov/pr104158-1.c: New test.
	* gcc.dg/sancov/pr104158-2.c: New test.
	* gcc.dg/sancov/pr104158-3.c: New test.
	* gcc.dg/sancov/pr104158-4.c: New test.
	* gcc.dg/sancov/pr104158-5.c: New test.
	* gcc.dg/sancov/pr104158-6.c: New test.
	* gcc.dg/sancov/pr104158-7.c: New test.


	Jakub
  

Comments

Richard Biener Jan. 24, 2022, 10:17 a.m. UTC | #1
On Sat, Jan 22, 2022 at 1:50 AM Jakub Jelinek via Gcc-patches
<gcc-patches@gcc.gnu.org> wrote:
>
> Hi!
>
> This is incremental patch to fix up -fsanitize-coverage= option
> handling, allow -fno-sanitize-coverage= again, allow both
> options together in one option or make
> -fsanitize-coverage=trace-pc -fsanitize-coverage=trace-cmp
> actually enable both suboptions rather than the last one.
>
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

OK.

> 2022-01-21  Jakub Jelinek  <jakub@redhat.com>
>
>         PR sanitizer/104158
>         * common.opt (flag_sanitize_coverage): Remove Variable entry.
>         (fsanitize-coverage=): Remove RejectNegative property, add
>         Var(flag_sanitize_coverage) and EnumSet properties.
>         (trace-pc): Add Set(1) property.
>         (trace-cmp): Add Set(2) property.
>         * opts.cc (common_handle_option): Don't handle
>         OPT_fsanitize_coverage_.
>
>         * gcc.dg/spellcheck-options-24.c: New test.
>         * gcc.dg/sancov/pr104158-1.c: New test.
>         * gcc.dg/sancov/pr104158-2.c: New test.
>         * gcc.dg/sancov/pr104158-3.c: New test.
>         * gcc.dg/sancov/pr104158-4.c: New test.
>         * gcc.dg/sancov/pr104158-5.c: New test.
>         * gcc.dg/sancov/pr104158-6.c: New test.
>         * gcc.dg/sancov/pr104158-7.c: New test.
>
> --- gcc/common.opt.jj   2022-01-18 11:58:58.975990728 +0100
> +++ gcc/common.opt      2022-01-21 17:03:46.261364018 +0100
> @@ -223,10 +223,6 @@ unsigned int flag_sanitize
>  Variable
>  unsigned int flag_sanitize_recover = (SANITIZE_UNDEFINED | SANITIZE_UNDEFINED_NONDEFAULT | SANITIZE_KERNEL_ADDRESS | SANITIZE_KERNEL_HWADDRESS) & ~(SANITIZE_UNREACHABLE | SANITIZE_RETURN)
>
> -; What the coverage sanitizers should instrument
> -Variable
> -unsigned int flag_sanitize_coverage
> -
>  ; Flag whether a prefix has been added to dump_base_name
>  Variable
>  bool dump_base_name_prefixed = false
> @@ -1076,17 +1072,17 @@ Common Driver Joined
>  Select what to sanitize.
>
>  fsanitize-coverage=
> -Common Joined RejectNegative Enum(sanitize_coverage)
> +Common Joined Enum(sanitize_coverage) Var(flag_sanitize_coverage) EnumSet
>  Select type of coverage sanitization.
>
>  Enum
>  Name(sanitize_coverage) Type(int)
>
>  EnumValue
> -Enum(sanitize_coverage) String(trace-pc) Value(SANITIZE_COV_TRACE_PC)
> +Enum(sanitize_coverage) String(trace-pc) Value(SANITIZE_COV_TRACE_PC) Set(1)
>
>  EnumValue
> -Enum(sanitize_coverage) String(trace-cmp) Value(SANITIZE_COV_TRACE_CMP)
> +Enum(sanitize_coverage) String(trace-cmp) Value(SANITIZE_COV_TRACE_CMP) Set(2)
>
>  fasan-shadow-offset=
>  Common Joined RejectNegative Var(common_deferred_options) Defer
> --- gcc/opts.cc.jj      2022-01-20 11:30:45.595577895 +0100
> +++ gcc/opts.cc 2022-01-21 19:44:56.770505499 +0100
> @@ -2621,10 +2621,6 @@ common_handle_option (struct gcc_options
>           &= ~(SANITIZE_UNDEFINED | SANITIZE_UNDEFINED_NONDEFAULT);
>        break;
>
> -    case OPT_fsanitize_coverage_:
> -      opts->x_flag_sanitize_coverage = value;
> -      break;
> -
>      case OPT_O:
>      case OPT_Os:
>      case OPT_Ofast:
> --- gcc/testsuite/gcc.dg/spellcheck-options-24.c.jj     2022-01-21 20:14:19.549779106 +0100
> +++ gcc/testsuite/gcc.dg/spellcheck-options-24.c        2022-01-21 20:14:38.555512955 +0100
> @@ -0,0 +1,5 @@
> +/* { dg-do compile } */
> +/* { dg-options "-fsanitize-coverage=trace-pc,tracecmp" } */
> +
> +/* { dg-error "unrecognized argument in option '-fsanitize-coverage=trace-pc,tracecmp'" "" { target *-*-* } 0 } */
> +/* { dg-message "valid arguments to '-fsanitize-coverage=' are: trace-cmp trace-pc; did you mean 'trace-cmp'?" "" { target *-*-* } 0 } */
> --- gcc/testsuite/gcc.dg/sancov/pr104158-1.c.jj 2022-01-21 20:08:17.878843831 +0100
> +++ gcc/testsuite/gcc.dg/sancov/pr104158-1.c    2022-01-21 20:03:48.824612895 +0100
> @@ -0,0 +1,11 @@
> +/* PR sanitizer/104158 */
> +/* { dg-do compile } */
> +/* { dg-options "-fsanitize-coverage=trace-cmp -fdump-tree-optimized" } */
> +/* { dg-final { scan-tree-dump "__sanitizer_cov_trace_cmp" "optimized" } } */
> +/* { dg-final { scan-tree-dump-not "__sanitizer_cov_trace_pc" "optimized" } } */
> +
> +int
> +foo (int a, int b)
> +{
> +  return a == b;
> +}
> --- gcc/testsuite/gcc.dg/sancov/pr104158-2.c.jj 2022-01-21 20:08:17.879843817 +0100
> +++ gcc/testsuite/gcc.dg/sancov/pr104158-2.c    2022-01-21 20:04:18.116201478 +0100
> @@ -0,0 +1,11 @@
> +/* PR sanitizer/104158 */
> +/* { dg-do compile } */
> +/* { dg-options "-fsanitize-coverage=trace-pc -fdump-tree-optimized" } */
> +/* { dg-final { scan-tree-dump-not "__sanitizer_cov_trace_cmp" "optimized" } } */
> +/* { dg-final { scan-tree-dump "__sanitizer_cov_trace_pc" "optimized" } } */
> +
> +int
> +foo (int a, int b)
> +{
> +  return a == b;
> +}
> --- gcc/testsuite/gcc.dg/sancov/pr104158-3.c.jj 2022-01-21 20:08:17.880843803 +0100
> +++ gcc/testsuite/gcc.dg/sancov/pr104158-3.c    2022-01-21 20:05:42.747016252 +0100
> @@ -0,0 +1,11 @@
> +/* PR sanitizer/104158 */
> +/* { dg-do compile } */
> +/* { dg-options "-fsanitize-coverage=trace-cmp,trace-pc -fdump-tree-optimized" } */
> +/* { dg-final { scan-tree-dump "__sanitizer_cov_trace_cmp" "optimized" } } */
> +/* { dg-final { scan-tree-dump "__sanitizer_cov_trace_pc" "optimized" } } */
> +
> +int
> +foo (int a, int b)
> +{
> +  return a == b;
> +}
> --- gcc/testsuite/gcc.dg/sancov/pr104158-4.c.jj 2022-01-21 20:08:17.881843789 +0100
> +++ gcc/testsuite/gcc.dg/sancov/pr104158-4.c    2022-01-21 20:06:01.503753588 +0100
> @@ -0,0 +1,11 @@
> +/* PR sanitizer/104158 */
> +/* { dg-do compile } */
> +/* { dg-options "-fsanitize-coverage=trace-pc,trace-cmp -fdump-tree-optimized" } */
> +/* { dg-final { scan-tree-dump "__sanitizer_cov_trace_cmp" "optimized" } } */
> +/* { dg-final { scan-tree-dump "__sanitizer_cov_trace_pc" "optimized" } } */
> +
> +int
> +foo (int a, int b)
> +{
> +  return a == b;
> +}
> --- gcc/testsuite/gcc.dg/sancov/pr104158-5.c.jj 2022-01-21 20:08:17.882843775 +0100
> +++ gcc/testsuite/gcc.dg/sancov/pr104158-5.c    2022-01-21 20:06:49.097087106 +0100
> @@ -0,0 +1,11 @@
> +/* PR sanitizer/104158 */
> +/* { dg-do compile } */
> +/* { dg-options "-fsanitize-coverage=trace-cmp -fsanitize-coverage=trace-pc -fno-sanitize-coverage=trace-cmp -fdump-tree-optimized" } */
> +/* { dg-final { scan-tree-dump-not "__sanitizer_cov_trace_cmp" "optimized" } } */
> +/* { dg-final { scan-tree-dump "__sanitizer_cov_trace_pc" "optimized" } } */
> +
> +int
> +foo (int a, int b)
> +{
> +  return a == b;
> +}
> --- gcc/testsuite/gcc.dg/sancov/pr104158-6.c.jj 2022-01-21 20:08:17.883843761 +0100
> +++ gcc/testsuite/gcc.dg/sancov/pr104158-6.c    2022-01-21 20:07:30.972500694 +0100
> @@ -0,0 +1,11 @@
> +/* PR sanitizer/104158 */
> +/* { dg-do compile } */
> +/* { dg-options "-fsanitize-coverage=trace-cmp -fsanitize-coverage=trace-pc -fno-sanitize-coverage=trace-pc,trace-cmp -fdump-tree-optimized" } */
> +/* { dg-final { scan-tree-dump-not "__sanitizer_cov_trace_cmp" "optimized" } } */
> +/* { dg-final { scan-tree-dump-not "__sanitizer_cov_trace_pc" "optimized" } } */
> +
> +int
> +foo (int a, int b)
> +{
> +  return a == b;
> +}
> --- gcc/testsuite/gcc.dg/sancov/pr104158-7.c.jj 2022-01-21 20:08:17.884843747 +0100
> +++ gcc/testsuite/gcc.dg/sancov/pr104158-7.c    2022-01-21 20:10:18.647152626 +0100
> @@ -0,0 +1,5 @@
> +/* PR sanitizer/104158 */
> +/* { dg-do compile } */
> +/* { dg-options "-fsanitize-coverage=trace-cmp,trace-cmp -fdump-tree-optimized" } */
> +/* { dg-error "invalid argument in option '-fsanitize-coverage=trace-cmp,trace-cmp'" "" { target *-*-* } 0 } */
> +/* { dg-message "'trace-cmp' specified multiple times in the same option" "" { target *-*-* } 0 } */
>
>         Jakub
>
  

Patch

--- gcc/common.opt.jj	2022-01-18 11:58:58.975990728 +0100
+++ gcc/common.opt	2022-01-21 17:03:46.261364018 +0100
@@ -223,10 +223,6 @@  unsigned int flag_sanitize
 Variable
 unsigned int flag_sanitize_recover = (SANITIZE_UNDEFINED | SANITIZE_UNDEFINED_NONDEFAULT | SANITIZE_KERNEL_ADDRESS | SANITIZE_KERNEL_HWADDRESS) & ~(SANITIZE_UNREACHABLE | SANITIZE_RETURN)
 
-; What the coverage sanitizers should instrument
-Variable
-unsigned int flag_sanitize_coverage
-
 ; Flag whether a prefix has been added to dump_base_name
 Variable
 bool dump_base_name_prefixed = false
@@ -1076,17 +1072,17 @@  Common Driver Joined
 Select what to sanitize.
 
 fsanitize-coverage=
-Common Joined RejectNegative Enum(sanitize_coverage)
+Common Joined Enum(sanitize_coverage) Var(flag_sanitize_coverage) EnumSet
 Select type of coverage sanitization.
 
 Enum
 Name(sanitize_coverage) Type(int)
 
 EnumValue
-Enum(sanitize_coverage) String(trace-pc) Value(SANITIZE_COV_TRACE_PC)
+Enum(sanitize_coverage) String(trace-pc) Value(SANITIZE_COV_TRACE_PC) Set(1)
 
 EnumValue
-Enum(sanitize_coverage) String(trace-cmp) Value(SANITIZE_COV_TRACE_CMP)
+Enum(sanitize_coverage) String(trace-cmp) Value(SANITIZE_COV_TRACE_CMP) Set(2)
 
 fasan-shadow-offset=
 Common Joined RejectNegative Var(common_deferred_options) Defer
--- gcc/opts.cc.jj	2022-01-20 11:30:45.595577895 +0100
+++ gcc/opts.cc	2022-01-21 19:44:56.770505499 +0100
@@ -2621,10 +2621,6 @@  common_handle_option (struct gcc_options
 	  &= ~(SANITIZE_UNDEFINED | SANITIZE_UNDEFINED_NONDEFAULT);
       break;
 
-    case OPT_fsanitize_coverage_:
-      opts->x_flag_sanitize_coverage = value;
-      break;
-
     case OPT_O:
     case OPT_Os:
     case OPT_Ofast:
--- gcc/testsuite/gcc.dg/spellcheck-options-24.c.jj	2022-01-21 20:14:19.549779106 +0100
+++ gcc/testsuite/gcc.dg/spellcheck-options-24.c	2022-01-21 20:14:38.555512955 +0100
@@ -0,0 +1,5 @@ 
+/* { dg-do compile } */
+/* { dg-options "-fsanitize-coverage=trace-pc,tracecmp" } */
+
+/* { dg-error "unrecognized argument in option '-fsanitize-coverage=trace-pc,tracecmp'" "" { target *-*-* } 0 } */
+/* { dg-message "valid arguments to '-fsanitize-coverage=' are: trace-cmp trace-pc; did you mean 'trace-cmp'?" "" { target *-*-* } 0 } */
--- gcc/testsuite/gcc.dg/sancov/pr104158-1.c.jj	2022-01-21 20:08:17.878843831 +0100
+++ gcc/testsuite/gcc.dg/sancov/pr104158-1.c	2022-01-21 20:03:48.824612895 +0100
@@ -0,0 +1,11 @@ 
+/* PR sanitizer/104158 */
+/* { dg-do compile } */
+/* { dg-options "-fsanitize-coverage=trace-cmp -fdump-tree-optimized" } */
+/* { dg-final { scan-tree-dump "__sanitizer_cov_trace_cmp" "optimized" } } */
+/* { dg-final { scan-tree-dump-not "__sanitizer_cov_trace_pc" "optimized" } } */
+
+int
+foo (int a, int b)
+{
+  return a == b;
+}
--- gcc/testsuite/gcc.dg/sancov/pr104158-2.c.jj	2022-01-21 20:08:17.879843817 +0100
+++ gcc/testsuite/gcc.dg/sancov/pr104158-2.c	2022-01-21 20:04:18.116201478 +0100
@@ -0,0 +1,11 @@ 
+/* PR sanitizer/104158 */
+/* { dg-do compile } */
+/* { dg-options "-fsanitize-coverage=trace-pc -fdump-tree-optimized" } */
+/* { dg-final { scan-tree-dump-not "__sanitizer_cov_trace_cmp" "optimized" } } */
+/* { dg-final { scan-tree-dump "__sanitizer_cov_trace_pc" "optimized" } } */
+
+int
+foo (int a, int b)
+{
+  return a == b;
+}
--- gcc/testsuite/gcc.dg/sancov/pr104158-3.c.jj	2022-01-21 20:08:17.880843803 +0100
+++ gcc/testsuite/gcc.dg/sancov/pr104158-3.c	2022-01-21 20:05:42.747016252 +0100
@@ -0,0 +1,11 @@ 
+/* PR sanitizer/104158 */
+/* { dg-do compile } */
+/* { dg-options "-fsanitize-coverage=trace-cmp,trace-pc -fdump-tree-optimized" } */
+/* { dg-final { scan-tree-dump "__sanitizer_cov_trace_cmp" "optimized" } } */
+/* { dg-final { scan-tree-dump "__sanitizer_cov_trace_pc" "optimized" } } */
+
+int
+foo (int a, int b)
+{
+  return a == b;
+}
--- gcc/testsuite/gcc.dg/sancov/pr104158-4.c.jj	2022-01-21 20:08:17.881843789 +0100
+++ gcc/testsuite/gcc.dg/sancov/pr104158-4.c	2022-01-21 20:06:01.503753588 +0100
@@ -0,0 +1,11 @@ 
+/* PR sanitizer/104158 */
+/* { dg-do compile } */
+/* { dg-options "-fsanitize-coverage=trace-pc,trace-cmp -fdump-tree-optimized" } */
+/* { dg-final { scan-tree-dump "__sanitizer_cov_trace_cmp" "optimized" } } */
+/* { dg-final { scan-tree-dump "__sanitizer_cov_trace_pc" "optimized" } } */
+
+int
+foo (int a, int b)
+{
+  return a == b;
+}
--- gcc/testsuite/gcc.dg/sancov/pr104158-5.c.jj	2022-01-21 20:08:17.882843775 +0100
+++ gcc/testsuite/gcc.dg/sancov/pr104158-5.c	2022-01-21 20:06:49.097087106 +0100
@@ -0,0 +1,11 @@ 
+/* PR sanitizer/104158 */
+/* { dg-do compile } */
+/* { dg-options "-fsanitize-coverage=trace-cmp -fsanitize-coverage=trace-pc -fno-sanitize-coverage=trace-cmp -fdump-tree-optimized" } */
+/* { dg-final { scan-tree-dump-not "__sanitizer_cov_trace_cmp" "optimized" } } */
+/* { dg-final { scan-tree-dump "__sanitizer_cov_trace_pc" "optimized" } } */
+
+int
+foo (int a, int b)
+{
+  return a == b;
+}
--- gcc/testsuite/gcc.dg/sancov/pr104158-6.c.jj	2022-01-21 20:08:17.883843761 +0100
+++ gcc/testsuite/gcc.dg/sancov/pr104158-6.c	2022-01-21 20:07:30.972500694 +0100
@@ -0,0 +1,11 @@ 
+/* PR sanitizer/104158 */
+/* { dg-do compile } */
+/* { dg-options "-fsanitize-coverage=trace-cmp -fsanitize-coverage=trace-pc -fno-sanitize-coverage=trace-pc,trace-cmp -fdump-tree-optimized" } */
+/* { dg-final { scan-tree-dump-not "__sanitizer_cov_trace_cmp" "optimized" } } */
+/* { dg-final { scan-tree-dump-not "__sanitizer_cov_trace_pc" "optimized" } } */
+
+int
+foo (int a, int b)
+{
+  return a == b;
+}
--- gcc/testsuite/gcc.dg/sancov/pr104158-7.c.jj	2022-01-21 20:08:17.884843747 +0100
+++ gcc/testsuite/gcc.dg/sancov/pr104158-7.c	2022-01-21 20:10:18.647152626 +0100
@@ -0,0 +1,5 @@ 
+/* PR sanitizer/104158 */
+/* { dg-do compile } */
+/* { dg-options "-fsanitize-coverage=trace-cmp,trace-cmp -fdump-tree-optimized" } */
+/* { dg-error "invalid argument in option '-fsanitize-coverage=trace-cmp,trace-cmp'" "" { target *-*-* } 0 } */
+/* { dg-message "'trace-cmp' specified multiple times in the same option" "" { target *-*-* } 0 } */