Patchwork [google] record compiler options to .note sections

login
register
mail settings
Submitter Dehao Chen
Date Oct. 8, 2011, 10:43 a.m.
Message ID <CAO2gOZXV-DoWSWruuY=KJg9mohXxa7K=Wn6preSzq2MUiNNsqw@mail.gmail.com>
Download mbox | patch
Permalink /patch/118527/
State New
Headers show

Comments

Dehao Chen - Oct. 8, 2011, 10:43 a.m.
This patch records the compiler command-line flags to a .note section,
which could be used by FDO/LIPO.

Bootstrapped on x86_64, no regressions.

Is it ok for google/gcc-4_6 and google/main branches?

Thanks,
Dehao

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

	Add a flag (-frecord-options-in-elf) to record compiler command
	line options to .note sections of the object file.
	* coverage.c (write_opts_to_asm): Write the options to
	.note 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
	.note sections.

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

	* gcc.dg/record-options-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) \
Jakub Jelinek - Oct. 8, 2011, 11:41 a.m.
On Sat, Oct 08, 2011 at 06:43:47PM +0800, Dehao Chen wrote:
> This patch records the compiler command-line flags to a .note section,
> which could be used by FDO/LIPO.
> 
> Bootstrapped on x86_64, no regressions.
> 
> Is it ok for google/gcc-4_6 and google/main branches?

Why yet another record switches option?  Isn't -grecord-gcc-switches
good enough for you (or -frecord-gcc-switches)?

	Jakub
Dehao Chen - Oct. 9, 2011, 1:18 a.m.
Unfortunately -frecord-gcc-switches cannot serve our purpose because
the recorded switches are mergable, i.e. the linker will merge all
options to a set of strings. However, object files may have distinct
compile options. We want to preserve every object file's compile
options when doing LIPO build.

Thanks,
Dehao

On Sat, Oct 8, 2011 at 7:41 PM, Jakub Jelinek <jakub@redhat.com> wrote:
> On Sat, Oct 08, 2011 at 06:43:47PM +0800, Dehao Chen wrote:
>> This patch records the compiler command-line flags to a .note section,
>> which could be used by FDO/LIPO.
>>
>> Bootstrapped on x86_64, no regressions.
>>
>> Is it ok for google/gcc-4_6 and google/main branches?
>
> Why yet another record switches option?  Isn't -grecord-gcc-switches
> good enough for you (or -frecord-gcc-switches)?
>
>        Jakub
>
Jakub Jelinek - Oct. 9, 2011, 9:28 a.m.
On Sun, Oct 09, 2011 at 09:18:25AM +0800, Dehao Chen wrote:
> Unfortunately -frecord-gcc-switches cannot serve our purpose because
> the recorded switches are mergable, i.e. the linker will merge all
> options to a set of strings. However, object files may have distinct
> compile options. We want to preserve every object file's compile
> options when doing LIPO build.

And -grecord-gcc-switches?  That one, although it is mergeable, still
preserves every object files's compile options.

	Jakub
Dehao Chen - Oct. 10, 2011, 1:16 a.m.
On Sun, Oct 9, 2011 at 5:28 PM, Jakub Jelinek <jakub@redhat.com> wrote:
> On Sun, Oct 09, 2011 at 09:18:25AM +0800, Dehao Chen wrote:
>> Unfortunately -frecord-gcc-switches cannot serve our purpose because
>> the recorded switches are mergable, i.e. the linker will merge all
>> options to a set of strings. However, object files may have distinct
>> compile options. We want to preserve every object file's compile
>> options when doing LIPO build.
>
> And -grecord-gcc-switches?  That one, although it is mergeable, still
> preserves every object files's compile options.

I tried -grecord-gcc-switches, but looks like it's not recording
options that I want.

e.g. the following two commands output the same assembly code, while
the former should record one more options.

gcc -g3 -grecord-gcc-switches a.c -Dabcdefgh -Dxyzzzz -I/usr/ -S
gcc -g3 -grecord-gcc-switches a.c -Dabcdefgh -Dxyzzzz -S

Thanks,
Dehao

>
>        Jakub
>
Xinliang David Li - Oct. 10, 2011, 10:38 p.m.
Ok for google branches.

1) document the difference of this option with -grecord-gcc-switches
(this one only record codegen related options, and recorded in debug
section), and with -frecord-gcc-switches?
2) may be better to use option name: -frecord-gcc-switches-in-object

thanks,

David

On Sun, Oct 9, 2011 at 6:16 PM, Dehao Chen <dehao@google.com> wrote:
> On Sun, Oct 9, 2011 at 5:28 PM, Jakub Jelinek <jakub@redhat.com> wrote:
>> On Sun, Oct 09, 2011 at 09:18:25AM +0800, Dehao Chen wrote:
>>> Unfortunately -frecord-gcc-switches cannot serve our purpose because
>>> the recorded switches are mergable, i.e. the linker will merge all
>>> options to a set of strings. However, object files may have distinct
>>> compile options. We want to preserve every object file's compile
>>> options when doing LIPO build.
>>
>> And -grecord-gcc-switches?  That one, although it is mergeable, still
>> preserves every object files's compile options.
>
> I tried -grecord-gcc-switches, but looks like it's not recording
> options that I want.
>
> e.g. the following two commands output the same assembly code, while
> the former should record one more options.
>
> gcc -g3 -grecord-gcc-switches a.c -Dabcdefgh -Dxyzzzz -I/usr/ -S
> gcc -g3 -grecord-gcc-switches a.c -Dabcdefgh -Dxyzzzz -S
>
> Thanks,
> Dehao
>
>>
>>        Jakub
>>
>
Cary Coutant - Oct. 11, 2011, 12:42 a.m.
> Ok for google branches.
>
> 1) document the difference of this option with -grecord-gcc-switches
> (this one only record codegen related options, and recorded in debug
> section), and with -frecord-gcc-switches?
> 2) may be better to use option name: -frecord-gcc-switches-in-object

Sections whose name begins with ".note" are usually SHT_NOTE sections,
and have a specific format. It might be better to choose different
names (like Sri was asked to do with callgraph annotations).

-cary
Dehao Chen - Oct. 11, 2011, 3:04 a.m.
How about .gnu.switches.text.quote_paths?

Thanks,
Dehao

On Tue, Oct 11, 2011 at 8:42 AM, Cary Coutant <ccoutant@google.com> wrote:
>> Ok for google branches.
>>
>> 1) document the difference of this option with -grecord-gcc-switches
>> (this one only record codegen related options, and recorded in debug
>> section), and with -frecord-gcc-switches?
>> 2) may be better to use option name: -frecord-gcc-switches-in-object
>
> Sections whose name begins with ".note" are usually SHT_NOTE sections,
> and have a specific format. It might be better to choose different
> names (like Sri was asked to do with callgraph annotations).
>
> -cary
>
Cary Coutant - Oct. 11, 2011, 6:12 p.m.
> How about .gnu.switches.text.quote_paths?

Sounds good to me.

-cary

Patch

Index: gcc/doc/invoke.texi
===================================================================
--- gcc/doc/invoke.texi	(revision 179708)
+++ 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-options-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-options-in-elf
+@opindex frecord-options-in-elf
+Record the command line options in the .note elf section for sample FDO 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 179708)
+++ gcc/c-family/c-opts.c	(working copy)
@@ -1109,6 +1109,8 @@ 
   for (;;)
     {
       c_finish_options ();
+      if (flag_record_options_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-options-in-elf-1.c
===================================================================
--- gcc/testsuite/gcc.dg/record-options-in-elf-1.c	(revision 0)
+++ gcc/testsuite/gcc.dg/record-options-in-elf-1.c	(revision 0)
@@ -0,0 +1,16 @@ 
+/* { dg-do compile} */
+/* { dg-options "-frecord-options-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 "test" 1 } } */
Index: gcc/opts.h
===================================================================
--- gcc/opts.h	(revision 179708)
+++ 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 179708)
+++ 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,64 @@ 
   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 (".note.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 (".note.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 (".note.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 (".note.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 (".note.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 179708)
+++ gcc/common.opt	(working copy)
@@ -1697,6 +1697,10 @@ 
 Common Report Var(flag_record_gcc_switches)
 Record gcc command line switches in the object file.

+frecord-options-in-elf
+Common Report Var(flag_record_options_in_elf)
+Record the compiler optimizations in an .note 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 179708)
+++ 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