Re: Reproducible gcc builds, gfortran, and -grecord-gcc-switches

2012-08-24 Thread Simon Baldwin
On 21 August 2012 17:18, Joseph S. Myers jos...@codesourcery.com wrote:

 On Tue, 21 Aug 2012, Simon Baldwin wrote:

  Index: gcc/doc/options.texi
  ===
  --- gcc/doc/options.texi  (revision 190535)
  +++ gcc/doc/options.texi  (working copy)
  @@ -468,4 +468,8 @@ of @option{-@var{opt}}, if not explicitl
   specify several different languages.  Each @var{language} must have
   been declared by an earlier @code{Language} record.  @xref{Option file
   format}.
  +
  +@item NoDWARFRecord
  +The option is added to the list of those omitted from the producer
  string
  +written by @option{-grecord-gcc-switches}.

 Remove added to the list of those (which seems unnecessarily verbose).

  +@item @samp{nodwarfrecord}
  +Display only those options that are marked for addition to the list of
  +options omitted from @option{-grecord-gcc-switches}.

 I don't think there's any need for special --help support for options with
 this flag; this flag is really an implementation detail.  (Thus, I think
 all the opts.c changes are unnecessary.)

Thanks, revised and shorter version below.  Please take another look when ready.

--
Omit OPT_cpp_ from the DWARF producer string in gfortran.

Gfortran uses -cpp=temporary file internally, and with -grecord_gcc_switches
this command line switch is stored by default in object files.  This causes
problems with build and packaging systems that care about gcc binary
reproducibility and file checksums; the temporary file is different on each
compiler invocation.

Fixed by adding a new opt marker NoDWARFRecord and associated flag, filtering
options for this this setting when writing the producer string, and setting
this flag for fortran -cpp=temporary file

Tested for fortran (suppresses -cpp=...) and c (no effect).

gcc/ChangeLog
2012-08-24  Simon Baldwin  sim...@google.com

* dwarf2out.c (gen_producer_string): Omit command line switch if
CL_NO_DWARF_RECORD flag set.
* opts.h (CL_NO_DWARF_RECORD): New.
* opt-functions.awk (switch_flags): Add NoDWARFRecord.
* doc/options.texi: Document NoDWARFRecord option flag.

gcc/fortran/ChangeLog
2012-08-24  Simon Baldwin  sim...@google.com

* lang.opt (-cpp=): Mark flag NoDWARFRecord.


Index: gcc/doc/options.texi
===
--- gcc/doc/options.texi(revision 190642)
+++ gcc/doc/options.texi(working copy)
@@ -468,4 +468,8 @@ of @option{-@var{opt}}, if not explicitl
 specify several different languages.  Each @var{language} must have
 been declared by an earlier @code{Language} record.  @xref{Option file
 format}.
+
+@item NoDWARFRecord
+The option is omitted from the producer string written by
+@option{-grecord-gcc-switches}.
 @end table
Index: gcc/dwarf2out.c
===
--- gcc/dwarf2out.c (revision 190642)
+++ gcc/dwarf2out.c (working copy)
@@ -18138,6 +18138,9 @@ gen_producer_string (void)
/* Ignore these.  */
continue;
   default:
+if (cl_options[save_decoded_options[j].opt_index].flags
+CL_NO_DWARF_RECORD)
+ continue;
 gcc_checking_assert (save_decoded_options[j].canonical_option[0][0]
 == '-');
 switch (save_decoded_options[j].canonical_option[0][1])
Index: gcc/opts.h
===
--- gcc/opts.h  (revision 190642)
+++ gcc/opts.h  (working copy)
@@ -145,6 +145,7 @@ extern const unsigned int cl_lang_count;
 #define CL_JOINED  (1U  22) /* If takes joined argument.  */
 #define CL_SEPARATE(1U  23) /* If takes a separate argument.  */
 #define CL_UNDOCUMENTED(1U  24) /* Do not output with 
--help.  */
+#define CL_NO_DWARF_RECORD (1U  25) /* Do not add to producer string.  */

 /* Flags for an enumerated option argument.  */
 #define CL_ENUM_CANONICAL  (1  0) /* Canonical for this value.  */
Index: gcc/fortran/lang.opt
===
--- gcc/fortran/lang.opt(revision 190642)
+++ gcc/fortran/lang.opt(working copy)
@@ -295,7 +295,7 @@ Fortran Negative(nocpp)
 Enable preprocessing

 cpp=
-Fortran Joined Negative(nocpp) Undocumented
+Fortran Joined Negative(nocpp) Undocumented NoDWARFRecord
 ; Internal option generated by specs from -cpp.

 nocpp
Index: gcc/opt-functions.awk
===
--- gcc/opt-functions.awk   (revision 190642)
+++ gcc/opt-functions.awk   (working copy)
@@ -103,6 +103,7 @@ function switch_flags (flags)
  test_flag(JoinedOrMissing, flags,  | CL_JOINED) \
  test_flag(Separate, flags,  | CL_SEPARATE) \
  test_flag(Undocumented, flags,   | CL_UNDOCUMENTED) \
+ test_flag(NoDWARFRecord, flags,   | CL_NO_DWARF_RECORD) \
   

Re: Reproducible gcc builds, gfortran, and -grecord-gcc-switches

2012-08-24 Thread Joseph S. Myers
On Fri, 24 Aug 2012, Simon Baldwin wrote:

 gcc/ChangeLog
 2012-08-24  Simon Baldwin  sim...@google.com
 
   * dwarf2out.c (gen_producer_string): Omit command line switch if
   CL_NO_DWARF_RECORD flag set.
   * opts.h (CL_NO_DWARF_RECORD): New.
   * opt-functions.awk (switch_flags): Add NoDWARFRecord.
   * doc/options.texi: Document NoDWARFRecord option flag.
 
 gcc/fortran/ChangeLog
 2012-08-24  Simon Baldwin  sim...@google.com
 
   * lang.opt (-cpp=): Mark flag NoDWARFRecord.

OK.

-- 
Joseph S. Myers
jos...@codesourcery.com


Re: Reproducible gcc builds, gfortran, and -grecord-gcc-switches

2012-08-21 Thread Simon Baldwin
On 20 August 2012 16:45, Joseph S. Myers jos...@codesourcery.com wrote:

 On Mon, 20 Aug 2012, Simon Baldwin wrote:

   OPT_* for Fortran options only exist when the Fortran front-end is in the
   source tree (whether or not enabled).  I think we try to avoid knowingly
   breaking use cases where people remove some front ends from the source
   tree, although we don't actively test them and no longer provide split-up
   source tarballs.
 
  Thanks for the update.  Which fix should move forwards?

 I think the approach using a new option flag is the way to go, though the
 patch needs (at least) documentation for the new flag in options.texi.


Updated version appended below.  Okay for 4.8 trunk?

--

Omit OPT_cpp_ from the DWARF producer string in gfortran.

Gfortran uses -cpp=temporary file internally, and with -grecord_gcc_switches
this command line switch is stored by default in object files.  This causes
problems with build and packaging systems that care about gcc binary
reproducibility and file checksums; the temporary file is different on each
compiler invocation.

Fixed by adding a new opt marker NoDWARFRecord and associated flag, filtering
options for this this setting when writing the producer string, and setting
this flag for fortran -cpp=temporary file

Tested for fortran (suppresses -cpp=...) and c (no effect).

gcc/ChangeLog
2012-08-21  Simon Baldwin  sim...@google.com

* dwarf2out.c (gen_producer_string): Omit command line switch if
CL_NO_DWARF_RECORD flag set.
* opts.c (print_specific_help): Add CL_NO_DWARF_RECORD handling.
* opts.h (CL_NO_DWARF_RECORD): New.
* opt-functions.awk (switch_flags): Add NoDWARFRecord.
* doc/options.texi: Document NoDWARFRecord option flag.
* doc/invoke.texi: Document --help=nodwarfrecord.

gcc/fortran/ChangeLog
2012-08-21  Simon Baldwin  sim...@google.com

* lang.opt (-cpp=): Mark flag NoDWARFRecord.


Index: gcc/doc/options.texi
===
--- gcc/doc/options.texi(revision 190535)
+++ gcc/doc/options.texi(working copy)
@@ -468,4 +468,8 @@ of @option{-@var{opt}}, if not explicitl
 specify several different languages.  Each @var{language} must have
 been declared by an earlier @code{Language} record.  @xref{Option file
 format}.
+
+@item NoDWARFRecord
+The option is added to the list of those omitted from the producer string
+written by @option{-grecord-gcc-switches}.
 @end table
Index: gcc/doc/invoke.texi
===
--- gcc/doc/invoke.texi (revision 190535)
+++ gcc/doc/invoke.texi (working copy)
@@ -1330,6 +1330,10 @@ sign in the same continuous piece of tex
 @item @samp{separate}
 Display options taking an argument that appears as a separate word
 following the original option, such as: @samp{-o output-file}.
+
+@item @samp{nodwarfrecord}
+Display only those options that are marked for addition to the list of
+options omitted from @option{-grecord-gcc-switches}.
 @end table

 Thus for example to display all the undocumented target-specific
Index: gcc/dwarf2out.c
===
--- gcc/dwarf2out.c (revision 190535)
+++ gcc/dwarf2out.c (working copy)
@@ -18101,6 +18101,9 @@ gen_producer_string (void)
/* Ignore these.  */
continue;
   default:
+if (cl_options[save_decoded_options[j].opt_index].flags
+CL_NO_DWARF_RECORD)
+ continue;
 gcc_checking_assert (save_decoded_options[j].canonical_option[0][0]
 == '-');
 switch (save_decoded_options[j].canonical_option[0][1])
Index: gcc/opts.c
===
--- gcc/opts.c  (revision 190535)
+++ gcc/opts.c  (working copy)
@@ -1186,7 +1186,9 @@ print_specific_help (unsigned int includ
 {
   if (any_flags == 0)
{
- if (include_flags  CL_UNDOCUMENTED)
+ if (include_flags  CL_NO_DWARF_RECORD)
+   description = _(The following options are not recorded by DWARF);
+  else if (include_flags  CL_UNDOCUMENTED)
description = _(The following options are not documented);
  else if (include_flags  CL_SEPARATE)
description = _(The following options take separate arguments);
@@ -1292,7 +1294,7 @@ common_handle_option (struct gcc_options
/* Walk along the argument string, parsing each word in turn.
   The format is:
   arg = [^]{word}[,{arg}]
-  word = {optimizers|target|warnings|undocumented|
+  word = {optimizers|target|warnings|undocumented|nodwarfrecord|
   params|common|language}  */
while (* a != 0)
  {
@@ -1307,6 +1309,7 @@ common_handle_option (struct gcc_options
  { target, CL_TARGET },
  { warnings, CL_WARNING },
  { undocumented, CL_UNDOCUMENTED 

Re: Reproducible gcc builds, gfortran, and -grecord-gcc-switches

2012-08-21 Thread Joseph S. Myers
On Tue, 21 Aug 2012, Simon Baldwin wrote:

 Index: gcc/doc/options.texi
 ===
 --- gcc/doc/options.texi  (revision 190535)
 +++ gcc/doc/options.texi  (working copy)
 @@ -468,4 +468,8 @@ of @option{-@var{opt}}, if not explicitl
  specify several different languages.  Each @var{language} must have
  been declared by an earlier @code{Language} record.  @xref{Option file
  format}.
 +
 +@item NoDWARFRecord
 +The option is added to the list of those omitted from the producer string
 +written by @option{-grecord-gcc-switches}.

Remove added to the list of those (which seems unnecessarily verbose).

 +@item @samp{nodwarfrecord}
 +Display only those options that are marked for addition to the list of
 +options omitted from @option{-grecord-gcc-switches}.

I don't think there's any need for special --help support for options with 
this flag; this flag is really an implementation detail.  (Thus, I think 
all the opts.c changes are unnecessary.)

-- 
Joseph S. Myers
jos...@codesourcery.com


Re: Reproducible gcc builds, gfortran, and -grecord-gcc-switches

2012-08-20 Thread Simon Baldwin
On 17 August 2012 16:55, Joseph S. Myers jos...@codesourcery.com wrote:

 On Fri, 17 Aug 2012, Simon Baldwin wrote:

   You could have just added
 case OPT_cpp_:
   to the switch in gen_producer_string, instead of all this.
 
  Thanks.  I was under the impression, apparently mistaken, that
  OPT_cpp_ exists only if fortran is enabled.

 OPT_* for Fortran options only exist when the Fortran front-end is in the
 source tree (whether or not enabled).  I think we try to avoid knowingly
 breaking use cases where people remove some front ends from the source
 tree, although we don't actively test them and no longer provide split-up
 source tarballs.

Thanks for the update.  Which fix should move forwards?

--
Google UK Limited | Registered Office: Belgrave House, 76 Buckingham
Palace Road, London SW1W 9TQ | Registered in England Number: 3977902


Re: Reproducible gcc builds, gfortran, and -grecord-gcc-switches

2012-08-20 Thread Joseph S. Myers
On Mon, 20 Aug 2012, Simon Baldwin wrote:

  OPT_* for Fortran options only exist when the Fortran front-end is in the
  source tree (whether or not enabled).  I think we try to avoid knowingly
  breaking use cases where people remove some front ends from the source
  tree, although we don't actively test them and no longer provide split-up
  source tarballs.
 
 Thanks for the update.  Which fix should move forwards?

I think the approach using a new option flag is the way to go, though the 
patch needs (at least) documentation for the new flag in options.texi.

-- 
Joseph S. Myers
jos...@codesourcery.com


Re: Reproducible gcc builds, gfortran, and -grecord-gcc-switches

2012-08-17 Thread Simon Baldwin
On 16 August 2012 21:28, Jakub Jelinek ja...@redhat.com wrote:

 On Thu, Aug 16, 2012 at 06:59:09PM +0200, Simon Baldwin wrote:
  On 16 August 2012 16:40, Michael Matz m...@suse.de wrote:
  
   ,,,
  
   Do you have considered to use a new option flag (usable in the .opt files)
   instead of a langhook?  I.e. add a flag cl_dont_record to cl_option, a
   string Norecord for the .opt files, some handling for it in
   opt-functions.awk and the like?
  
   Adding lang-hooks used by debug producers make me twitch :)
 
  Okay.  Below is an alternative approach.
 
  I've moved discussion to gcc-patches, since it's now more concrete
  than abstract.

 You could have just added
   case OPT_cpp_:
 to the switch in gen_producer_string, instead of all this.

Thanks.  I was under the impression, apparently mistaken, that
OPT_cpp_ exists only if fortran is enabled.

--
Google UK Limited | Registered Office: Belgrave House, 76 Buckingham
Palace Road, London SW1W 9TQ | Registered in England Number: 3977902


Re: Reproducible gcc builds, gfortran, and -grecord-gcc-switches

2012-08-17 Thread Joseph S. Myers
On Fri, 17 Aug 2012, Simon Baldwin wrote:

  You could have just added
case OPT_cpp_:
  to the switch in gen_producer_string, instead of all this.
 
 Thanks.  I was under the impression, apparently mistaken, that
 OPT_cpp_ exists only if fortran is enabled.

OPT_* for Fortran options only exist when the Fortran front-end is in the 
source tree (whether or not enabled).  I think we try to avoid knowingly 
breaking use cases where people remove some front ends from the source 
tree, although we don't actively test them and no longer provide split-up 
source tarballs.

-- 
Joseph S. Myers
jos...@codesourcery.com


Re: Reproducible gcc builds, gfortran, and -grecord-gcc-switches

2012-08-16 Thread Jakub Jelinek
On Thu, Aug 16, 2012 at 06:59:09PM +0200, Simon Baldwin wrote:
 On 16 August 2012 16:40, Michael Matz m...@suse.de wrote:
 
  ,,,
 
  Do you have considered to use a new option flag (usable in the .opt files)
  instead of a langhook?  I.e. add a flag cl_dont_record to cl_option, a
  string Norecord for the .opt files, some handling for it in
  opt-functions.awk and the like?
 
  Adding lang-hooks used by debug producers make me twitch :)
 
 Okay.  Below is an alternative approach.
 
 I've moved discussion to gcc-patches, since it's now more concrete
 than abstract.

You could have just added
  case OPT_cpp_:
to the switch in gen_producer_string, instead of all this.

 --- gcc/dwarf2out.c   (revision 190442)
 +++ gcc/dwarf2out.c   (working copy)
 @@ -18101,6 +18101,9 @@ gen_producer_string (void)
   /* Ignore these.  */
   continue;
default:
 +if (cl_options[save_decoded_options[j].opt_index].flags
 +  CL_NO_DWARF_RECORD)
 +   continue;
  gcc_checking_assert (save_decoded_options[j].canonical_option[0][0]
== '-');
  switch (save_decoded_options[j].canonical_option[0][1])

Jakub