From 7b7c27afca5605a543dadb72954bfc62f29d1a48 Mon Sep 17 00:00:00 2001 From: Clement Courbet Date: Mon, 14 May 2018 09:01:22 +0000 Subject: [PATCH] [llvm-exegesis] Allow lists of BenchmarkResults to be parsed as std::vector. llvm-svn: 332221 --- llvm/tools/llvm-exegesis/lib/BenchmarkResult.cpp | 22 +++++++++++++++++++--- llvm/tools/llvm-exegesis/lib/BenchmarkResult.h | 1 + .../tools/llvm-exegesis/BenchmarkResultTest.cpp | 13 +++++++++++++ 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/llvm/tools/llvm-exegesis/lib/BenchmarkResult.cpp b/llvm/tools/llvm-exegesis/lib/BenchmarkResult.cpp index e9b8d29..dcc798d 100644 --- a/llvm/tools/llvm-exegesis/lib/BenchmarkResult.cpp +++ b/llvm/tools/llvm-exegesis/lib/BenchmarkResult.cpp @@ -54,18 +54,34 @@ template <> struct MappingTraits { } // namespace yaml } // namespace llvm +LLVM_YAML_IS_DOCUMENT_LIST_VECTOR(exegesis::InstructionBenchmark) + namespace exegesis { -InstructionBenchmark -InstructionBenchmark::readYamlOrDie(llvm::StringRef Filename) { +namespace { + +template +ObjectOrList readYamlOrDieCommon(llvm::StringRef Filename) { std::unique_ptr MemBuffer = llvm::cantFail( llvm::errorOrToExpected(llvm::MemoryBuffer::getFile(Filename))); llvm::yaml::Input Yin(*MemBuffer); - InstructionBenchmark Benchmark; + ObjectOrList Benchmark; Yin >> Benchmark; return Benchmark; } +} // namespace + +InstructionBenchmark +InstructionBenchmark::readYamlOrDie(llvm::StringRef Filename) { + return readYamlOrDieCommon(Filename); +} + +std::vector +InstructionBenchmark::readYamlsOrDie(llvm::StringRef Filename) { + return readYamlOrDieCommon>(Filename); +} + void InstructionBenchmark::writeYamlOrDie(const llvm::StringRef Filename) { if (Filename == "-") { llvm::yaml::Output Yout(llvm::outs()); diff --git a/llvm/tools/llvm-exegesis/lib/BenchmarkResult.h b/llvm/tools/llvm-exegesis/lib/BenchmarkResult.h index e906aea..d6b93f4 100644 --- a/llvm/tools/llvm-exegesis/lib/BenchmarkResult.h +++ b/llvm/tools/llvm-exegesis/lib/BenchmarkResult.h @@ -43,6 +43,7 @@ struct InstructionBenchmark { std::string Error; static InstructionBenchmark readYamlOrDie(llvm::StringRef Filename); + static std::vector readYamlsOrDie(llvm::StringRef Filename); // Unfortunately this function is non const because of YAML traits. void writeYamlOrDie(const llvm::StringRef Filename); diff --git a/llvm/unittests/tools/llvm-exegesis/BenchmarkResultTest.cpp b/llvm/unittests/tools/llvm-exegesis/BenchmarkResultTest.cpp index d1239a4..82c9481 100644 --- a/llvm/unittests/tools/llvm-exegesis/BenchmarkResultTest.cpp +++ b/llvm/unittests/tools/llvm-exegesis/BenchmarkResultTest.cpp @@ -44,6 +44,7 @@ TEST(BenchmarkResultTest, WriteToAndReadFromDisk) { ToDisk.writeYamlOrDie(Filename); { + // One-element version. const auto FromDisk = InstructionBenchmark::readYamlOrDie(Filename); EXPECT_EQ(FromDisk.AsmTmpl.Name, ToDisk.AsmTmpl.Name); @@ -53,6 +54,18 @@ TEST(BenchmarkResultTest, WriteToAndReadFromDisk) { EXPECT_THAT(FromDisk.Measurements, ToDisk.Measurements); EXPECT_THAT(FromDisk.Error, ToDisk.Error); } + { + // Vector version. + const auto FromDiskVector = InstructionBenchmark::readYamlsOrDie(Filename); + ASSERT_EQ(FromDiskVector.size(), 1); + const auto FromDisk = FromDiskVector[0]; + EXPECT_EQ(FromDisk.AsmTmpl.Name, ToDisk.AsmTmpl.Name); + EXPECT_EQ(FromDisk.CpuName, ToDisk.CpuName); + EXPECT_EQ(FromDisk.LLVMTriple, ToDisk.LLVMTriple); + EXPECT_EQ(FromDisk.NumRepetitions, ToDisk.NumRepetitions); + EXPECT_THAT(FromDisk.Measurements, ToDisk.Measurements); + EXPECT_THAT(FromDisk.Error, ToDisk.Error); + } } } // namespace -- 2.7.4