diff options
author | Reid Kleckner <rnk@google.com> | 2019-09-16 18:49:09 +0000 |
---|---|---|
committer | Reid Kleckner <rnk@google.com> | 2019-09-16 18:49:09 +0000 |
commit | 32837a0c93ecdb33faaba253c5c7e868db9c529f (patch) | |
tree | 84f12b4bff2056281f07b7998368da2f1eb3e26d /lldb/packages/Python/lldbsuite/test/python_api/interpreter/main.c | |
parent | 69911b8d01c6cf31a3af787d3f7352292cb0f9e4 (diff) | |
download | bcm5719-llvm-32837a0c93ecdb33faaba253c5c7e868db9c529f.tar.gz bcm5719-llvm-32837a0c93ecdb33faaba253c5c7e868db9c529f.zip |
[PGO] Use linkonce_odr linkage for __profd_ variables in comdat groups
This fixes relocations against __profd_ symbols in discarded sections,
which is PR41380.
In general, instrumentation happens very early, and optimization and
inlining happens afterwards. The counters for a function are calculated
early, and after inlining, counters for an inlined function may be
widely referenced by other functions.
For C++ inline functions of all kinds (linkonce_odr &
available_externally mainly), instr profiling wants to deduplicate these
__profc_ and __profd_ globals. Otherwise the binary would be quite
large.
I made __profd_ and __profc_ comdat in r355044, but I chose to make
__profd_ internal. At the time, I was only dealing with coverage, and in
that case, none of the instrumentation needs to reference __profd_.
However, if you use PGO, then instrumentation passes add calls to
__llvm_profile_instrument_range which reference __profd_ globals. The
solution is to make these globals externally visible by using
linkonce_odr linkage for data as was done for counters.
This is safe because PGO adds a CFG hash to the names of the data and
counter globals, so if different TUs have different globals, they will
get different data and counter arrays.
Reviewers: xur, hans
Differential Revision: https://reviews.llvm.org/D67579
llvm-svn: 372020
Diffstat (limited to 'lldb/packages/Python/lldbsuite/test/python_api/interpreter/main.c')
0 files changed, 0 insertions, 0 deletions