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 <de...@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 <de...@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 <de...@google.com> * gcc.dg/record-options-in-elf-1.c: New test. 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 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) \