diff options
author | Xinliang David Li <davidxl@google.com> | 2016-05-18 22:34:05 +0000 |
---|---|---|
committer | Xinliang David Li <davidxl@google.com> | 2016-05-18 22:34:05 +0000 |
commit | de5642725495b7bef5dfa0c45139a509a8174564 (patch) | |
tree | 9e97376f5c0c8f9b18adf566de92c0f60808d000 | |
parent | a7c01c6b9c446ee27b17735c3d07a564a16e0a7e (diff) |
[profile] Allow max vals per site to be controllable at runtime
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@269993 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/profile/InstrProfilingFile.c | 2 | ||||
-rw-r--r-- | lib/profile/InstrProfilingInternal.h | 3 | ||||
-rw-r--r-- | lib/profile/InstrProfilingValue.c | 14 |
3 files changed, 18 insertions, 1 deletions
diff --git a/lib/profile/InstrProfilingFile.c b/lib/profile/InstrProfilingFile.c index 1e754017c..f18a48507 100644 --- a/lib/profile/InstrProfilingFile.c +++ b/lib/profile/InstrProfilingFile.c @@ -254,6 +254,8 @@ int __llvm_profile_register_write_file_atexit(void) { if (HasBeenRegistered) return 0; + lprofSetupValueProfiler(); + HasBeenRegistered = 1; return atexit(writeFileWithoutReturn); } diff --git a/lib/profile/InstrProfilingInternal.h b/lib/profile/InstrProfilingInternal.h index 56d825101..306b2bd94 100644 --- a/lib/profile/InstrProfilingInternal.h +++ b/lib/profile/InstrProfilingInternal.h @@ -150,10 +150,13 @@ void lprofMergeValueProfData(struct ValueProfData *SrcValueProfData, VPDataReaderType *lprofGetVPDataReader(); +void lprofSetupValueProfiler(); + COMPILER_RT_VISIBILITY extern char *(*GetEnvHook)(const char *); COMPILER_RT_VISIBILITY extern void (*FreeHook)(void *); COMPILER_RT_VISIBILITY extern uint8_t *DynamicBufferIOBuffer; COMPILER_RT_VISIBILITY extern uint32_t VPBufferSize; +COMPILER_RT_VISIBILITY extern uint32_t VPMaxNumValsPerSite; extern void (*VPMergeHook)(struct ValueProfData *, __llvm_profile_data *); #endif diff --git a/lib/profile/InstrProfilingValue.c b/lib/profile/InstrProfilingValue.c index 1a4438195..f51e67292 100644 --- a/lib/profile/InstrProfilingValue.c +++ b/lib/profile/InstrProfilingValue.c @@ -24,6 +24,18 @@ return NULL; \ } +COMPILER_RT_VISIBILITY uint32_t VPMaxNumValsPerSite = + INSTR_PROF_MAX_NUM_VAL_PER_SITE; + +COMPILER_RT_VISIBILITY void lprofSetupValueProfiler() { + const char *Str = 0; + Str = getenv("LLVM_VP_MAX_NUM_VALS_PER_SITE"); + if (Str && Str[0]) + VPMaxNumValsPerSite = atoi(Str); + if (VPMaxNumValsPerSite > INSTR_PROF_MAX_NUM_VAL_PER_SITE) + VPMaxNumValsPerSite = INSTR_PROF_MAX_NUM_VAL_PER_SITE; +} + /* This method is only used in value profiler mock testing. */ COMPILER_RT_VISIBILITY void __llvm_profile_set_num_value_sites(__llvm_profile_data *Data, @@ -94,7 +106,7 @@ __llvm_profile_instrument_target(uint64_t TargetValue, void *Data, ++VDataCount; } - if (VDataCount >= INSTR_PROF_MAX_NUM_VAL_PER_SITE) + if (VDataCount >= VPMaxNumValsPerSite) return; CurrentVNode = (ValueProfNode *)calloc(1, sizeof(ValueProfNode)); |