From ff966308e1964c0780cc7a1dc05b644a729124bc Mon Sep 17 00:00:00 2001 From: Justin Bogner Date: Wed, 4 Feb 2015 00:15:12 +0000 Subject: [PATCH] InstrProf: Add some unit tests for CoverageMapping The llvm-level tests for coverage mapping need a binary input file, which means they're hard to understand, hard to update, and it's difficult to add new ones. By adding some unit tests that build up the coverage data structures in C++, we can write more meaningful and targeted tests. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@228084 91177308-0d34-0410-b5e6-96231b3b80d8 --- unittests/CMakeLists.txt | 1 + unittests/Makefile | 2 +- unittests/ProfileData/CMakeLists.txt | 9 ++ unittests/ProfileData/CoverageMappingTest.cpp | 112 ++++++++++++++++++ unittests/ProfileData/Makefile | 15 +++ 5 files changed, 138 insertions(+), 1 deletion(-) create mode 100644 unittests/ProfileData/CMakeLists.txt create mode 100644 unittests/ProfileData/CoverageMappingTest.cpp create mode 100644 unittests/ProfileData/Makefile diff --git a/unittests/CMakeLists.txt b/unittests/CMakeLists.txt index 19c2d24534b..a1272edcc97 100644 --- a/unittests/CMakeLists.txt +++ b/unittests/CMakeLists.txt @@ -22,5 +22,6 @@ add_subdirectory(LineEditor) add_subdirectory(Linker) add_subdirectory(MC) add_subdirectory(Option) +add_subdirectory(ProfileData) add_subdirectory(Support) add_subdirectory(Transforms) diff --git a/unittests/Makefile b/unittests/Makefile index 603e7d58f8c..fefef0748b9 100644 --- a/unittests/Makefile +++ b/unittests/Makefile @@ -10,7 +10,7 @@ LEVEL = .. PARALLEL_DIRS = ADT Analysis Bitcode CodeGen DebugInfo ExecutionEngine IR \ - LineEditor Linker MC Option Support Transforms + LineEditor Linker MC Option ProfileData Support Transforms include $(LEVEL)/Makefile.config include $(LLVM_SRC_ROOT)/unittests/Makefile.unittest diff --git a/unittests/ProfileData/CMakeLists.txt b/unittests/ProfileData/CMakeLists.txt new file mode 100644 index 00000000000..3251ff41502 --- /dev/null +++ b/unittests/ProfileData/CMakeLists.txt @@ -0,0 +1,9 @@ +set(LLVM_LINK_COMPONENTS + Core + ProfileData + Support + ) + +add_llvm_unittest(ProfileDataTests + CoverageMappingTest.cpp + ) diff --git a/unittests/ProfileData/CoverageMappingTest.cpp b/unittests/ProfileData/CoverageMappingTest.cpp new file mode 100644 index 00000000000..5477f814300 --- /dev/null +++ b/unittests/ProfileData/CoverageMappingTest.cpp @@ -0,0 +1,112 @@ +//===- unittest/ProfileData/CoverageMappingTest.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/CoverageMapping.h" +#include "llvm/ProfileData/CoverageMappingReader.h" +#include "llvm/ProfileData/CoverageMappingWriter.h" +#include "llvm/Support/raw_ostream.h" +#include "gtest/gtest.h" + +using namespace llvm; +using namespace coverage; + +namespace llvm { +namespace coverage { +void PrintTo(const Counter &C, ::std::ostream *os) { + if (C.isZero()) + *os << "Zero"; + else if (C.isExpression()) + *os << "Expression " << C.getExpressionID(); + else + *os << "Counter " << C.getCounterID(); +} +} +} + +namespace { + +static std::string writeCoverage(MutableArrayRef Regions, + int NumFiles) { + SmallVector FileIDs; + for (int I = 0; I < NumFiles; ++I) + FileIDs.push_back(I); + + std::string Coverage; + llvm::raw_string_ostream OS(Coverage); + CoverageMappingWriter(FileIDs, None, Regions).write(OS); + OS.flush(); + + return Coverage; +} + +static std::vector +readCoverageRegions(std::string Coverage, int NumFiles) { + SmallVector Filenames; + SmallVector FilenameRefs; + for (int I = 0; I < NumFiles; ++I) { + Filenames.push_back("file" + std::to_string(I)); + FilenameRefs.push_back(Filenames.back()); + } + + std::vector FuncFiles; + std::vector Expressions; + std::vector Regions; + RawCoverageMappingReader Reader(Coverage, FilenameRefs, FuncFiles, + Expressions, Regions); + if (Reader.read()) + // ASSERT doesn't work here, we'll just return an empty vector. + Regions.clear(); + return Regions; +} + +TEST(CoverageMappingTest, basic_write_read) { + int NumFiles = 2; + CounterMappingRegion InputRegions[] = { + CounterMappingRegion::makeRegion(Counter::getCounter(0), 0, 1, 1, 1, 1), + CounterMappingRegion::makeRegion(Counter::getCounter(1), 0, 2, 1, 2, 2), + CounterMappingRegion::makeRegion(Counter::getZero(), 0, 3, 1, 3, 4), + CounterMappingRegion::makeRegion(Counter::getCounter(2), 0, 4, 1, 4, 8), + CounterMappingRegion::makeRegion(Counter::getCounter(3), 1, 1, 2, 3, 4), + }; + std::string Coverage = writeCoverage(InputRegions, NumFiles); + std::vector OutputRegions = + readCoverageRegions(Coverage, NumFiles); + ASSERT_FALSE(OutputRegions.empty()); + + size_t N = makeArrayRef(InputRegions).size(); + ASSERT_EQ(N, OutputRegions.size()); + for (size_t I = 0; I < N; ++I) { + ASSERT_EQ(InputRegions[I].Count, OutputRegions[I].Count); + ASSERT_EQ(InputRegions[I].FileID, OutputRegions[I].FileID); + ASSERT_EQ(InputRegions[I].startLoc(), OutputRegions[I].startLoc()); + ASSERT_EQ(InputRegions[I].endLoc(), OutputRegions[I].endLoc()); + ASSERT_EQ(InputRegions[I].Kind, OutputRegions[I].Kind); + } +} + +TEST(CoverageMappingTest, expansion_gets_first_counter) { + int NumFiles = 2; + CounterMappingRegion InputRegions[] = { + CounterMappingRegion::makeRegion(Counter::getCounter(1), 0, 10, 1, 10, 2), + // This starts earlier in file 0, so the expansion should get its counter. + CounterMappingRegion::makeRegion(Counter::getCounter(2), 0, 1, 1, 20, 1), + CounterMappingRegion::makeExpansion(1, 0, 3, 3, 3, 3), + }; + std::string Coverage = writeCoverage(InputRegions, NumFiles); + std::vector OutputRegions = + readCoverageRegions(Coverage, NumFiles); + ASSERT_FALSE(OutputRegions.empty()); + + ASSERT_EQ(CounterMappingRegion::ExpansionRegion, OutputRegions[2].Kind); + ASSERT_EQ(Counter::getCounter(2), OutputRegions[2].Count); + ASSERT_EQ(3U, OutputRegions[2].LineStart); +} + + +} // end anonymous namespace diff --git a/unittests/ProfileData/Makefile b/unittests/ProfileData/Makefile new file mode 100644 index 00000000000..d017c15c00a --- /dev/null +++ b/unittests/ProfileData/Makefile @@ -0,0 +1,15 @@ +##===- unittests/ProfileData/Makefile ----------------------*- Makefile -*-===## +# +# The LLVM Compiler Infrastructure +# +# This file is distributed under the University of Illinois Open Source +# License. See LICENSE.TXT for details. +# +##===----------------------------------------------------------------------===## + +LEVEL = ../.. +TESTNAME = ProfileData +LINK_COMPONENTS := ProfileData Core Support + +include $(LEVEL)/Makefile.config +include $(LLVM_SRC_ROOT)/unittests/Makefile.unittest -- 2.34.1