[google] record compiler options to .note sections
Dehao Chen
dehao@google.com
Sat Oct 8 11:42:00 GMT 2011
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 <dehao@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 <dehao@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 <dehao@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) \
More information about the Gcc-patches
mailing list