Message ID | CAO2gOZXV-DoWSWruuY=KJg9mohXxa7K=Wn6preSzq2MUiNNsqw@mail.gmail.com |
---|---|
State | New |
Headers | show |
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
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 >
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
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 >
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 >> >
> 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
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 >
> How about .gnu.switches.text.quote_paths?
Sounds good to me.
-cary
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 ("e_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