Patchwork [google] record compiler options to .note sections

login
register
mail settings
Submitter Dehao Chen
Date Oct. 12, 2011, 4:51 a.m.
Message ID <CAO2gOZW-dSjz5CU6FOyKKA+nX=3XG+LUg2sSd5nY0xY7QfGuzg@mail.gmail.com>
Download mbox | patch
Permalink /patch/119145/
State New
Headers show

Comments

Dehao Chen - Oct. 12, 2011, 4:51 a.m.
Attached is the new patch. Bootstrapped on x86_64, no regressions.

gcc/ChangeLog.google-4_6:
2011-10-08  Dehao Chen  <dehao@google.com>

       Add a flag (-frecord-gcc-switches-in-elf) to record compiler
       command line options to .gnu.switches.text sections of
       the object file.
       * coverage.c (write_opts_to_asm): Write the options to
       .gnu.switches.text sections.
       * common.opt: Ditto.
       * opts.h: Ditto.

gcc/c-family/ChangeLog.google-4_6:
2011-10-08  Dehao Chen  <dehao@google.com>
       * c-opts.c (c_common_parse_file): Write the options to
       .gnu.switches.text sections.

gcc/testsuite/ChangeLog.google-4_6:
2011-10-08  Dehao Chen  <dehao@google.com>

       * gcc.dg/record-gcc-switches-in-elf-1.c: New test.

 cselib.o : cselib.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \
    $(REGS_H) hard-reg-set.h $(FLAGS_H) insn-config.h $(RECOG_H) \
    $(EMIT_RTL_H) $(DIAGNOSTIC_CORE_H) output.h $(FUNCTION_H) $(TREE_PASS_H) \

On Wed, Oct 12, 2011 at 2:12 AM, Cary Coutant <ccoutant@google.com> wrote:
>> How about .gnu.switches.text.quote_paths?
>
> Sounds good to me.
>
> -cary
>
Xinliang David Li - Oct. 12, 2011, 4:54 a.m.
ok.

David

On Tue, Oct 11, 2011 at 9:51 PM, Dehao Chen <dehao@google.com> wrote:
> Attached is the new patch. Bootstrapped on x86_64, no regressions.
>
> gcc/ChangeLog.google-4_6:
> 2011-10-08  Dehao Chen  <dehao@google.com>
>
>       Add a flag (-frecord-gcc-switches-in-elf) to record compiler
>       command line options to .gnu.switches.text sections of
>       the object file.
>       * coverage.c (write_opts_to_asm): Write the options to
>       .gnu.switches.text sections.
>       * common.opt: Ditto.
>       * opts.h: Ditto.
>
> gcc/c-family/ChangeLog.google-4_6:
> 2011-10-08  Dehao Chen  <dehao@google.com>
>       * c-opts.c (c_common_parse_file): Write the options to
>       .gnu.switches.text sections.
>
> gcc/testsuite/ChangeLog.google-4_6:
> 2011-10-08  Dehao Chen  <dehao@google.com>
>
>       * gcc.dg/record-gcc-switches-in-elf-1.c: New test.
>
> Index: gcc/doc/invoke.texi
> ===================================================================
> --- gcc/doc/invoke.texi (revision 179836)
> +++ gcc/doc/invoke.texi (working copy)
> @@ -391,6 +391,7 @@
>  -fpmu-profile-generate=@var{pmuoption} @gol
>  -fpmu-profile-use=@var{pmuoption} @gol
>  -freciprocal-math -fregmove -frename-registers -freorder-blocks @gol
> +-frecord-gcc-switches-in-elf@gol
>  -freorder-blocks-and-partition -freorder-functions @gol
>  -frerun-cse-after-loop -freschedule-modulo-scheduled-loops @gol
>  -fripa -fripa-disallow-asm-modules -fripa-disallow-opt-mismatch @gol
> @@ -8170,6 +8171,11 @@
>  number of times it is called. The params variable
>  "note-cgraph-section-edge-threshold" can be used to only list edges above a
>  certain threshold.
> +
> +@item -frecord-gcc-switches-in-elf
> +@opindex frecord-gcc-switches-in-elf
> +Record the command line options in the .gnu.switches.text elf section
> for sample
> +based LIPO to do module grouping.
>  @end table
>
>  The following options control compiler behavior regarding floating
> Index: gcc/c-family/c-opts.c
> ===================================================================
> --- gcc/c-family/c-opts.c       (revision 179836)
> +++ gcc/c-family/c-opts.c       (working copy)
> @@ -1109,6 +1109,8 @@
>   for (;;)
>     {
>       c_finish_options ();
> +      if (flag_record_gcc_switches_in_elf && i == 0)
> +       write_opts_to_asm ();
>       pch_init ();
>       set_lipo_c_parsing_context (parse_in, i, verbose);
>       push_file_scope ();
> Index: gcc/testsuite/gcc.dg/record-gcc-switches-in-elf-1.c
> ===================================================================
> --- gcc/testsuite/gcc.dg/record-gcc-switches-in-elf-1.c (revision 0)
> +++ gcc/testsuite/gcc.dg/record-gcc-switches-in-elf-1.c (revision 0)
> @@ -0,0 +1,16 @@
> +/* { dg-do compile} */
> +/* { dg-options "-frecord-gcc-switches-in-elf -Dtest -dA" } */
> +
> +void foobar(int);
> +
> +void
> +foo (void)
> +{
> +  int i;
> +  for (i = 0; i < 100; i++)
> +    {
> +      foobar(i);
> +    }
> +}
> +
> +/* { dg-final { scan-assembler-times "Dtest" 1 } } */
> Index: gcc/opts.h
> ===================================================================
> --- gcc/opts.h  (revision 179836)
> +++ gcc/opts.h  (working copy)
> @@ -381,4 +381,5 @@
>  extern void set_struct_debug_option (struct gcc_options *opts,
>                                     location_t loc,
>                                     const char *value);
> +extern void write_opts_to_asm (void);
>  #endif
> Index: gcc/coverage.c
> ===================================================================
> --- gcc/coverage.c      (revision 179836)
> +++ gcc/coverage.c      (working copy)
> @@ -55,6 +55,7 @@
>  #include "diagnostic-core.h"
>  #include "intl.h"
>  #include "l-ipo.h"
> +#include "dwarf2asm.h"
>
>  #include "gcov-io.h"
>  #include "gcov-io.c"
> @@ -2146,4 +2147,69 @@
>   return 0;
>  }
>
> +/* Write command line options to the .note section.  */
> +
> +void
> +write_opts_to_asm (void)
> +{
> +  size_t i;
> +  cpp_dir *quote_paths, *bracket_paths, *pdir;
> +  struct str_list *pdef, *pinc;
> +  int num_quote_paths = 0;
> +  int num_bracket_paths = 0;
> +
> +  get_include_chains (&quote_paths, &bracket_paths);
> +
> +  /* Write quote_paths to ASM section.  */
> +  switch_to_section (get_section (".gnu.switches.text.quote_paths",
> +                                 SECTION_DEBUG, NULL));
> +  for (pdir = quote_paths; pdir; pdir = pdir->next)
> +    {
> +      if (pdir == bracket_paths)
> +       break;
> +      num_quote_paths++;
> +    }
> +  dw2_asm_output_nstring (in_fnames[0], (size_t)-1, NULL);
> +  dw2_asm_output_data_uleb128 (num_quote_paths, NULL);
> +  for (pdir = quote_paths; pdir; pdir = pdir->next)
> +    {
> +      if (pdir == bracket_paths)
> +       break;
> +      dw2_asm_output_nstring (pdir->name, (size_t)-1, NULL);
> +    }
> +
> +  /* Write bracket_paths to ASM section.  */
> +  switch_to_section (get_section (".gnu.switches.text.bracket_paths",
> +                                 SECTION_DEBUG, NULL));
> +  for (pdir = bracket_paths; pdir; pdir = pdir->next)
> +    num_bracket_paths++;
> +  dw2_asm_output_nstring (in_fnames[0], (size_t)-1, NULL);
> +  dw2_asm_output_data_uleb128 (num_bracket_paths, NULL);
> +  for (pdir = bracket_paths; pdir; pdir = pdir->next)
> +    dw2_asm_output_nstring (pdir->name, (size_t)-1, NULL);
> +
> +  /* Write cpp_defines to ASM section.  */
> +  switch_to_section (get_section (".gnu.switches.text.cpp_defines",
> +                                 SECTION_DEBUG, NULL));
> +  dw2_asm_output_nstring (in_fnames[0], (size_t)-1, NULL);
> +  dw2_asm_output_data_uleb128 (num_cpp_defines, NULL);
> +  for (pdef = cpp_defines_head; pdef; pdef = pdef->next)
> +    dw2_asm_output_nstring (pdef->str, (size_t)-1, NULL);
> +
> +  /* Write cpp_includes to ASM section.  */
> +  switch_to_section (get_section (".gnu.switches.text.cpp_includes",
> +                                 SECTION_DEBUG, NULL));
> +  dw2_asm_output_nstring (in_fnames[0], (size_t)-1, NULL);
> +  dw2_asm_output_data_uleb128 (num_cpp_includes, NULL);
> +  for (pinc = cpp_includes_head; pinc; pinc = pinc->next)
> +    dw2_asm_output_nstring (pinc->str, (size_t)-1, NULL);
> +
> +  /* Write cl_args to ASM section.  */
> +  switch_to_section (get_section (".gnu.switches.text.cl_args",
> +                                 SECTION_DEBUG, NULL));
> +  dw2_asm_output_nstring (in_fnames[0], (size_t)-1, NULL);
> +  dw2_asm_output_data_uleb128 (num_lipo_cl_args, NULL);
> +  for (i = 0; i < num_lipo_cl_args; i++)
> +    dw2_asm_output_nstring (lipo_cl_args[i], (size_t)-1, NULL);
> +}
>  #include "gt-coverage.h"
> Index: gcc/common.opt
> ===================================================================
> --- gcc/common.opt      (revision 179836)
> +++ gcc/common.opt      (working copy)
> @@ -1697,6 +1697,14 @@
>  Common Report Var(flag_record_gcc_switches)
>  Record gcc command line switches in the object file.
>
> +; This option differs from frecord-gcc-switches in the way that it
> +; divide the command line options into several categories. And the
> +; section is not mergable so that linker can save gcc switches for
> +; each module.
> +frecord-gcc-switches-in-elf
> +Common Report Var(flag_record_gcc_switches_in_elf)
> +Record the compiler optimizations in a .gnu.switches.text section.
> +
>  freg-struct-return
>  Common Report Var(flag_pcc_struct_return,0) Optimization
>  Return small aggregates in registers
> Index: gcc/Makefile.in
> ===================================================================
> --- gcc/Makefile.in     (revision 179836)
> +++ gcc/Makefile.in     (working copy)
> @@ -3071,7 +3071,7 @@
>    $(TM_H) $(RTL_H) $(TREE_H) $(FLAGS_H) output.h $(REGS_H) $(EXPR_H) \
>    $(FUNCTION_H) $(BASIC_BLOCK_H) toplev.h $(DIAGNOSTIC_CORE_H)
> $(GGC_H) langhooks.h $(COVERAGE_H) \
>    $(HASHTAB_H) tree-iterator.h $(CGRAPH_H) $(TREE_PASS_H) gcov-io.c
> $(TM_P_H) \
> -   opts.h $(TREE_FLOW_H) $(DIAGNOSTIC_CORE_H) intl.h gt-coverage.h l-ipo.h
> +   opts.h $(TREE_FLOW_H) $(DIAGNOSTIC_CORE_H) intl.h gt-coverage.h
> l-ipo.h dwarf2asm.h
>  cselib.o : cselib.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \
>    $(REGS_H) hard-reg-set.h $(FLAGS_H) insn-config.h $(RECOG_H) \
>    $(EMIT_RTL_H) $(DIAGNOSTIC_CORE_H) output.h $(FUNCTION_H) $(TREE_PASS_H) \
>
> On Wed, Oct 12, 2011 at 2:12 AM, Cary Coutant <ccoutant@google.com> wrote:
>>> How about .gnu.switches.text.quote_paths?
>>
>> Sounds good to me.
>>
>> -cary
>>
>

Patch

Index: gcc/doc/invoke.texi
===================================================================
--- gcc/doc/invoke.texi	(revision 179836)
+++ gcc/doc/invoke.texi	(working copy)
@@ -391,6 +391,7 @@ 
 -fpmu-profile-generate=@var{pmuoption} @gol
 -fpmu-profile-use=@var{pmuoption} @gol
 -freciprocal-math -fregmove -frename-registers -freorder-blocks @gol
+-frecord-gcc-switches-in-elf@gol
 -freorder-blocks-and-partition -freorder-functions @gol
 -frerun-cse-after-loop -freschedule-modulo-scheduled-loops @gol
 -fripa -fripa-disallow-asm-modules -fripa-disallow-opt-mismatch @gol
@@ -8170,6 +8171,11 @@ 
 number of times it is called. The params variable
 "note-cgraph-section-edge-threshold" can be used to only list edges above a
 certain threshold.
+
+@item -frecord-gcc-switches-in-elf
+@opindex frecord-gcc-switches-in-elf
+Record the command line options in the .gnu.switches.text elf section
for sample
+based LIPO to do module grouping.
 @end table

 The following options control compiler behavior regarding floating
Index: gcc/c-family/c-opts.c
===================================================================
--- gcc/c-family/c-opts.c	(revision 179836)
+++ gcc/c-family/c-opts.c	(working copy)
@@ -1109,6 +1109,8 @@ 
   for (;;)
     {
       c_finish_options ();
+      if (flag_record_gcc_switches_in_elf && i == 0)
+	write_opts_to_asm ();
       pch_init ();
       set_lipo_c_parsing_context (parse_in, i, verbose);
       push_file_scope ();
Index: gcc/testsuite/gcc.dg/record-gcc-switches-in-elf-1.c
===================================================================
--- gcc/testsuite/gcc.dg/record-gcc-switches-in-elf-1.c	(revision 0)
+++ gcc/testsuite/gcc.dg/record-gcc-switches-in-elf-1.c	(revision 0)
@@ -0,0 +1,16 @@ 
+/* { dg-do compile} */
+/* { dg-options "-frecord-gcc-switches-in-elf -Dtest -dA" } */
+
+void foobar(int);
+
+void
+foo (void)
+{
+  int i;
+  for (i = 0; i < 100; i++)
+    {
+      foobar(i);
+    }
+}
+
+/* { dg-final { scan-assembler-times "Dtest" 1 } } */
Index: gcc/opts.h
===================================================================
--- gcc/opts.h	(revision 179836)
+++ gcc/opts.h	(working copy)
@@ -381,4 +381,5 @@ 
 extern void set_struct_debug_option (struct gcc_options *opts,
 				     location_t loc,
 				     const char *value);
+extern void write_opts_to_asm (void);
 #endif
Index: gcc/coverage.c
===================================================================
--- gcc/coverage.c	(revision 179836)
+++ gcc/coverage.c	(working copy)
@@ -55,6 +55,7 @@ 
 #include "diagnostic-core.h"
 #include "intl.h"
 #include "l-ipo.h"
+#include "dwarf2asm.h"

 #include "gcov-io.h"
 #include "gcov-io.c"
@@ -2146,4 +2147,69 @@ 
   return 0;
 }

+/* Write command line options to the .note section.  */
+
+void
+write_opts_to_asm (void)
+{
+  size_t i;
+  cpp_dir *quote_paths, *bracket_paths, *pdir;
+  struct str_list *pdef, *pinc;
+  int num_quote_paths = 0;
+  int num_bracket_paths = 0;
+
+  get_include_chains (&quote_paths, &bracket_paths);
+
+  /* Write quote_paths to ASM section.  */
+  switch_to_section (get_section (".gnu.switches.text.quote_paths",
+				  SECTION_DEBUG, NULL));
+  for (pdir = quote_paths; pdir; pdir = pdir->next)
+    {
+      if (pdir == bracket_paths)
+	break;
+      num_quote_paths++;
+    }
+  dw2_asm_output_nstring (in_fnames[0], (size_t)-1, NULL);
+  dw2_asm_output_data_uleb128 (num_quote_paths, NULL);
+  for (pdir = quote_paths; pdir; pdir = pdir->next)
+    {
+      if (pdir == bracket_paths)
+	break;
+      dw2_asm_output_nstring (pdir->name, (size_t)-1, NULL);
+    }
+
+  /* Write bracket_paths to ASM section.  */
+  switch_to_section (get_section (".gnu.switches.text.bracket_paths",
+				  SECTION_DEBUG, NULL));
+  for (pdir = bracket_paths; pdir; pdir = pdir->next)
+    num_bracket_paths++;
+  dw2_asm_output_nstring (in_fnames[0], (size_t)-1, NULL);
+  dw2_asm_output_data_uleb128 (num_bracket_paths, NULL);
+  for (pdir = bracket_paths; pdir; pdir = pdir->next)
+    dw2_asm_output_nstring (pdir->name, (size_t)-1, NULL);
+
+  /* Write cpp_defines to ASM section.  */
+  switch_to_section (get_section (".gnu.switches.text.cpp_defines",
+				  SECTION_DEBUG, NULL));
+  dw2_asm_output_nstring (in_fnames[0], (size_t)-1, NULL);
+  dw2_asm_output_data_uleb128 (num_cpp_defines, NULL);
+  for (pdef = cpp_defines_head; pdef; pdef = pdef->next)
+    dw2_asm_output_nstring (pdef->str, (size_t)-1, NULL);
+
+  /* Write cpp_includes to ASM section.  */
+  switch_to_section (get_section (".gnu.switches.text.cpp_includes",
+				  SECTION_DEBUG, NULL));
+  dw2_asm_output_nstring (in_fnames[0], (size_t)-1, NULL);
+  dw2_asm_output_data_uleb128 (num_cpp_includes, NULL);
+  for (pinc = cpp_includes_head; pinc; pinc = pinc->next)
+    dw2_asm_output_nstring (pinc->str, (size_t)-1, NULL);
+
+  /* Write cl_args to ASM section.  */
+  switch_to_section (get_section (".gnu.switches.text.cl_args",
+				  SECTION_DEBUG, NULL));
+  dw2_asm_output_nstring (in_fnames[0], (size_t)-1, NULL);
+  dw2_asm_output_data_uleb128 (num_lipo_cl_args, NULL);
+  for (i = 0; i < num_lipo_cl_args; i++)
+    dw2_asm_output_nstring (lipo_cl_args[i], (size_t)-1, NULL);
+}
 #include "gt-coverage.h"
Index: gcc/common.opt
===================================================================
--- gcc/common.opt	(revision 179836)
+++ gcc/common.opt	(working copy)
@@ -1697,6 +1697,14 @@ 
 Common Report Var(flag_record_gcc_switches)
 Record gcc command line switches in the object file.

+; This option differs from frecord-gcc-switches in the way that it
+; divide the command line options into several categories. And the
+; section is not mergable so that linker can save gcc switches for
+; each module.
+frecord-gcc-switches-in-elf
+Common Report Var(flag_record_gcc_switches_in_elf)
+Record the compiler optimizations in a .gnu.switches.text section.
+
 freg-struct-return
 Common Report Var(flag_pcc_struct_return,0) Optimization
 Return small aggregates in registers
Index: gcc/Makefile.in
===================================================================
--- gcc/Makefile.in	(revision 179836)
+++ gcc/Makefile.in	(working copy)
@@ -3071,7 +3071,7 @@ 
    $(TM_H) $(RTL_H) $(TREE_H) $(FLAGS_H) output.h $(REGS_H) $(EXPR_H) \
    $(FUNCTION_H) $(BASIC_BLOCK_H) toplev.h $(DIAGNOSTIC_CORE_H)
$(GGC_H) langhooks.h $(COVERAGE_H) \
    $(HASHTAB_H) tree-iterator.h $(CGRAPH_H) $(TREE_PASS_H) gcov-io.c
$(TM_P_H) \
-   opts.h $(TREE_FLOW_H) $(DIAGNOSTIC_CORE_H) intl.h gt-coverage.h l-ipo.h
+   opts.h $(TREE_FLOW_H) $(DIAGNOSTIC_CORE_H) intl.h gt-coverage.h
l-ipo.h dwarf2asm.h