summaryrefslogtreecommitdiffstats
path: root/gnu/llvm/unittests/ProfileData/SampleProfTest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/llvm/unittests/ProfileData/SampleProfTest.cpp')
-rw-r--r--gnu/llvm/unittests/ProfileData/SampleProfTest.cpp81
1 files changed, 76 insertions, 5 deletions
diff --git a/gnu/llvm/unittests/ProfileData/SampleProfTest.cpp b/gnu/llvm/unittests/ProfileData/SampleProfTest.cpp
index cc3c2f5306e..175852b93fb 100644
--- a/gnu/llvm/unittests/ProfileData/SampleProfTest.cpp
+++ b/gnu/llvm/unittests/ProfileData/SampleProfTest.cpp
@@ -1,5 +1,4 @@
-//===- unittest/ProfileData/SampleProfTest.cpp -------------------*- C++
-//-*-===//
+//===- unittest/ProfileData/SampleProfTest.cpp ------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
@@ -8,11 +7,27 @@
//
//===----------------------------------------------------------------------===//
+#include "llvm/ADT/StringMap.h"
+#include "llvm/ADT/StringRef.h"
+#include "llvm/IR/LLVMContext.h"
+#include "llvm/IR/Metadata.h"
+#include "llvm/IR/Module.h"
+#include "llvm/ProfileData/ProfileCommon.h"
+#include "llvm/ProfileData/SampleProf.h"
#include "llvm/ProfileData/SampleProfReader.h"
#include "llvm/ProfileData/SampleProfWriter.h"
+#include "llvm/Support/Casting.h"
+#include "llvm/Support/ErrorOr.h"
+#include "llvm/Support/MemoryBuffer.h"
+#include "llvm/Support/raw_ostream.h"
#include "gtest/gtest.h"
-
-#include <cstdarg>
+#include <algorithm>
+#include <cstdint>
+#include <limits>
+#include <memory>
+#include <string>
+#include <system_error>
+#include <vector>
using namespace llvm;
using namespace sampleprof;
@@ -28,6 +43,7 @@ namespace {
struct SampleProfTest : ::testing::Test {
std::string Data;
+ LLVMContext Context;
std::unique_ptr<raw_ostream> OS;
std::unique_ptr<SampleProfileWriter> Writer;
std::unique_ptr<SampleProfileReader> Reader;
@@ -42,7 +58,7 @@ struct SampleProfTest : ::testing::Test {
}
void readProfile(std::unique_ptr<MemoryBuffer> &Profile) {
- auto ReaderOrErr = SampleProfileReader::create(Profile, getGlobalContext());
+ auto ReaderOrErr = SampleProfileReader::create(Profile, Context);
ASSERT_TRUE(NoError(ReaderOrErr.getError()));
Reader = std::move(ReaderOrErr.get());
}
@@ -52,12 +68,18 @@ struct SampleProfTest : ::testing::Test {
StringRef FooName("_Z3fooi");
FunctionSamples FooSamples;
+ FooSamples.setName(FooName);
FooSamples.addTotalSamples(7711);
FooSamples.addHeadSamples(610);
FooSamples.addBodySamples(1, 0, 610);
+ FooSamples.addBodySamples(2, 0, 600);
+ FooSamples.addBodySamples(4, 0, 60000);
+ FooSamples.addBodySamples(8, 0, 60351);
+ FooSamples.addBodySamples(10, 0, 605);
StringRef BarName("_Z3bari");
FunctionSamples BarSamples;
+ BarSamples.setName(BarName);
BarSamples.addTotalSamples(20301);
BarSamples.addHeadSamples(1437);
BarSamples.addBodySamples(1, 0, 1437);
@@ -88,6 +110,55 @@ struct SampleProfTest : ::testing::Test {
FunctionSamples &ReadBarSamples = ReadProfiles[BarName];
ASSERT_EQ(20301u, ReadBarSamples.getTotalSamples());
ASSERT_EQ(1437u, ReadBarSamples.getHeadSamples());
+
+ auto VerifySummary = [](ProfileSummary &Summary) mutable {
+ ASSERT_EQ(ProfileSummary::PSK_Sample, Summary.getKind());
+ ASSERT_EQ(123603u, Summary.getTotalCount());
+ ASSERT_EQ(6u, Summary.getNumCounts());
+ ASSERT_EQ(2u, Summary.getNumFunctions());
+ ASSERT_EQ(1437u, Summary.getMaxFunctionCount());
+ ASSERT_EQ(60351u, Summary.getMaxCount());
+
+ uint32_t Cutoff = 800000;
+ auto Predicate = [&Cutoff](const ProfileSummaryEntry &PE) {
+ return PE.Cutoff == Cutoff;
+ };
+ std::vector<ProfileSummaryEntry> &Details = Summary.getDetailedSummary();
+ auto EightyPerc = std::find_if(Details.begin(), Details.end(), Predicate);
+ Cutoff = 900000;
+ auto NinetyPerc = std::find_if(Details.begin(), Details.end(), Predicate);
+ Cutoff = 950000;
+ auto NinetyFivePerc =
+ std::find_if(Details.begin(), Details.end(), Predicate);
+ Cutoff = 990000;
+ auto NinetyNinePerc =
+ std::find_if(Details.begin(), Details.end(), Predicate);
+ ASSERT_EQ(60000u, EightyPerc->MinCount);
+ ASSERT_EQ(60000u, NinetyPerc->MinCount);
+ ASSERT_EQ(60000u, NinetyFivePerc->MinCount);
+ ASSERT_EQ(610u, NinetyNinePerc->MinCount);
+ };
+
+ ProfileSummary &Summary = Reader->getSummary();
+ VerifySummary(Summary);
+
+ // Test that conversion of summary to and from Metadata works.
+ Metadata *MD = Summary.getMD(Context);
+ ASSERT_TRUE(MD);
+ ProfileSummary *PS = ProfileSummary::getFromMD(MD);
+ ASSERT_TRUE(PS);
+ VerifySummary(*PS);
+ delete PS;
+
+ // Test that summary can be attached to and read back from module.
+ Module M("my_module", Context);
+ M.setProfileSummary(MD);
+ MD = M.getProfileSummary();
+ ASSERT_TRUE(MD);
+ PS = ProfileSummary::getFromMD(MD);
+ ASSERT_TRUE(PS);
+ VerifySummary(*PS);
+ delete PS;
}
};