Index: tools/llvm-exegesis/lib/BenchmarkResult.h =================================================================== --- tools/llvm-exegesis/lib/BenchmarkResult.h +++ tools/llvm-exegesis/lib/BenchmarkResult.h @@ -43,6 +43,7 @@ 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); Index: tools/llvm-exegesis/lib/BenchmarkResult.cpp =================================================================== --- tools/llvm-exegesis/lib/BenchmarkResult.cpp +++ tools/llvm-exegesis/lib/BenchmarkResult.cpp @@ -54,18 +54,34 @@ } // 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()); Index: unittests/tools/llvm-exegesis/BenchmarkResultTest.cpp =================================================================== --- unittests/tools/llvm-exegesis/BenchmarkResultTest.cpp +++ unittests/tools/llvm-exegesis/BenchmarkResultTest.cpp @@ -44,6 +44,7 @@ ToDisk.writeYamlOrDie(Filename); { + // One-element version. const auto FromDisk = InstructionBenchmark::readYamlOrDie(Filename); EXPECT_EQ(FromDisk.AsmTmpl.Name, ToDisk.AsmTmpl.Name); @@ -53,6 +54,18 @@ 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