[gcc(refs/users/marxin/heads/record-gcc-switches-factoring)] Change semantics of -frecord-gcc-switches and add -frecord-gcc-switches-format.

Martin Liska marxin@gcc.gnu.org
Thu Nov 26 14:19:12 GMT 2020


https://gcc.gnu.org/g:979aa353e1ab09c09b042564d867088bfb7c8b12

commit 979aa353e1ab09c09b042564d867088bfb7c8b12
Author: Martin Liska <mliska@suse.cz>
Date:   Mon Nov 23 14:10:38 2020 +0100

    Change semantics of -frecord-gcc-switches and add -frecord-gcc-switches-format.
    
    gcc/ChangeLog:
    
            * common.opt: Document new options -frecord-gcc-switches-format
            and -frecord-gcc-switches-file.
            * doc/invoke.texi: Document the new options.
            * dwarf2out.c (dwarf2out_early_finish): Respect
            flag_record_gcc_switches_format.
            * flag-types.h (enum record_gcc_switches_format): New.
            * gcc.c (save_driver_cmdline): Save command line to a temporary
            file.
            (driver::main): Call set_commandline.
            (driver::set_commandline): New.
            * gcc.h (set_commandline): New.
            * opts.c (get_driver_command_line): New.
            * opts.h (get_driver_command_line): New.
            * toplev.c (init_asm_output): Use new function get_producer_string.
            (process_options): Respect flag_record_gcc_switches_format
            option.
    
    Co-Authored-By: Egeyar Bagcioglu  <egeyar.bagcioglu@oracle.com>

Diff:
---
 gcc/common.opt      | 19 ++++++++++++++++++-
 gcc/doc/invoke.texi | 23 ++++++++++++++++++++++-
 gcc/dwarf2out.c     | 17 ++++++++++++-----
 gcc/flag-types.h    |  7 +++++++
 gcc/gcc.c           | 37 ++++++++++++++++++++++++++++++++++++-
 gcc/gcc.h           |  1 +
 gcc/opts.c          | 31 +++++++++++++++++++++++++++++++
 gcc/opts.h          |  2 ++
 gcc/toplev.c        | 27 ++++++++++++++++++++-------
 9 files changed, 149 insertions(+), 15 deletions(-)

diff --git a/gcc/common.opt b/gcc/common.opt
index ca8a2690799..3492e14cb1e 100644
--- a/gcc/common.opt
+++ b/gcc/common.opt
@@ -2322,9 +2322,26 @@ Common Joined RejectNegative Var(common_deferred_options) Defer
 ; records information in the assembler output file as comments, so
 ; they never reach the object file.
 frecord-gcc-switches
-Common Report Var(flag_record_gcc_switches)
+Common Driver Report Var(flag_record_gcc_switches)
 Record gcc command line switches in the object file.
 
+Enum
+Name(record_gcc_switches_format) Type(enum record_gcc_switches_format)
+
+EnumValue
+Enum(record_gcc_switches_format) String(processed) Value(RECORD_GCC_SWITCHES_PROCESSED)
+
+EnumValue
+Enum(record_gcc_switches_format) String(driver) Value(RECORD_GCC_SWITCHES_DRIVER)
+
+frecord-gcc-switches-format=
+Common Report Joined RejectNegative Var(flag_record_gcc_switches_format) Enum(record_gcc_switches_format) Init(RECORD_GCC_SWITCHES_PROCESSED)
+-frecord-gcc-switches-format=[processed|driver]	Format of recorded gcc command line switches.
+
+frecord-gcc-switches-file=
+Common Report Joined RejectNegative Var(flag_record_gcc_switches_file) Undocumented
+Path to file that contains driver command line options.
+
 freg-struct-return
 Common Report Var(flag_pcc_struct_return,0) Optimization
 Return small aggregates in registers.
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index 26372a2435a..d7e43c84ffc 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -642,7 +642,7 @@ Objective-C and Objective-C++ Dialects}.
 -finhibit-size-directive  -fcommon  -fno-ident @gol
 -fpcc-struct-return  -fpic  -fPIC  -fpie  -fPIE  -fno-plt @gol
 -fno-jump-tables -fno-bit-tests @gol
--frecord-gcc-switches @gol
+-frecord-gcc-switches -frecord-gcc-switches-format @gol
 -freg-struct-return  -fshort-enums  -fshort-wchar @gol
 -fverbose-asm  -fpack-struct[=@var{n}]  @gol
 -fleading-underscore  -ftls-model=@var{model} @gol
@@ -16022,6 +16022,27 @@ comments, so it never reaches the object file.
 See also @option{-grecord-gcc-switches} for another
 way of storing compiler options into the object file.
 
+@item -frecord-gcc-switches-format=@var{format}
+@opindex frecord-gcc-switches-format
+This switch controls the output format of options that record
+the command line.  The affected options are @option{-frecord-gcc-switches},
+@option{-grecord-gcc-switches} and @option{-fverbose-asm}.
+
+The @var{format} argument should be one of the following:
+
+@table @samp
+
+@item processed
+
+Options are printed after processing by the compiler driver.
+It is the default option value.
+
+@item driver
+
+Options are printed as provided to the compiler driver.
+
+@end table
+
 @item -fpic
 @opindex fpic
 @cindex global offset table
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 82303751fce..c584bb1a7c5 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -32036,13 +32036,20 @@ dwarf2out_early_finish (const char *filename)
      header compilation, so always fill it with empty string initially
      and overwrite only here.  */
   dw_attr_node *producer = get_AT (comp_unit_die (), DW_AT_producer);
+  producer_string = concat (lang_hooks.name, " ", version_string, NULL);
 
   if (dwarf_record_gcc_switches)
-    producer_string = gen_producer_string (lang_hooks.name,
-					   save_decoded_options,
-					   save_decoded_options_count);
-  else
-    producer_string = concat (lang_hooks.name, " ", version_string, NULL);
+    {
+      char *producer_string_old = producer_string;
+      if (flag_record_gcc_switches_format == RECORD_GCC_SWITCHES_DRIVER)
+	producer_string = concat (producer_string, " ",
+				  get_driver_command_line (), NULL);
+      else
+	producer_string = gen_producer_string (lang_hooks.name,
+					       save_decoded_options,
+					       save_decoded_options_count);
+      free (producer_string_old);
+    }
 
   producer->dw_attr_val.v.val_str->refcount--;
   producer->dw_attr_val.v.val_str = find_AT_string (producer_string);
diff --git a/gcc/flag-types.h b/gcc/flag-types.h
index 0dbab19943c..fa46de9e9bf 100644
--- a/gcc/flag-types.h
+++ b/gcc/flag-types.h
@@ -424,6 +424,13 @@ enum openacc_kernels
   OPENACC_KERNELS_PARLOOPS
 };
 
+/* Record GCC options type.  */
+enum record_gcc_switches_format
+{
+  RECORD_GCC_SWITCHES_PROCESSED = 0,
+  RECORD_GCC_SWITCHES_DRIVER
+};
+
 #endif
 
 #endif /* ! GCC_FLAG_TYPES_H */
diff --git a/gcc/gcc.c b/gcc/gcc.c
index d78b5f582b5..a13e26c0c9f 100644
--- a/gcc/gcc.c
+++ b/gcc/gcc.c
@@ -235,6 +235,12 @@ static int verbose_only_flag;
 
 static int print_subprocess_help;
 
+/* argc and argv provided to the driver.  Necessary to keep for when
+   -frecord-gcc-switches-format=driver is given.  */
+
+static unsigned int driver_gcc_argc;
+static const char **driver_gcc_argv;
+
 /* Linker suffix passed to -fuse-ld=... */
 static const char *use_ld;
 
@@ -433,6 +439,7 @@ static const char *greater_than_spec_func (int, const char **);
 static const char *debug_level_greater_than_spec_func (int, const char **);
 static const char *dwarf_version_greater_than_spec_func (int, const char **);
 static const char *find_fortran_preinclude_file (int, const char **);
+static const char *save_driver_cmdline (int, const char **);
 static char *convert_white_space (char *);
 static char *quote_spec (char *);
 static char *quote_spec_arg (char *);
@@ -1255,7 +1262,9 @@ static const char *cc1_options =
  %{coverage:-fprofile-arcs -ftest-coverage}\
  %{fprofile-arcs|fprofile-generate*|coverage:\
    %{!fprofile-update=single:\
-     %{pthread:-fprofile-update=prefer-atomic}}}";
+     %{pthread:-fprofile-update=prefer-atomic}}}\
+ %{frecord-gcc-switches-format=driver:-frecord-gcc-switches-file=%:save-driver-cmdline(%g.cmdline)\
+   %<-frecord-gcc-switches-format=driver}";
 
 static const char *asm_options =
 "%{-target-help:%:print-asm-header()} "
@@ -1747,6 +1756,7 @@ static const struct spec_function static_spec_functions[] =
   { "debug-level-gt",		debug_level_greater_than_spec_func },
   { "dwarf-version-gt",		dwarf_version_greater_than_spec_func },
   { "fortran-preinclude-file",	find_fortran_preinclude_file},
+  { "save-driver-cmdline",	save_driver_cmdline},
 #ifdef EXTRA_SPEC_FUNCTIONS
   EXTRA_SPEC_FUNCTIONS
 #endif
@@ -7991,6 +8001,7 @@ driver::main (int argc, char **argv)
 
   set_progname (argv[0]);
   expand_at_files (&argc, &argv);
+  set_commandline (argc, const_cast <const char **> (argv));
   decode_argv (argc, const_cast <const char **> (argv));
   global_initializations ();
   build_multilib_strings ();
@@ -8034,6 +8045,15 @@ driver::set_progname (const char *argv0) const
   xmalloc_set_program_name (progname);
 }
 
+/* Keep the command line for -frecord-gcc-switches-format=driver.  */
+
+void
+driver::set_commandline (int argc, const char **argv) const
+{
+  driver_gcc_argc = argc;
+  driver_gcc_argv = argv;
+}
+
 /* Expand any @ files within the command-line args,
    setting at_file_supplied if any were expanded.  */
 
@@ -10771,6 +10791,21 @@ find_fortran_preinclude_file (int argc, const char **argv)
   return result;
 }
 
+/* Save driver options to a temporary file.  */
+
+static const char *
+save_driver_cmdline (int argc ATTRIBUTE_UNUSED,
+		     const char **argv)
+{
+  FILE *f = fopen (argv[0], "w");
+  for (unsigned int i = 0; i < driver_gcc_argc; i++)
+    fprintf (f, i == 0 ? "%s" : " %s", driver_gcc_argv[i]);
+  fclose (f);
+
+  return argv[0];
+}
+
+
 /* If any character in ORIG fits QUOTE_P (_, P), reallocate the string
    so as to precede every one of them with a backslash.  Return the
    original string or the reallocated one.  */
diff --git a/gcc/gcc.h b/gcc/gcc.h
index 70d8f08f059..cde77fbaad7 100644
--- a/gcc/gcc.h
+++ b/gcc/gcc.h
@@ -37,6 +37,7 @@ class driver
 
  private:
   void set_progname (const char *argv0) const;
+  void set_commandline (int argc, const char **argv) const;
   void expand_at_files (int *argc, char ***argv) const;
   void decode_argv (int argc, const char **argv);
   void global_initializations ();
diff --git a/gcc/opts.c b/gcc/opts.c
index 1be7c43aa09..d850da8f531 100644
--- a/gcc/opts.c
+++ b/gcc/opts.c
@@ -3236,6 +3236,7 @@ gen_producer_string (const char *language_string, cl_decoded_option *options,
       case OPT_SPECIAL_input_file:
       case OPT_grecord_gcc_switches:
       case OPT_frecord_gcc_switches:
+      case OPT_frecord_gcc_switches_format_:
       case OPT__output_pch_:
       case OPT_fdiagnostics_show_location_:
       case OPT_fdiagnostics_show_option:
@@ -3308,6 +3309,36 @@ gen_producer_string (const char *language_string, cl_decoded_option *options,
   return producer;
 }
 
+/* Return value of env variable GCC_DRIVER_COMMAND_LINE if exists.
+   Otherwise return empty string.  */
+
+const char *
+get_driver_command_line ()
+{
+  static char *cmdline = NULL;
+
+  if (cmdline != NULL)
+    return cmdline;
+
+  FILE *f = fopen (flag_record_gcc_switches_file, "r");
+  if (f == NULL)
+    fatal_error (UNKNOWN_LOCATION, "cannot open %s: %m", flag_record_gcc_switches_file);
+
+  fseek(f, 0, SEEK_END);
+  unsigned int size = ftell (f);
+  fseek(f, 0, SEEK_SET);
+
+  cmdline = XNEWVEC (char, size + 1);
+
+  unsigned int read;
+  char *ptr = cmdline;
+  while ((read = fread (ptr, 4096, 1, f)))
+    ptr += read;
+
+  cmdline[size] = '\0';
+  return cmdline;
+}
+
 #if CHECKING_P
 
 namespace selftest {
diff --git a/gcc/opts.h b/gcc/opts.h
index 4ad6b2571f9..0e442e7f6e7 100644
--- a/gcc/opts.h
+++ b/gcc/opts.h
@@ -486,6 +486,8 @@ extern char *gen_producer_string (const char *language_string,
 				  cl_decoded_option *options,
 				  unsigned int options_count);
 
+extern const char *get_driver_command_line ();
+
 /* Set OPTION in OPTS to VALUE if the option is not set in OPTS_SET.  */
 
 #define SET_OPTION_IF_UNSET(OPTS, OPTS_SET, OPTION, VALUE) \
diff --git a/gcc/toplev.c b/gcc/toplev.c
index 5953d761e75..239aa484fd8 100644
--- a/gcc/toplev.c
+++ b/gcc/toplev.c
@@ -728,11 +728,21 @@ init_asm_output (const char *name)
 	{
 	  if (targetm.asm_out.record_gcc_switches)
 	    {
-	      const char *str
-		= gen_producer_string (lang_hooks.name,
-				       save_decoded_options,
-				       save_decoded_options_count);
-	      targetm.asm_out.record_gcc_switches (str);
+	      if (flag_record_gcc_switches_format == RECORD_GCC_SWITCHES_DRIVER)
+		{
+		  const char *str = concat (version_string, " ",
+					    get_driver_command_line (), NULL);
+		  targetm.asm_out.record_gcc_switches (str);
+		  free (CONST_CAST (char *, str));
+		}
+	      else
+		{
+		  const char *str
+		    = gen_producer_string (lang_hooks.name,
+					   save_decoded_options,
+					   save_decoded_options_count);
+		  targetm.asm_out.record_gcc_switches (str);
+		}
 	    }
 	  else
 	    inform (UNKNOWN_LOCATION,
@@ -1380,8 +1390,11 @@ process_options (void)
       print_version (stderr, "", true);
       if (!quiet_flag)
 	{
-	  fputs (gen_producer_string (lang_hooks.name, save_decoded_options,
-				      save_decoded_options_count), stderr);
+	  if (flag_record_gcc_switches_format == RECORD_GCC_SWITCHES_DRIVER)
+	    fputs (get_driver_command_line (), stderr);
+	  else
+	    fputs (gen_producer_string (lang_hooks.name, save_decoded_options,
+					save_decoded_options_count), stderr);
 	  fputc ('\n', stderr);
 	}
     }


More information about the Gcc-cvs mailing list