diff options
-rw-r--r-- | compiler-rt/lib/profile/InstrProfilingValue.c | 11 | ||||
-rw-r--r-- | compiler-rt/test/profile/instrprof-value-prof.test | 5 |
2 files changed, 13 insertions, 3 deletions
diff --git a/compiler-rt/lib/profile/InstrProfilingValue.c b/compiler-rt/lib/profile/InstrProfilingValue.c index 08f91b35fd5..63b5e6fca15 100644 --- a/compiler-rt/lib/profile/InstrProfilingValue.c +++ b/compiler-rt/lib/profile/InstrProfilingValue.c @@ -103,16 +103,21 @@ static ValueProfNode *allocateOneNode(__llvm_profile_data *Data, uint32_t Index, if (!hasStaticCounters) return (ValueProfNode *)calloc(1, sizeof(ValueProfNode)); - Node = COMPILER_RT_PTR_FETCH_ADD(ValueProfNode, CurrentVNode, 1); - if (Node >= EndVNode) { + /* Early check to avoid value wrapping around. */ + if (CurrentVNode >= EndVNode) { if (OutOfNodesWarnings++ < MAX_VP_WARNS) { PROF_WARN("Unable to track new values: %s. " - " Consider using option -mllvm -vp-counters-per-site=<n> to allocate more" + " Consider using option -mllvm -vp-counters-per-site=<n> to " + "allocate more" " value profile counters at compile time. \n", "Running out of static counters"); } return 0; } + Node = COMPILER_RT_PTR_FETCH_ADD(ValueProfNode, CurrentVNode, 1); + if (Node >= EndVNode) + return 0; + return Node; } diff --git a/compiler-rt/test/profile/instrprof-value-prof.test b/compiler-rt/test/profile/instrprof-value-prof.test index 5b4e616f219..dc936435724 100644 --- a/compiler-rt/test/profile/instrprof-value-prof.test +++ b/compiler-rt/test/profile/instrprof-value-prof.test @@ -11,6 +11,9 @@ // RUN: llvm-profdata merge -text %t.ir.profdata -o %t.ir.proftxt // RUN: FileCheck %S/Inputs/instrprof-value-prof-real.c --check-prefix=IR < %t.ir.proftxt +// RUN: %clang_profgen -O2 -mllvm -disable-vp=false -Xclang -fprofile-instrument=llvm -mllvm -vp-static-alloc=true -o %t.ir.warn %S/Inputs/instrprof-value-prof-real.c +// RUN: env LLVM_PROFILE_FILE=%t.ir.profraw %run %t.ir.warn 2>&1 |FileCheck --check-prefix=WARNING %s + // IR level instrumentation with dynamic memory allocation // RUN: %clang_profgen -O2 -mllvm -disable-vp=false -Xclang -fprofile-instrument=llvm -mllvm -vp-static-alloc=false -mllvm -vp-counters-per-site=256 -o %t.ir.dyn %S/Inputs/instrprof-value-prof-real.c // RUN: env LLVM_PROFILE_FILE=%t.ir.dyn.profraw %run %t.ir.dyn @@ -18,3 +21,5 @@ // RUN: llvm-profdata show --all-functions -ic-targets %t.ir.dyn.profdata | FileCheck %S/Inputs/instrprof-value-prof-real.c // RUN: llvm-profdata merge -text %t.ir.dyn.profdata -o %t.ir.dyn.proftxt // RUN: FileCheck %S/Inputs/instrprof-value-prof-real.c --check-prefix=IR < %t.ir.dyn.proftxt + +// WARNING: LLVM Profile Warning: |