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 (&quote_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
