2014-05-15 10:22:34 +08:00
|
|
|
/*===- InstrProfilingPlatformOther.c - Profile data default platform ------===*\
|
2014-03-20 11:23:10 +08:00
|
|
|
|*
|
2019-01-19 16:50:56 +08:00
|
|
|
|* Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
|
|
|* See https://llvm.org/LICENSE.txt for license information.
|
|
|
|
|* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
2014-03-20 11:23:10 +08:00
|
|
|
|*
|
|
|
|
\*===----------------------------------------------------------------------===*/
|
|
|
|
|
[InstrProf] Implement static profdata registration
Summary:
The motivating use case is eliminating duplicate profile data registered
for the same inline function in two object files. Before this change,
users would observe multiple symbol definition errors with VC link, but
links with LLD would succeed.
Users (Mozilla) have reported that PGO works well with clang-cl and LLD,
but when using LLD without this static registration, we would get into a
"relocation against a discarded section" situation. I'm not sure what
happens in that situation, but I suspect that duplicate, unused profile
information was retained. If so, this change will reduce the size of
such binaries with LLD.
Now, Windows uses static registration and is in line with all the other
platforms.
Reviewers: davidxl, wmi, inglorion, void, calixte
Subscribers: mgorny, krytarowski, eraman, fedor.sergeev, hiraditya, #sanitizers, dmajor, llvm-commits
Tags: #sanitizers, #llvm
Differential Revision: https://reviews.llvm.org/D57929
llvm-svn: 353547
2019-02-09 03:03:50 +08:00
|
|
|
#if !defined(__APPLE__) && !defined(__linux__) && !defined(__FreeBSD__) && \
|
|
|
|
!(defined(__sun__) && defined(__svr4__)) && !defined(__NetBSD__) && \
|
|
|
|
!defined(_WIN32)
|
2014-03-20 11:23:10 +08:00
|
|
|
|
2017-12-15 02:50:13 +08:00
|
|
|
#include <stdlib.h>
|
[InstrProf] Implement static profdata registration
Summary:
The motivating use case is eliminating duplicate profile data registered
for the same inline function in two object files. Before this change,
users would observe multiple symbol definition errors with VC link, but
links with LLD would succeed.
Users (Mozilla) have reported that PGO works well with clang-cl and LLD,
but when using LLD without this static registration, we would get into a
"relocation against a discarded section" situation. I'm not sure what
happens in that situation, but I suspect that duplicate, unused profile
information was retained. If so, this change will reduce the size of
such binaries with LLD.
Now, Windows uses static registration and is in line with all the other
platforms.
Reviewers: davidxl, wmi, inglorion, void, calixte
Subscribers: mgorny, krytarowski, eraman, fedor.sergeev, hiraditya, #sanitizers, dmajor, llvm-commits
Tags: #sanitizers, #llvm
Differential Revision: https://reviews.llvm.org/D57929
llvm-svn: 353547
2019-02-09 03:03:50 +08:00
|
|
|
#include <stdio.h>
|
2017-12-15 02:43:14 +08:00
|
|
|
|
2017-12-15 03:01:04 +08:00
|
|
|
#include "InstrProfiling.h"
|
|
|
|
|
2014-03-21 04:00:44 +08:00
|
|
|
static const __llvm_profile_data *DataFirst = NULL;
|
|
|
|
static const __llvm_profile_data *DataLast = NULL;
|
2014-03-20 11:23:10 +08:00
|
|
|
static const char *NamesFirst = NULL;
|
|
|
|
static const char *NamesLast = NULL;
|
2014-03-21 03:44:31 +08:00
|
|
|
static uint64_t *CountersFirst = NULL;
|
|
|
|
static uint64_t *CountersLast = NULL;
|
2019-03-08 23:30:56 +08:00
|
|
|
static uint32_t *OrderFileFirst = NULL;
|
2014-03-20 11:23:10 +08:00
|
|
|
|
2016-02-09 02:14:02 +08:00
|
|
|
static const void *getMinAddr(const void *A1, const void *A2) {
|
|
|
|
return A1 < A2 ? A1 : A2;
|
|
|
|
}
|
|
|
|
|
|
|
|
static const void *getMaxAddr(const void *A1, const void *A2) {
|
|
|
|
return A1 > A2 ? A1 : A2;
|
|
|
|
}
|
|
|
|
|
2014-03-20 11:23:10 +08:00
|
|
|
/*!
|
|
|
|
* \brief Register an instrumented function.
|
|
|
|
*
|
|
|
|
* Calls to this are emitted by clang with -fprofile-instr-generate. Such
|
|
|
|
* calls are only required (and only emitted) on targets where we haven't
|
|
|
|
* implemented linker magic to find the bounds of the sections.
|
|
|
|
*/
|
2015-12-16 11:29:15 +08:00
|
|
|
COMPILER_RT_VISIBILITY
|
2014-03-21 04:00:44 +08:00
|
|
|
void __llvm_profile_register_function(void *Data_) {
|
2014-03-20 11:23:10 +08:00
|
|
|
/* TODO: Only emit this function if we can't use linker magic. */
|
2015-11-23 12:38:17 +08:00
|
|
|
const __llvm_profile_data *Data = (__llvm_profile_data *)Data_;
|
2014-03-20 11:23:10 +08:00
|
|
|
if (!DataFirst) {
|
|
|
|
DataFirst = Data;
|
|
|
|
DataLast = Data + 1;
|
2015-11-09 02:00:13 +08:00
|
|
|
CountersFirst = Data->CounterPtr;
|
2015-12-20 03:16:32 +08:00
|
|
|
CountersLast = (uint64_t *)Data->CounterPtr + Data->NumCounters;
|
2014-03-20 11:23:10 +08:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2016-02-09 02:14:02 +08:00
|
|
|
DataFirst = (const __llvm_profile_data *)getMinAddr(DataFirst, Data);
|
|
|
|
CountersFirst = (uint64_t *)getMinAddr(CountersFirst, Data->CounterPtr);
|
2014-03-20 11:23:10 +08:00
|
|
|
|
2016-02-09 02:14:02 +08:00
|
|
|
DataLast = (const __llvm_profile_data *)getMaxAddr(DataLast, Data + 1);
|
|
|
|
CountersLast = (uint64_t *)getMaxAddr(
|
|
|
|
CountersLast, (uint64_t *)Data->CounterPtr + Data->NumCounters);
|
|
|
|
}
|
|
|
|
|
|
|
|
COMPILER_RT_VISIBILITY
|
|
|
|
void __llvm_profile_register_names_function(void *NamesStart,
|
|
|
|
uint64_t NamesSize) {
|
|
|
|
if (!NamesFirst) {
|
|
|
|
NamesFirst = (const char *)NamesStart;
|
|
|
|
NamesLast = (const char *)NamesStart + NamesSize;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
NamesFirst = (const char *)getMinAddr(NamesFirst, NamesStart);
|
2016-02-09 02:27:04 +08:00
|
|
|
NamesLast =
|
|
|
|
(const char *)getMaxAddr(NamesLast, (const char *)NamesStart + NamesSize);
|
2014-03-20 11:23:10 +08:00
|
|
|
}
|
|
|
|
|
2015-12-16 11:29:15 +08:00
|
|
|
COMPILER_RT_VISIBILITY
|
2015-11-23 12:38:17 +08:00
|
|
|
const __llvm_profile_data *__llvm_profile_begin_data(void) { return DataFirst; }
|
2015-12-16 11:29:15 +08:00
|
|
|
COMPILER_RT_VISIBILITY
|
2015-11-23 12:38:17 +08:00
|
|
|
const __llvm_profile_data *__llvm_profile_end_data(void) { return DataLast; }
|
2015-12-16 11:29:15 +08:00
|
|
|
COMPILER_RT_VISIBILITY
|
2014-09-04 23:45:31 +08:00
|
|
|
const char *__llvm_profile_begin_names(void) { return NamesFirst; }
|
2015-12-16 11:29:15 +08:00
|
|
|
COMPILER_RT_VISIBILITY
|
2014-09-04 23:45:31 +08:00
|
|
|
const char *__llvm_profile_end_names(void) { return NamesLast; }
|
2015-12-16 11:29:15 +08:00
|
|
|
COMPILER_RT_VISIBILITY
|
2014-09-04 23:45:31 +08:00
|
|
|
uint64_t *__llvm_profile_begin_counters(void) { return CountersFirst; }
|
2015-12-16 11:29:15 +08:00
|
|
|
COMPILER_RT_VISIBILITY
|
2014-09-04 23:45:31 +08:00
|
|
|
uint64_t *__llvm_profile_end_counters(void) { return CountersLast; }
|
2019-03-08 23:30:56 +08:00
|
|
|
/* TODO: correctly set up OrderFileFirst. */
|
|
|
|
COMPILER_RT_VISIBILITY
|
|
|
|
uint32_t *__llvm_profile_begin_orderfile(void) { return OrderFileFirst; }
|
2016-05-22 06:55:45 +08:00
|
|
|
|
|
|
|
COMPILER_RT_VISIBILITY
|
|
|
|
ValueProfNode *__llvm_profile_begin_vnodes(void) {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
COMPILER_RT_VISIBILITY
|
2016-05-22 07:06:39 +08:00
|
|
|
ValueProfNode *__llvm_profile_end_vnodes(void) { return 0; }
|
2016-05-22 06:55:45 +08:00
|
|
|
|
2016-05-23 00:36:03 +08:00
|
|
|
COMPILER_RT_VISIBILITY ValueProfNode *CurrentVNode = 0;
|
|
|
|
COMPILER_RT_VISIBILITY ValueProfNode *EndVNode = 0;
|
|
|
|
|
2014-04-23 02:49:32 +08:00
|
|
|
#endif
|