From 628f1ae504207fec96529426fa42d7854c581230 Mon Sep 17 00:00:00 2001 From: Roman Lebedev Date: Wed, 10 Apr 2019 12:19:57 +0000 Subject: [PATCH] [llvm-exegesis] Fix error propagation from yaml writing (from serialization) Investigating https://bugs.llvm.org/show_bug.cgi?id=41448 llvm-svn: 358076 --- .../llvm-exegesis/lib/BenchmarkResult.cpp | 20 +++++++++++++------ .../tools/llvm-exegesis/lib/BenchmarkResult.h | 5 +++-- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/llvm/tools/llvm-exegesis/lib/BenchmarkResult.cpp b/llvm/tools/llvm-exegesis/lib/BenchmarkResult.cpp index c7a0c8470bbd..ed8531f44003 100644 --- a/llvm/tools/llvm-exegesis/lib/BenchmarkResult.cpp +++ b/llvm/tools/llvm-exegesis/lib/BenchmarkResult.cpp @@ -365,27 +365,34 @@ InstructionBenchmark::readYamls(const LLVMState &State, } } -void InstructionBenchmark::writeYamlTo(const LLVMState &State, - llvm::raw_ostream &OS) { +llvm::Error InstructionBenchmark::writeYamlTo(const LLVMState &State, + llvm::raw_ostream &OS) { llvm::yaml::Output Yout(OS, nullptr /*Ctx*/, 200 /*WrapColumn*/); YamlContext Context(State); Yout.beginDocuments(); llvm::yaml::yamlize(Yout, *this, /*unused*/ true, Context); + if (!Context.getLastError().empty()) + return llvm::make_error(Context.getLastError()); Yout.endDocuments(); + return Error::success(); } -void InstructionBenchmark::readYamlFrom(const LLVMState &State, - llvm::StringRef InputContent) { +llvm::Error InstructionBenchmark::readYamlFrom(const LLVMState &State, + llvm::StringRef InputContent) { llvm::yaml::Input Yin(InputContent); YamlContext Context(State); if (Yin.setCurrentDocument()) llvm::yaml::yamlize(Yin, *this, /*unused*/ true, Context); + if (!Context.getLastError().empty()) + return llvm::make_error(Context.getLastError()); + return Error::success(); } llvm::Error InstructionBenchmark::writeYaml(const LLVMState &State, const llvm::StringRef Filename) { if (Filename == "-") { - writeYamlTo(State, llvm::outs()); + if (auto Err = writeYamlTo(State, llvm::outs())) + return std::move(Err); } else { int ResultFD = 0; if (auto E = llvm::errorCodeToError( @@ -394,7 +401,8 @@ llvm::Error InstructionBenchmark::writeYaml(const LLVMState &State, return E; } llvm::raw_fd_ostream Ostr(ResultFD, true /*shouldClose*/); - writeYamlTo(State, Ostr); + if (auto Err = writeYamlTo(State, Ostr)) + return std::move(Err); } return llvm::Error::success(); } diff --git a/llvm/tools/llvm-exegesis/lib/BenchmarkResult.h b/llvm/tools/llvm-exegesis/lib/BenchmarkResult.h index d75e18b74896..e54e8c2a8dac 100644 --- a/llvm/tools/llvm-exegesis/lib/BenchmarkResult.h +++ b/llvm/tools/llvm-exegesis/lib/BenchmarkResult.h @@ -79,10 +79,11 @@ struct InstructionBenchmark { static llvm::Expected> readYamls(const LLVMState &State, llvm::StringRef Filename); - void readYamlFrom(const LLVMState &State, llvm::StringRef InputContent); + llvm::Error readYamlFrom(const LLVMState &State, + llvm::StringRef InputContent); // Write functions, non-const because of YAML traits. - void writeYamlTo(const LLVMState &State, llvm::raw_ostream &S); + llvm::Error writeYamlTo(const LLVMState &State, llvm::raw_ostream &S); llvm::Error writeYaml(const LLVMState &State, const llvm::StringRef Filename); };