aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/ProfileData/SampleProfReader.cpp
diff options
context:
space:
mode:
authorNathan Slingerland <slingn@gmail.com>2015-12-16 21:45:43 +0000
committerNathan Slingerland <slingn@gmail.com>2015-12-16 21:45:43 +0000
commit48dd080c77c6a6398906b6db73d015fee15d8591 (patch)
tree4ecca36c8ea7d92f85c74274579a16d277b75e13 /llvm/lib/ProfileData/SampleProfReader.cpp
parent031bed291ee7feccd2272efac2f7fce98c8353de (diff)
downloadllvm-48dd080c77c6a6398906b6db73d015fee15d8591.zip
llvm-48dd080c77c6a6398906b6db73d015fee15d8591.tar.gz
llvm-48dd080c77c6a6398906b6db73d015fee15d8591.tar.bz2
[PGO] Handle and report overflow during profile merge for all types of data
Summary: Surface counter overflow when merging profile data. Merging still occurs on overflow but counts saturate to the maximum representable value. Overflow is reported to the user. Reviewers: davidxl, dnovillo, silvas Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D15547 llvm-svn: 255825
Diffstat (limited to 'llvm/lib/ProfileData/SampleProfReader.cpp')
-rw-r--r--llvm/lib/ProfileData/SampleProfReader.cpp17
1 files changed, 10 insertions, 7 deletions
diff --git a/llvm/lib/ProfileData/SampleProfReader.cpp b/llvm/lib/ProfileData/SampleProfReader.cpp
index cdd98e8..93cd87b 100644
--- a/llvm/lib/ProfileData/SampleProfReader.cpp
+++ b/llvm/lib/ProfileData/SampleProfReader.cpp
@@ -151,6 +151,7 @@ static bool ParseLine(const StringRef &Input, bool &IsCallsite, uint32_t &Depth,
/// \returns true if the file was loaded successfully, false otherwise.
std::error_code SampleProfileReaderText::read() {
line_iterator LineIt(*Buffer, /*SkipBlanks=*/true, '#');
+ sampleprof_error Result = sampleprof_error::success;
InlineCallStack InlineStack;
@@ -179,8 +180,8 @@ std::error_code SampleProfileReaderText::read() {
}
Profiles[FName] = FunctionSamples();
FunctionSamples &FProfile = Profiles[FName];
- FProfile.addTotalSamples(NumSamples);
- FProfile.addHeadSamples(NumHeadSamples);
+ MergeResult(Result, FProfile.addTotalSamples(NumSamples));
+ MergeResult(Result, FProfile.addHeadSamples(NumHeadSamples));
InlineStack.clear();
InlineStack.push_back(&FProfile);
} else {
@@ -202,7 +203,7 @@ std::error_code SampleProfileReaderText::read() {
}
FunctionSamples &FSamples = InlineStack.back()->functionSamplesAt(
CallsiteLocation(LineOffset, Discriminator, FName));
- FSamples.addTotalSamples(NumSamples);
+ MergeResult(Result, FSamples.addTotalSamples(NumSamples));
InlineStack.push_back(&FSamples);
} else {
while (InlineStack.size() > Depth) {
@@ -210,15 +211,17 @@ std::error_code SampleProfileReaderText::read() {
}
FunctionSamples &FProfile = *InlineStack.back();
for (const auto &name_count : TargetCountMap) {
- FProfile.addCalledTargetSamples(LineOffset, Discriminator,
- name_count.first, name_count.second);
+ MergeResult(Result, FProfile.addCalledTargetSamples(
+ LineOffset, Discriminator, name_count.first,
+ name_count.second));
}
- FProfile.addBodySamples(LineOffset, Discriminator, NumSamples);
+ MergeResult(Result, FProfile.addBodySamples(LineOffset, Discriminator,
+ NumSamples));
}
}
}
- return sampleprof_error::success;
+ return Result;
}
bool SampleProfileReaderText::hasFormat(const MemoryBuffer &Buffer) {