#include "llvm/ADT/Statistic.h"
#include "llvm/Support/raw_ostream.h"
#include "gtest/gtest.h"
using namespace llvm;
using OptionalStatistic = Optional<std::pair<StringRef, uint64_t>>;
namespace {
#define DEBUG_TYPE "unittest"
STATISTIC(Counter, "Counts things");
STATISTIC(Counter2, "Counts other things");
ALWAYS_ENABLED_STATISTIC(AlwaysCounter, "Counts things always");
#if LLVM_ENABLE_STATS
static void
extractCounters(const std::vector<std::pair<StringRef, uint64_t>> &Range,
OptionalStatistic &S1, OptionalStatistic &S2) {
for (const auto &S : Range) {
if (S.first == "Counter")
S1 = S;
if (S.first == "Counter2")
S2 = S;
}
}
#endif
TEST(StatisticTest, Count) {
EnableStatistics();
Counter = 0;
EXPECT_EQ(Counter, 0ull);
Counter++;
Counter++;
Counter += (std::numeric_limits<uint64_t>::max() - 3);
#if LLVM_ENABLE_STATS
EXPECT_EQ(Counter, std::numeric_limits<uint64_t>::max() - 1);
#else
EXPECT_EQ(Counter, UINT64_C(0));
#endif
AlwaysCounter = 0;
EXPECT_EQ(AlwaysCounter, 0ull);
AlwaysCounter++;
++AlwaysCounter;
EXPECT_EQ(AlwaysCounter, 2ull);
}
TEST(StatisticTest, Assign) {
EnableStatistics();
Counter = 2;
#if LLVM_ENABLE_STATS
EXPECT_EQ(Counter, 2u);
#else
EXPECT_EQ(Counter, 0u);
#endif
AlwaysCounter = 2;
EXPECT_EQ(AlwaysCounter, 2u);
}
TEST(StatisticTest, API) {
EnableStatistics();
ResetStatistics();
Counter = 0;
EXPECT_EQ(Counter, 0u);
Counter++;
Counter++;
#if LLVM_ENABLE_STATS
EXPECT_EQ(Counter, 2u);
#else
EXPECT_EQ(Counter, 0u);
#endif
#if LLVM_ENABLE_STATS
{
const auto Range1 = GetStatistics();
EXPECT_NE(Range1.begin(), Range1.end());
EXPECT_EQ(Range1.begin() + 1, Range1.end());
OptionalStatistic S1;
OptionalStatistic S2;
extractCounters(Range1, S1, S2);
EXPECT_EQ(S1.has_value(), true);
EXPECT_EQ(S2.has_value(), false);
}
Counter2++;
{
const auto Range = GetStatistics();
EXPECT_NE(Range.begin(), Range.end());
EXPECT_EQ(Range.begin() + 2, Range.end());
OptionalStatistic S1;
OptionalStatistic S2;
extractCounters(Range, S1, S2);
EXPECT_EQ(S1.has_value(), true);
EXPECT_EQ(S2.has_value(), true);
EXPECT_EQ(S1->first, "Counter");
EXPECT_EQ(S1->second, 2u);
EXPECT_EQ(S2->first, "Counter2");
EXPECT_EQ(S2->second, 1u);
}
#else
Counter2++;
auto &Range = GetStatistics();
EXPECT_EQ(Range.begin(), Range.end());
#endif
#if LLVM_ENABLE_STATS
ResetStatistics();
{
auto &Range = GetStatistics();
EXPECT_EQ(Range.begin(), Range.end());
EXPECT_EQ(Counter, 0u);
EXPECT_EQ(Counter2, 0u);
OptionalStatistic S1;
OptionalStatistic S2;
extractCounters(Range, S1, S2);
EXPECT_EQ(S1.has_value(), false);
EXPECT_EQ(S2.has_value(), false);
}
Counter++;
Counter2++;
{
auto &Range = GetStatistics();
EXPECT_EQ(Range.begin() + 2, Range.end());
EXPECT_EQ(Counter, 1u);
EXPECT_EQ(Counter2, 1u);
OptionalStatistic S1;
OptionalStatistic S2;
extractCounters(Range, S1, S2);
EXPECT_EQ(S1.has_value(), true);
EXPECT_EQ(S2.has_value(), true);
EXPECT_EQ(S1->first, "Counter");
EXPECT_EQ(S1->second, 1u);
EXPECT_EQ(S2->first, "Counter2");
EXPECT_EQ(S2->second, 1u);
}
#else
ResetStatistics();
#endif
}
}