[PATCH] naming GCC's profile data section
David Taylor
dtaylor@emc.com
Thu Oct 24 18:04:00 GMT 2019
Our application is embedded. And in addition to cold boot (reload
everything; start over from scratch), we support warm boot. As part of
supporting warm boot, read-write data that needs to be initialized, is
initialized by code. And we ensure at link time that the traditional
initialized read-write data sections (.data, .ldata, .sdata) are empty.
This presents a problem when attempting to use GCC based profiling as it
creates read-write data in the aforementioned data sections.
This patch adds a new command line option that allows you to specify the
name of the section where GCC puts the instrumentation data.
If the new option (-fprofile-data-section) is not specified, GCC behaves
as before.
What's missing? Testsuite changes. I haven't yet figured out how to do
automated testing of this. To test it, I built our software, several
thousand files, and then did an 'objdump --headers', verified that
sections .data / .ldata / .sdata were either absent of empty, and that
the instrumentation section had the name that I specified.
We have a copyright assignment on file from before EMC was acquired by
Dell. Our company lawyers assure me that it survived the acquisition
and is still valid.
I'm sending this from GNU/Linux rather than from Windows (to avoid
having the patch mangled), so I'm not sure what the headers will show
for my return address. If you wish to email me, I can be reached at
dtaylor at emc dot com or David dot Taylor at dell dot com. Or... you
can just send to the gcc-patches list as I'll be reading it.
Enough verbiage, here's the ChangeLog entry and the patch...
2019-10-23 David Taylor <dtaylor@emc.com>
* common.opt (fprofile-data-section): New command line switch.
* coverage.c (build_var): Add support for -fprofile-data-section.
(coverage_obj_finish): Ditto.
* toplev.c (process_options): Issue warning if
-fprofile-data-section is specified when it is not supported.
* doc/invoke.texi (Option Summary): List -fprofile-data-section.
(Instrumentation Options): Document -fprofile-data-section.
Index: gcc/common.opt
===================================================================
--- gcc/common.opt (revision 277133)
+++ gcc/common.opt (working copy)
@@ -2124,6 +2124,10 @@
Common Joined RejectNegative Var(profile_note_location)
Select the name for storing the profile note file.
+fprofile-data-section=
+Common Joined RejectNegative Var(profile_data_section_name)
+Specify the section name for initialized profile data.
+
fprofile-correction
Common Report Var(flag_profile_correction)
Enable correction of flow inconsistent profile data input.
Index: gcc/coverage.c
===================================================================
--- gcc/coverage.c (revision 277133)
+++ gcc/coverage.c (working copy)
@@ -749,6 +749,9 @@
fn_name_len = strlen (fn_name);
buf = XALLOCAVEC (char, fn_name_len + 8 + sizeof (int) * 3);
+ TREE_STATIC (var) = 1;
+ if (profile_data_section_name)
+ set_decl_section_name (var, profile_data_section_name);
if (counter < 0)
strcpy (buf, "__gcov__");
else
@@ -757,7 +760,6 @@
buf[len - 1] = symbol_table::symbol_suffix_separator ();
memcpy (buf + len, fn_name, fn_name_len + 1);
DECL_NAME (var) = get_identifier (buf);
- TREE_STATIC (var) = 1;
TREE_ADDRESSABLE (var) = 1;
DECL_NONALIASED (var) = 1;
SET_DECL_ALIGN (var, TYPE_ALIGN (type));
@@ -1188,10 +1190,14 @@
ASM_GENERATE_INTERNAL_LABEL (name_buf, "LPBX", 1);
DECL_NAME (fn_info_ary) = get_identifier (name_buf);
DECL_INITIAL (fn_info_ary) = build_constructor (fn_info_ary_type, ctor);
+ if (profile_data_section_name)
+ set_decl_section_name (fn_info_ary, profile_data_section_name);
varpool_node::finalize_decl (fn_info_ary);
DECL_INITIAL (gcov_info_var)
= build_info (TREE_TYPE (gcov_info_var), fn_info_ary);
+ if (profile_data_section_name)
+ set_decl_section_name (gcov_info_var, profile_data_section_name);
varpool_node::finalize_decl (gcov_info_var);
}
Index: gcc/doc/invoke.texi
===================================================================
--- gcc/doc/invoke.texi (revision 277133)
+++ gcc/doc/invoke.texi (working copy)
@@ -496,7 +496,7 @@
@item Program Instrumentation Options
@xref{Instrumentation Options,,Program Instrumentation Options}.
@gccoptlist{-p -pg -fprofile-arcs --coverage -ftest-coverage @gol
--fprofile-abs-path @gol
+-fprofile-abs-path -fprofile-data-section=@var{name} @gol
-fprofile-dir=@var{path} -fprofile-generate -fprofile-generate=@var{path} @gol
-fprofile-note=@var{path} -fprofile-update=@var{method} @gol
-fprofile-filter-files=@var{regex} -fprofile-exclude-files=@var{regex} @gol
@@ -12483,6 +12483,14 @@
generate test coverage data. Coverage data matches the source files
more closely if you do not optimize.
+@item -fprofile-data-section
+@opindex fprofile-data-section
+When profiling, sets the name of the section where GCC places the
+profiling data. If not specified, then where the data is placed is
+target dependent, but is typically either @code{.data} or
+@code{.ldata}. Only supported for targets that support named
+sections.
+
@item -fprofile-abs-path
@opindex fprofile-abs-path
Automatically convert relative source file names to absolute path names
Index: gcc/toplev.c
===================================================================
--- gcc/toplev.c (revision 277133)
+++ gcc/toplev.c (working copy)
@@ -1665,6 +1665,12 @@
"%<-fdata-sections%> not supported for this target");
flag_data_sections = 0;
}
+ if (profile_data_section_name)
+ {
+ warning_at (UNKNOWN_LOCATION, 0,
+ "-fprofile-data-section= not supported for this target");
+ profile_data_section_name = NULL;
+ }
}
if (flag_prefetch_loop_arrays > 0 && !targetm.code_for_prefetch)
More information about the Gcc-patches
mailing list