aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/config/i386/i386.opt4
-rw-r--r--gcc/doc/options.texi6
-rw-r--r--gcc/opts-common.c11
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/gcc.dg/pr69471-1.c9
-rw-r--r--gcc/testsuite/gcc.dg/pr69471-2.c8
-rw-r--r--gcc/testsuite/gcc.target/i386/pr69471-3.c11
8 files changed, 60 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 77e2e83..78d5e99 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,13 @@
+2019-02-23 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR driver/69471
+ * opts-common.c (prune_options): Also prune joined switches
+ with Negative and RejectNegative.
+ * config/i386/i386.opt (march=): Add Negative(march=).
+ (mtune=): Add Negative(mtune=).
+ * doc/options.texi: Document Negative used together with Joined
+ and RejectNegative.
+
2019-02-22 Martin Sebor <msebor@redhat.com>
* doc/extend.texi (Other Builtins): Add
diff --git a/gcc/config/i386/i386.opt b/gcc/config/i386/i386.opt
index 9b93241..b7998ee 100644
--- a/gcc/config/i386/i386.opt
+++ b/gcc/config/i386/i386.opt
@@ -253,7 +253,7 @@ EnumValue
Enum(ix86_align_data) String(cacheline) Value(ix86_align_data_type_cacheline)
march=
-Target RejectNegative Joined Var(ix86_arch_string)
+Target RejectNegative Negative(march=) Joined Var(ix86_arch_string)
Generate code for given CPU.
masm=
@@ -510,7 +510,7 @@ Target Report Mask(TLS_DIRECT_SEG_REFS)
Use direct references against %gs when accessing tls data.
mtune=
-Target RejectNegative Joined Var(ix86_tune_string)
+Target RejectNegative Negative(mtune=) Joined Var(ix86_tune_string)
Schedule code for given CPU.
mtune-ctrl=
diff --git a/gcc/doc/options.texi b/gcc/doc/options.texi
index 0081243..1c83d24 100644
--- a/gcc/doc/options.texi
+++ b/gcc/doc/options.texi
@@ -220,7 +220,11 @@ property is used.
The option will turn off another option @var{othername}, which is
the option name with the leading ``-'' removed. This chain action will
propagate through the @code{Negative} property of the option to be
-turned off.
+turned off. The driver will prune options, removing those that are
+turned off by some later option. This pruning is not done for options
+with @code{Joined} or @code{JoinedOrMissing} properties, unless the
+options have either @code{RejectNegative} property or the @code{Negative}
+property mentions an option other than itself.
As a consequence, if you have a group of mutually-exclusive
options, their @code{Negative} properties should form a circular chain.
diff --git a/gcc/opts-common.c b/gcc/opts-common.c
index ee8898b..edbb3ac 100644
--- a/gcc/opts-common.c
+++ b/gcc/opts-common.c
@@ -1015,7 +1015,9 @@ prune_options (struct cl_decoded_option **decoded_options,
goto keep;
/* Skip joined switches. */
- if ((option->flags & CL_JOINED))
+ if ((option->flags & CL_JOINED)
+ && (!option->cl_reject_negative
+ || (unsigned int) option->neg_index != opt_idx))
goto keep;
for (j = i + 1; j < old_decoded_options_count; j++)
@@ -1027,8 +1029,11 @@ prune_options (struct cl_decoded_option **decoded_options,
continue;
if (cl_options[next_opt_idx].neg_index < 0)
continue;
- if ((cl_options[next_opt_idx].flags & CL_JOINED))
- continue;
+ if ((cl_options[next_opt_idx].flags & CL_JOINED)
+ && (!cl_options[next_opt_idx].cl_reject_negative
+ || ((unsigned int) cl_options[next_opt_idx].neg_index
+ != next_opt_idx)))
+ continue;
if (cancel_option (opt_idx, next_opt_idx, next_opt_idx))
break;
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 958564a..d0520fb 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2019-02-23 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR driver/69471
+ * gcc.dg/pr69471-1.c: New test.
+ * gcc.dg/pr69471-2.c: Likewise.
+ * gcc.target/i386/pr69471-3.c: Likewise.
+
2019-02-23 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR fortran/84387
diff --git a/gcc/testsuite/gcc.dg/pr69471-1.c b/gcc/testsuite/gcc.dg/pr69471-1.c
new file mode 100644
index 0000000..3eac3b5
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr69471-1.c
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-options "-Wno-implicit-function-declaration -Wno-int-conversion -fno-builtin-free -fno-builtin-malloc" } */
+
+void *
+foo (void * p)
+{
+ free (p);
+ return malloc (p);
+}
diff --git a/gcc/testsuite/gcc.dg/pr69471-2.c b/gcc/testsuite/gcc.dg/pr69471-2.c
new file mode 100644
index 0000000..d579960
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr69471-2.c
@@ -0,0 +1,8 @@
+/* { dg-do compile } */
+/* { dg-options "-gstabs2 -gdwarf-4 -gstabs3" } */
+/* { dg-error "conflicts with prior selectio" "" { target *-*-* } 0 } */
+
+void
+foo (void)
+{
+}
diff --git a/gcc/testsuite/gcc.target/i386/pr69471-3.c b/gcc/testsuite/gcc.target/i386/pr69471-3.c
new file mode 100644
index 0000000..3826f96
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr69471-3.c
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-march=native -march=knl" } */
+
+/* NB: We want to verify that -march=native -march=processor is the same
+ as -march=processor. Since it is very unlikely that GCC will be built
+ on KNL, -march=native will have -mno-avx512er and -march=knl should
+ enable AVX512ER. */
+
+#ifndef __AVX512ER__
+# error __AVX512ER__ is not defined
+#endif