ok.

David

On Tue, Oct 11, 2011 at 9:51 PM, Dehao Chen <de...@google.com> wrote:
> Attached is the new patch. Bootstrapped on x86_64, no regressions.
>
> gcc/ChangeLog.google-4_6:
> 2011-10-08  Dehao Chen  <de...@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  <de...@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  <de...@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 <ccout...@google.com> wrote:
>>> How about .gnu.switches.text.quote_paths?
>>
>> Sounds good to me.
>>
>> -cary
>>
>

Reply via email to