mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-21 02:24:22 +00:00
InstrProf: Add unit tests for the profile reader and writer
This required some minor API to be added to these types to avoid needing temp files. Also, I've used initializer lists in the tests, as MSVC 2013 claims to support them. I'll redo this without them if the bots complain. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@229455 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
88
unittests/ProfileData/InstrProfTest.cpp
Normal file
88
unittests/ProfileData/InstrProfTest.cpp
Normal file
@ -0,0 +1,88 @@
|
||||
//===- unittest/ProfileData/InstrProfTest.cpp -------------------------------=//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "llvm/ProfileData/InstrProfReader.h"
|
||||
#include "llvm/ProfileData/InstrProfWriter.h"
|
||||
#include "gtest/gtest.h"
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
namespace {
|
||||
|
||||
TEST(InstrProfTest, write_and_read_empty_profile) {
|
||||
InstrProfWriter Writer;
|
||||
std::string Profile = Writer.writeString();
|
||||
auto ReaderOrErr =
|
||||
IndexedInstrProfReader::create(MemoryBuffer::getMemBuffer(Profile));
|
||||
ASSERT_EQ(std::error_code(), ReaderOrErr.getError());
|
||||
auto Reader = std::move(ReaderOrErr.get());
|
||||
ASSERT_TRUE(Reader->begin() == Reader->end());
|
||||
}
|
||||
|
||||
TEST(InstrProfTest, write_and_read_one_function) {
|
||||
InstrProfWriter Writer;
|
||||
Writer.addFunctionCounts("foo", 0x1234, {1, 2, 3, 4});
|
||||
std::string Profile = Writer.writeString();
|
||||
auto ReaderOrErr =
|
||||
IndexedInstrProfReader::create(MemoryBuffer::getMemBuffer(Profile));
|
||||
ASSERT_EQ(std::error_code(), ReaderOrErr.getError());
|
||||
auto Reader = std::move(ReaderOrErr.get());
|
||||
|
||||
auto I = Reader->begin(), E = Reader->end();
|
||||
ASSERT_TRUE(I != E);
|
||||
ASSERT_EQ(StringRef("foo"), I->Name);
|
||||
ASSERT_EQ(0x1234U, I->Hash);
|
||||
ASSERT_EQ(4U, I->Counts.size());
|
||||
ASSERT_EQ(1U, I->Counts[0]);
|
||||
ASSERT_EQ(2U, I->Counts[1]);
|
||||
ASSERT_EQ(3U, I->Counts[2]);
|
||||
ASSERT_EQ(4U, I->Counts[3]);
|
||||
ASSERT_TRUE(++I == E);
|
||||
}
|
||||
|
||||
TEST(InstrProfTest, get_function_counts) {
|
||||
InstrProfWriter Writer;
|
||||
Writer.addFunctionCounts("foo", 0x1234, {1, 2});
|
||||
std::string Profile = Writer.writeString();
|
||||
auto ReaderOrErr =
|
||||
IndexedInstrProfReader::create(MemoryBuffer::getMemBuffer(Profile));
|
||||
ASSERT_EQ(std::error_code(), ReaderOrErr.getError());
|
||||
auto Reader = std::move(ReaderOrErr.get());
|
||||
|
||||
std::vector<uint64_t> Counts;
|
||||
std::error_code EC;
|
||||
|
||||
EC = Reader->getFunctionCounts("foo", 0x1234, Counts);
|
||||
ASSERT_EQ(instrprof_error::success, EC);
|
||||
ASSERT_EQ(2U, Counts.size());
|
||||
ASSERT_EQ(1U, Counts[0]);
|
||||
ASSERT_EQ(2U, Counts[1]);
|
||||
|
||||
EC = Reader->getFunctionCounts("foo", 0x5678, Counts);
|
||||
ASSERT_EQ(instrprof_error::hash_mismatch, EC);
|
||||
|
||||
EC = Reader->getFunctionCounts("bar", 0x1234, Counts);
|
||||
ASSERT_EQ(instrprof_error::unknown_function, EC);
|
||||
}
|
||||
|
||||
TEST(InstrProfTest, get_max_function_count) {
|
||||
InstrProfWriter Writer;
|
||||
Writer.addFunctionCounts("foo", 0x1234, {1ULL << 31, 2});
|
||||
Writer.addFunctionCounts("bar", 0, {1ULL << 63});
|
||||
Writer.addFunctionCounts("baz", 0x5678, {0, 0, 0, 0});
|
||||
std::string Profile = Writer.writeString();
|
||||
auto ReaderOrErr =
|
||||
IndexedInstrProfReader::create(MemoryBuffer::getMemBuffer(Profile));
|
||||
ASSERT_EQ(std::error_code(), ReaderOrErr.getError());
|
||||
auto Reader = std::move(ReaderOrErr.get());
|
||||
|
||||
ASSERT_EQ(1ULL << 63, Reader->getMaximumFunctionCount());
|
||||
}
|
||||
|
||||
} // end anonymous namespace
|
Reference in New Issue
Block a user