Message ID | CAO2gOZW-dSjz5CU6FOyKKA+nX=3XG+LUg2sSd5nY0xY7QfGuzg@mail.gmail.com |
---|---|
State | New |
Headers | show |
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 ("e_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 >> >
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 ("e_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