diff mbox series

Assorted optc-save-gen.awk fixes (PR bootstrap/90543)

Message ID 20190522114156.GG19695@tucnak
State New
Headers show
Series Assorted optc-save-gen.awk fixes (PR bootstrap/90543) | expand

Commit Message

Jakub Jelinek May 22, 2019, 11:41 a.m. UTC
On Wed, May 22, 2019 at 01:27:04PM +0200, Jakub Jelinek wrote:
> No, IMHO you do want to use %s, patch below.  I've found a couple of other
> bugs in optc-save-gen.awk.  Attached is a diff between aarch64 target
> options-save.c before and after this patch.
> 
> The other bugs were that cl_optimization_print had a typo in the condition
> and so guarded the printing on the value of an unrelated option, and that
> not all C libraries print (null) instead of crashing when passing NULL to
> %s.
> 
> Tested on x86_64-linux and aarch64-linux (cross), ok for trunk?

I ended up sending a non-final version which actually didn't compile (extra
: after ?), but also found another issue since then, conditions like:
  if (ptr1->x_str_align_functions != ptr2->x_str_align_functions
      || (!ptr1->x_str_align_functions || !ptr2->x_str_align_functions
          || strcmp (ptr1->x_str_align_functions, ptr2->x_str_align_functions)))
    fprintf (file, "%*s%s (%s/%s)\n",
             indent_to, "",
             "str_align_functions",
             ptr1->x_str_align_functions,
             ptr2->x_str_align_functions);
don't really make any sense, if ptr1->x_str_align_functions != ptr2->x_str_align_functions
is false, then either both are NULL (but then we do not want to print
anything), or strcmp will be necessarily 0 (for both pointers).  What we
actually want is
  if (ptr1->x_str_align_functions != ptr2->x_str_align_functions
      && (!ptr1->x_str_align_functions || !ptr2->x_str_align_functions
          || strcmp (ptr1->x_str_align_functions, ptr2->x_str_align_functions)))
note the && instead of ||.

So, here is a new patch and a new aarch64 options-save.c diff.

Ok for trunk if it passes full bootstrap/regtest on x86_64-linux (passed
already normal build on aarch64-linux cross)?

2019-05-22  Jakub Jelinek  <jakub@redhat.com>

	PR bootstrap/90543
	* optc-save-gen.awk: In cl_optimization_print, use correct condition
	for var_opt_string printing.  In cl_optimization_print_diff, print
	(null) instead of invoking undefined behavior if one of the
	var_opt_string pointers is NULL and use && instead of first || in the
	guarding condition.  For var_target_other options, handle const char *
	target variables similarly to const char * optimize node variables.



	Jakub
--- options-save.c.jj	2019-04-15 19:47:25.093447074 +0200
+++ options-save.c	2019-05-22 13:33:38.032746240 +0200
@@ -2141,25 +2141,25 @@ cl_optimization_print (FILE *file,
              "flag_mlow_precision_sqrt",
              ptr->x_flag_mlow_precision_sqrt);
 
-  if (ptr->x_optimize)
+  if (ptr->x_str_align_functions)
     fprintf (file, "%*s%s (%s)\n",
              indent_to, "",
              "str_align_functions",
              ptr->x_str_align_functions);
 
-  if (ptr->x_optimize_size)
+  if (ptr->x_str_align_jumps)
     fprintf (file, "%*s%s (%s)\n",
              indent_to, "",
              "str_align_jumps",
              ptr->x_str_align_jumps);
 
-  if (ptr->x_optimize_debug)
+  if (ptr->x_str_align_labels)
     fprintf (file, "%*s%s (%s)\n",
              indent_to, "",
              "str_align_labels",
              ptr->x_str_align_labels);
 
-  if (ptr->x_optimize_fast)
+  if (ptr->x_str_align_loops)
     fprintf (file, "%*s%s (%s)\n",
              indent_to, "",
              "str_align_loops",
@@ -3807,40 +3807,40 @@ cl_optimization_print_diff (FILE *file,
              ptr2->x_flag_mlow_precision_sqrt);
 
   if (ptr1->x_str_align_functions != ptr2->x_str_align_functions
-      || (!ptr1->x_str_align_functions || !ptr2->x_str_align_functions
+      && (!ptr1->x_str_align_functions || !ptr2->x_str_align_functions
           || strcmp (ptr1->x_str_align_functions, ptr2->x_str_align_functions)))
     fprintf (file, "%*s%s (%s/%s)\n",
              indent_to, "",
              "str_align_functions",
-             ptr1->x_str_align_functions,
-             ptr2->x_str_align_functions);
+             ptr1->x_str_align_functions ? ptr1->x_str_align_functions : "(null)",
+             ptr2->x_str_align_functions ? ptr1->x_str_align_functions : "(null)");
 
   if (ptr1->x_str_align_jumps != ptr2->x_str_align_jumps
-      || (!ptr1->x_str_align_jumps || !ptr2->x_str_align_jumps
+      && (!ptr1->x_str_align_jumps || !ptr2->x_str_align_jumps
           || strcmp (ptr1->x_str_align_jumps, ptr2->x_str_align_jumps)))
     fprintf (file, "%*s%s (%s/%s)\n",
              indent_to, "",
              "str_align_jumps",
-             ptr1->x_str_align_jumps,
-             ptr2->x_str_align_jumps);
+             ptr1->x_str_align_jumps ? ptr1->x_str_align_jumps : "(null)",
+             ptr2->x_str_align_jumps ? ptr1->x_str_align_jumps : "(null)");
 
   if (ptr1->x_str_align_labels != ptr2->x_str_align_labels
-      || (!ptr1->x_str_align_labels || !ptr2->x_str_align_labels
+      && (!ptr1->x_str_align_labels || !ptr2->x_str_align_labels
           || strcmp (ptr1->x_str_align_labels, ptr2->x_str_align_labels)))
     fprintf (file, "%*s%s (%s/%s)\n",
              indent_to, "",
              "str_align_labels",
-             ptr1->x_str_align_labels,
-             ptr2->x_str_align_labels);
+             ptr1->x_str_align_labels ? ptr1->x_str_align_labels : "(null)",
+             ptr2->x_str_align_labels ? ptr1->x_str_align_labels : "(null)");
 
   if (ptr1->x_str_align_loops != ptr2->x_str_align_loops
-      || (!ptr1->x_str_align_loops || !ptr2->x_str_align_loops
+      && (!ptr1->x_str_align_loops || !ptr2->x_str_align_loops
           || strcmp (ptr1->x_str_align_loops, ptr2->x_str_align_loops)))
     fprintf (file, "%*s%s (%s/%s)\n",
              indent_to, "",
              "str_align_loops",
-             ptr1->x_str_align_loops,
-             ptr2->x_str_align_loops);
+             ptr1->x_str_align_loops ? ptr1->x_str_align_loops : "(null)",
+             ptr2->x_str_align_loops ? ptr1->x_str_align_loops : "(null)");
 
 }
 
@@ -3861,7 +3861,6 @@ cl_target_option_save (struct cl_target_
   ptr->x_aarch64_stack_protector_guard_offset = opts->x_aarch64_stack_protector_guard_offset;
   ptr->x_aarch64_enable_bti = opts->x_aarch64_enable_bti;
   ptr->x_aarch64_isa_flags = opts->x_aarch64_isa_flags;
-  ptr->x_aarch64_branch_protection_string = opts->x_aarch64_branch_protection_string;
   ptr->x_target_flags = opts->x_target_flags;
   ptr->x_aarch64_cmodel_var = opts->x_aarch64_cmodel_var;
   ptr->x_aarch64_ra_sign_scope = opts->x_aarch64_ra_sign_scope;
@@ -3870,6 +3869,7 @@ cl_target_option_save (struct cl_target_
   ptr->x_aarch64_fix_a53_err843419 = opts->x_aarch64_fix_a53_err843419;
   ptr->x_flag_omit_leaf_frame_pointer = opts->x_flag_omit_leaf_frame_pointer;
   ptr->x_pcrelative_literal_loads = opts->x_pcrelative_literal_loads;
+  ptr->x_aarch64_branch_protection_string = opts->x_aarch64_branch_protection_string;
 }
 
 /* Restore selected current options from a structure.  */
@@ -3881,7 +3881,6 @@ cl_target_option_restore (struct gcc_opt
   opts->x_aarch64_stack_protector_guard_offset = ptr->x_aarch64_stack_protector_guard_offset;
   opts->x_aarch64_enable_bti = ptr->x_aarch64_enable_bti;
   opts->x_aarch64_isa_flags = ptr->x_aarch64_isa_flags;
-  opts->x_aarch64_branch_protection_string = ptr->x_aarch64_branch_protection_string;
   opts->x_target_flags = ptr->x_target_flags;
   opts->x_aarch64_cmodel_var = ptr->x_aarch64_cmodel_var;
   opts->x_aarch64_ra_sign_scope = ptr->x_aarch64_ra_sign_scope;
@@ -3890,6 +3889,7 @@ cl_target_option_restore (struct gcc_opt
   opts->x_aarch64_fix_a53_err843419 = ptr->x_aarch64_fix_a53_err843419;
   opts->x_flag_omit_leaf_frame_pointer = ptr->x_flag_omit_leaf_frame_pointer;
   opts->x_pcrelative_literal_loads = ptr->x_pcrelative_literal_loads;
+  opts->x_aarch64_branch_protection_string = ptr->x_aarch64_branch_protection_string;
 
   if (targetm.target_option.restore)
     targetm.target_option.restore (opts, ptr);
@@ -3902,12 +3902,6 @@ cl_target_option_print (FILE *file,
                         struct cl_target_option *ptr)
 {
   fputs ("\n", file);
-  if (ptr->x_aarch64_branch_protection_string)
-    fprintf (file, "%*s%s (%#lx)\n",
-             indent, "",
-             "aarch64_branch_protection_string",
-             (unsigned long)ptr->x_aarch64_branch_protection_string);
-
   if (ptr->x_target_flags)
     fprintf (file, "%*s%s (%#lx)\n",
              indent, "",
@@ -3956,6 +3950,12 @@ cl_target_option_print (FILE *file,
              "pcrelative_literal_loads",
              ptr->x_pcrelative_literal_loads);
 
+  if (ptr->x_aarch64_branch_protection_string)
+    fprintf (file, "%*s%s (%s)\n",
+             indent, "",
+             "aarch64_branch_protection_string",
+             ptr->x_aarch64_branch_protection_string);
+
 
   if (targetm.target_option.print)
     targetm.target_option.print (file, indent, ptr);
@@ -3969,13 +3969,6 @@ cl_target_option_print_diff (FILE *file,
                              struct cl_target_option *ptr2 ATTRIBUTE_UNUSED)
 {
   fputs ("\n", file);
-  if (ptr1->x_aarch64_branch_protection_string != ptr2->x_aarch64_branch_protection_string)
-    fprintf (file, "%*s%s (%#lx/%#lx)\n",
-             indent, "",
-             "aarch64_branch_protection_string",
-             (unsigned long)ptr1->x_aarch64_branch_protection_string,
-             (unsigned long)ptr2->x_aarch64_branch_protection_string);
-
   if (ptr1->x_target_flags != ptr2->x_target_flags)
     fprintf (file, "%*s%s (%#lx/%#lx)\n",
              indent, "",
@@ -4032,6 +4025,15 @@ cl_target_option_print_diff (FILE *file,
              ptr1->x_pcrelative_literal_loads,
              ptr2->x_pcrelative_literal_loads);
 
+  if (ptr1->x_aarch64_branch_protection_string != ptr2->x_aarch64_branch_protection_string
+      && (!ptr1->x_aarch64_branch_protection_string || !ptr2->x_aarch64_branch_protection_string
+          || strcmp (ptr1->x_aarch64_branch_protection_string, ptr2->x_aarch64_branch_protection_string)))
+    fprintf (file, "%*s%s (%s/%s)\n",
+             indent, "",
+             "aarch64_branch_protection_string",
+             ptr1->x_aarch64_branch_protection_string ? ptr1->x_aarch64_branch_protection_string : "(null)",
+             ptr2->x_aarch64_branch_protection_string ? ptr1->x_aarch64_branch_protection_string : "(null)");
+
 }
 
 /* Compare two target options  */

Comments

Jakub Jelinek May 22, 2019, 10:33 p.m. UTC | #1
On Wed, May 22, 2019 at 01:41:56PM +0200, Jakub Jelinek wrote:
> Ok for trunk if it passes full bootstrap/regtest on x86_64-linux (passed
> already normal build on aarch64-linux cross)?

Successfully bootstrapped/regtested on x86_64-linux and i686-linux.

> 2019-05-22  Jakub Jelinek  <jakub@redhat.com>
> 
> 	PR bootstrap/90543
> 	* optc-save-gen.awk: In cl_optimization_print, use correct condition
> 	for var_opt_string printing.  In cl_optimization_print_diff, print
> 	(null) instead of invoking undefined behavior if one of the
> 	var_opt_string pointers is NULL and use && instead of first || in the
> 	guarding condition.  For var_target_other options, handle const char *
> 	target variables similarly to const char * optimize node variables.

	Jakub
Jakub Jelinek May 29, 2019, 7:47 a.m. UTC | #2
On Wed, May 22, 2019 at 01:41:56PM +0200, Jakub Jelinek wrote:
> 2019-05-22  Jakub Jelinek  <jakub@redhat.com>
> 
> 	PR bootstrap/90543
> 	* optc-save-gen.awk: In cl_optimization_print, use correct condition
> 	for var_opt_string printing.  In cl_optimization_print_diff, print
> 	(null) instead of invoking undefined behavior if one of the
> 	var_opt_string pointers is NULL and use && instead of first || in the
> 	guarding condition.  For var_target_other options, handle const char *
> 	target variables similarly to const char * optimize node variables.

I'd like to ping this patch.

Thanks.

	Jakub
Richard Biener May 29, 2019, 9:29 a.m. UTC | #3
On Wed, 29 May 2019, Jakub Jelinek wrote:

> On Wed, May 22, 2019 at 01:41:56PM +0200, Jakub Jelinek wrote:
> > 2019-05-22  Jakub Jelinek  <jakub@redhat.com>
> > 
> > 	PR bootstrap/90543
> > 	* optc-save-gen.awk: In cl_optimization_print, use correct condition
> > 	for var_opt_string printing.  In cl_optimization_print_diff, print
> > 	(null) instead of invoking undefined behavior if one of the
> > 	var_opt_string pointers is NULL and use && instead of first || in the
> > 	guarding condition.  For var_target_other options, handle const char *
> > 	target variables similarly to const char * optimize node variables.
> 
> I'd like to ping this patch.

OK.

Richard.
Jakub Jelinek Sept. 29, 2019, 10:08 a.m. UTC | #4
On Sun, Sep 29, 2019 at 06:34:04PM +1000, Michael Chamberlain wrote:
> The last line modified above will print ptr1->..., but I think it should be
> using ptr2 both in the condition and the true alternative.

You're right, fixed thusly, committed as obvious to trunk so far, will
backport to 9.3 too.

2019-09-29  Jakub Jelinek  <jakub@redhat.com>

	PR bootstrap/90543
	* optc-save-gen.awk: Fix up printing string option differences.

--- gcc/optc-save-gen.awk.jj	2019-05-29 11:31:46.073468357 +0200
+++ gcc/optc-save-gen.awk	2019-09-29 12:03:52.338731952 +0200
@@ -332,7 +332,7 @@ for (i = 0; i < n_opt_string; i++) {
 	print "             indent_to, \"\",";
 	print "             \"" name "\",";
 	print "             ptr1->x_" name " ? ptr1->x_" name " : \"(null)\",";
-	print "             ptr2->x_" name " ? ptr1->x_" name " : \"(null)\");";
+	print "             ptr2->x_" name " ? ptr2->x_" name " : \"(null)\");";
 	print "";
 }
 


	Jakub
diff mbox series

Patch

--- gcc/optc-save-gen.awk.jj	2019-02-15 08:16:22.838993512 +0100
+++ gcc/optc-save-gen.awk	2019-05-22 13:33:11.128183956 +0200
@@ -253,7 +253,7 @@  for (i = 0; i < n_opt_char; i++) {
 }
 
 for (i = 0; i < n_opt_string; i++) {
-	print "  if (ptr->x_" var_opt_char[i] ")";
+	print "  if (ptr->x_" var_opt_string[i] ")";
 	print "    fprintf (file, \"%*s%s (%s)\\n\",";
 	print "             indent_to, \"\",";
 	print "             \"" var_opt_string[i] "\",";
@@ -326,13 +326,13 @@  for (i = 0; i < n_opt_char; i++) {
 for (i = 0; i < n_opt_string; i++) {
 	name = var_opt_string[i]
 	print "  if (ptr1->x_" name " != ptr2->x_" name "";
-	print "      || (!ptr1->x_" name" || !ptr2->x_" name
+	print "      && (!ptr1->x_" name" || !ptr2->x_" name
 	print "          || strcmp (ptr1->x_" name", ptr2->x_" name ")))";
 	print "    fprintf (file, \"%*s%s (%s/%s)\\n\",";
 	print "             indent_to, \"\",";
 	print "             \"" name "\",";
-	print "             ptr1->x_" name ",";
-	print "             ptr2->x_" name ");";
+	print "             ptr1->x_" name " ? ptr1->x_" name " : \"(null)\",";
+	print "             ptr2->x_" name " ? ptr1->x_" name " : \"(null)\");";
 	print "";
 }
 
@@ -349,6 +349,7 @@  n_target_char = 0;
 n_target_short = 0;
 n_target_int = 0;
 n_target_enum = 0;
+n_target_string = 0;
 n_target_other = 0;
 
 if (have_save) {
@@ -381,6 +382,8 @@  if (have_save) {
 				if (otype == var_type(flags[i]))
 					var_target_range[name] = ""
 			}
+			else if (otype ~ "^const char \\**$")
+				var_target_string[n_target_string++] = name;
 			else
 				var_target_other[n_target_other++] = name;
 		}
@@ -429,6 +432,10 @@  for (i = 0; i < n_target_char; i++) {
 	print "  ptr->x_" var_target_char[i] " = opts->x_" var_target_char[i] ";";
 }
 
+for (i = 0; i < n_target_string; i++) {
+	print "  ptr->x_" var_target_string[i] " = opts->x_" var_target_string[i] ";";
+}
+
 print "}";
 
 print "";
@@ -461,6 +468,10 @@  for (i = 0; i < n_target_char; i++) {
 	print "  opts->x_" var_target_char[i] " = ptr->x_" var_target_char[i] ";";
 }
 
+for (i = 0; i < n_target_string; i++) {
+	print "  opts->x_" var_target_string[i] " = ptr->x_" var_target_string[i] ";";
+}
+
 # This must occur after the normal variables in case the code depends on those
 # variables.
 print "";
@@ -530,6 +541,15 @@  for (i = 0; i < n_target_char; i++) {
 	print "";
 }
 
+for (i = 0; i < n_target_string; i++) {
+	print "  if (ptr->x_" var_target_string[i] ")";
+	print "    fprintf (file, \"%*s%s (%s)\\n\",";
+	print "             indent, \"\",";
+	print "             \"" var_target_string[i] "\",";
+	print "             ptr->x_" var_target_string[i] ");";
+	print "";
+}
+
 print "";
 print "  if (targetm.target_option.print)";
 print "    targetm.target_option.print (file, indent, ptr);";
@@ -605,6 +625,19 @@  for (i = 0; i < n_target_char; i++) {
 	print "";
 }
 
+for (i = 0; i < n_target_string; i++) {
+	name = var_target_string[i]
+	print "  if (ptr1->x_" name " != ptr2->x_" name "";
+	print "      && (!ptr1->x_" name" || !ptr2->x_" name
+	print "          || strcmp (ptr1->x_" name", ptr2->x_" name ")))";
+	print "    fprintf (file, \"%*s%s (%s/%s)\\n\",";
+	print "             indent, \"\",";
+	print "             \"" name "\",";
+	print "             ptr1->x_" name " ? ptr1->x_" name " : \"(null)\",";
+	print "             ptr2->x_" name " ? ptr1->x_" name " : \"(null)\");";
+	print "";
+}
+
 print "}";
 
 print "";