This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [google] record compiler options to .note sections


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 (&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 <ccoutant@google.com> wrote:
>>> How about .gnu.switches.text.quote_paths?
>>
>> Sounds good to me.
>>
>> -cary
>>
>


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]