From patchwork Sat Oct 8 10:43:47 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dehao Chen X-Patchwork-Id: 118527 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id 854F4B70C8 for ; Sat, 8 Oct 2011 21:44:08 +1100 (EST) Received: (qmail 24406 invoked by alias); 8 Oct 2011 10:44:06 -0000 Received: (qmail 24395 invoked by uid 22791); 8 Oct 2011 10:44:05 -0000 X-SWARE-Spam-Status: No, hits=0.5 required=5.0 tests=AWL, BAYES_20, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, RP_MATCHES_RCVD, SPF_HELO_PASS X-Spam-Check-By: sourceware.org Received: from smtp-out.google.com (HELO smtp-out.google.com) (74.125.121.67) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sat, 08 Oct 2011 10:43:50 +0000 Received: from hpaq7.eem.corp.google.com (hpaq7.eem.corp.google.com [172.25.149.7]) by smtp-out.google.com with ESMTP id p98Ahm4c022022 for ; Sat, 8 Oct 2011 03:43:48 -0700 Received: from gyg4 (gyg4.prod.google.com [10.243.50.132]) by hpaq7.eem.corp.google.com with ESMTP id p98AeEkH005695 (version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=NOT) for ; Sat, 8 Oct 2011 03:43:47 -0700 Received: by gyg4 with SMTP id 4so6320479gyg.1 for ; Sat, 08 Oct 2011 03:43:47 -0700 (PDT) Received: by 10.150.2.21 with SMTP id 21mr889961ybb.102.1318070627559; Sat, 08 Oct 2011 03:43:47 -0700 (PDT) MIME-Version: 1.0 Received: by 10.150.2.21 with SMTP id 21mr889949ybb.102.1318070627302; Sat, 08 Oct 2011 03:43:47 -0700 (PDT) Received: by 10.151.107.3 with HTTP; Sat, 8 Oct 2011 03:43:47 -0700 (PDT) Date: Sat, 8 Oct 2011 18:43:47 +0800 Message-ID: Subject: [google] record compiler options to .note sections From: Dehao Chen To: gcc-patches@gcc.gnu.org Cc: Rong Xu , Xinliang David Li X-System-Of-Record: true X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org 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 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 * c-opts.c (c_common_parse_file): Write the options to .note sections. gcc/testsuite/ChangeLog.google-4_6: 2011-10-08 Dehao Chen * gcc.dg/record-options-in-elf-1.c: New test. 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) \ 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