On 16 August 2012 09:38, Gerald Pfeifer <ger...@pfeifer.com> wrote:
>
> On Wed, 15 Aug 2012, Simon Baldwin wrote:
> > This creates a problem for build and packaging systems that are
> > fanatical about binary reproducibility and checksums.  Temporary file
> > names differ on each compilation, so that two different builds of
> > libgfortran.a, and by extension all of gcc, will not be bit-identical.
> >
> > Anyone else encountered this?  Bug or feature?  There are several
> > possible and relatively easy fixes -- any thoughts or feedback on
> > which fixes might be better, or worse?  Something for mainline or for
> > only google-specific branches?
>
> Based on what I am seeing with various build systems and hear some
> users say, I'd love to see this addressed on mainline.

Thanks for the note.

To make things more concrete I've appended a prototype patch below.  I
don't know if any other languages are affected, but if they are this
patch should extend reasonably well to cover those also.  Does anyone
have strong objections to this approach?  Thanks.

----------
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 lang_hook to filter language-specific command line
options, and making that filter omit OPT_cpp_ for fortran.

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

gcc/ChangeLog
2012-08-16  Simon Baldwin  <sim...@google.com>

        * dwarf2out.c (gen_producer_string): Add call to lang hooks to
        filter decoded options codes.
        * langhooks.c (lhd_no_dwarf_record_gcc_switch): New.
        * langhooks.h (no_dwarf_record_gcc_switch): New lang_hooks member.
        * langhooks-def.h (lhd_no_dwarf_record_gcc_switch): New declaration.

gcc/fortran/ChangeLog
        * gfortran.h (gfc_no_dwarf_record_gcc_switch): New declaration.
        * f95-lang.c (LANG_HOOKS_NO_DWARF_RECORD_GCC_SWITCH): Define.
        * options.c (gfc_no_dwarf_record_gcc_switch): New, omits OPT_cpp_
        from the Dwarf producer string.


Index: gcc/dwarf2out.c
===================================================================
--- gcc/dwarf2out.c     (revision 190442)
+++ gcc/dwarf2out.c     (working copy)
@@ -18101,6 +18101,10 @@ gen_producer_string (void)
        /* Ignore these.  */
        continue;
       default:
+       if (lang_hooks.no_dwarf_record_gcc_switch (save_decoded_options[j]
+                                                  .opt_index))
+          /* Ignore anything the language wants omitted.  */
+         continue;
         gcc_checking_assert (save_decoded_options[j].canonical_option[0][0]
                             == '-');
         switch (save_decoded_options[j].canonical_option[0][1])
Index: gcc/fortran/gfortran.h
===================================================================
--- gcc/fortran/gfortran.h      (revision 190442)
+++ gcc/fortran/gfortran.h      (working copy)
@@ -2432,6 +2432,7 @@ bool gfc_handle_option (size_t, const ch
                        const struct cl_option_handlers *);
 bool gfc_post_options (const char **);
 char *gfc_get_option_string (void);
+bool gfc_no_dwarf_record_gcc_switch (size_t);

 /* f95-lang.c */
 void gfc_maybe_initialize_eh (void);
Index: gcc/fortran/f95-lang.c
===================================================================
--- gcc/fortran/f95-lang.c      (revision 190442)
+++ gcc/fortran/f95-lang.c      (working copy)
@@ -98,6 +98,7 @@ static tree gfc_builtin_function (tree);
 #undef LANG_HOOKS_INIT_OPTIONS_STRUCT
 #undef LANG_HOOKS_INIT_OPTIONS
 #undef LANG_HOOKS_HANDLE_OPTION
+#undef LANG_HOOKS_NO_DWARF_RECORD_GCC_SWITCH
 #undef LANG_HOOKS_POST_OPTIONS
 #undef LANG_HOOKS_PARSE_FILE
 #undef LANG_HOOKS_MARK_ADDRESSABLE
@@ -129,6 +130,7 @@ static tree gfc_builtin_function (tree);
 #define LANG_HOOKS_INIT_OPTIONS_STRUCT  gfc_init_options_struct
 #define LANG_HOOKS_INIT_OPTIONS         gfc_init_options
 #define LANG_HOOKS_HANDLE_OPTION        gfc_handle_option
+#define LANG_HOOKS_NO_DWARF_RECORD_GCC_SWITCH  gfc_no_dwarf_record_gcc_switch
 #define LANG_HOOKS_POST_OPTIONS                gfc_post_options
 #define LANG_HOOKS_PARSE_FILE           gfc_be_parse_file
 #define LANG_HOOKS_TYPE_FOR_MODE       gfc_type_for_mode
Index: gcc/fortran/options.c
===================================================================
--- gcc/fortran/options.c       (revision 190442)
+++ gcc/fortran/options.c       (working copy)
@@ -1171,3 +1171,15 @@ gfc_get_option_string (void)
   result[--pos] = '\0';
   return result;
 }
+
+/* Return 1 to suppress this language-specific option from the Dwarf
+   producer string.  */
+
+bool
+gfc_no_dwarf_record_gcc_switch (size_t scode)
+{
+  enum opt_code code = (enum opt_code) scode;
+
+  /* Suppress internal "--cpp=<temporary file", allow everything else.  */
+  return code == OPT_cpp_;
+}
Index: gcc/langhooks.c
===================================================================
--- gcc/langhooks.c     (revision 190442)
+++ gcc/langhooks.c     (working copy)
@@ -362,6 +362,13 @@ lhd_handle_option (size_t code ATTRIBUTE
   return false;
 }

+/* By default, all language-specific options are recorded.  */
+bool
+lhd_no_dwarf_record_gcc_switch (size_t scode)
+{
+  return false;
+}
+
 /* The default function to print out name of current function that caused
    an error.  */
 void
Index: gcc/langhooks.h
===================================================================
--- gcc/langhooks.h     (revision 190442)
+++ gcc/langhooks.h     (working copy)
@@ -298,6 +298,10 @@ struct lang_hooks
                         location_t loc,
                         const struct cl_option_handlers *handlers);

+  /* Return true if the command line flag indicated by SCODE should be
+     omitted from the Dwarf producer string.  */
+  bool (*no_dwarf_record_gcc_switch) (size_t scode);
+
   /* Called when all command line options have been parsed to allow
      further processing and initialization

Index: gcc/langhooks-def.h
===================================================================
--- gcc/langhooks-def.h (revision 190442)
+++ gcc/langhooks-def.h (working copy)
@@ -69,6 +69,7 @@ extern void lhd_init_options (unsigned i
 extern bool lhd_complain_wrong_lang_p (const struct cl_option *);
 extern bool lhd_handle_option (size_t, const char *, int, int, location_t,
                               const struct cl_option_handlers *);
+extern bool lhd_no_dwarf_record_gcc_switch (size_t);


 /* Declarations for tree gimplification hooks.  */
@@ -90,6 +91,7 @@ extern void lhd_omp_firstprivatize_type_
 #define LANG_HOOKS_INITIALIZE_DIAGNOSTICS lhd_initialize_diagnostics
 #define LANG_HOOKS_COMPLAIN_WRONG_LANG_P lhd_complain_wrong_lang_p
 #define LANG_HOOKS_HANDLE_OPTION       lhd_handle_option
+#define LANG_HOOKS_NO_DWARF_RECORD_GCC_SWITCH lhd_no_dwarf_record_gcc_switch
 #define LANG_HOOKS_POST_OPTIONS                lhd_post_options
 #define LANG_HOOKS_MISSING_NORETURN_OK_P hook_bool_tree_true
 #define LANG_HOOKS_GET_ALIAS_SET       lhd_get_alias_set
@@ -262,6 +264,7 @@ extern void lhd_end_section (void);
   LANG_HOOKS_INITIALIZE_DIAGNOSTICS, \
   LANG_HOOKS_COMPLAIN_WRONG_LANG_P, \
   LANG_HOOKS_HANDLE_OPTION, \
+  LANG_HOOKS_NO_DWARF_RECORD_GCC_SWITCH, \
   LANG_HOOKS_POST_OPTIONS, \
   LANG_HOOKS_INIT, \
   LANG_HOOKS_FINISH, \

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

Reply via email to