diff options
author | Guillaume Chatelet <gchatelet@google.com> | 2018-06-07 07:51:16 +0000 |
---|---|---|
committer | Guillaume Chatelet <gchatelet@google.com> | 2018-06-07 07:51:16 +0000 |
commit | 184b9569f9375054aaf50b175520d09ce6fd6a05 (patch) | |
tree | 0e9ca23a0ef1027e7912708ec72afe210aa98234 /tools/llvm-exegesis | |
parent | a1c8d87b41461d4b14dec66d7b3bde3942e4cb24 (diff) |
[llvm-exegesis] Improve error reporting.
Summary: BenchmarkResult IO functions now return an Error or Expected so caller can deal take proper action.
Reviewers: courbet
Subscribers: tschuett, llvm-commits
Differential Revision: https://reviews.llvm.org/D47868
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@334167 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/llvm-exegesis')
-rw-r--r-- | tools/llvm-exegesis/lib/BenchmarkResult.cpp | 52 | ||||
-rw-r--r-- | tools/llvm-exegesis/lib/BenchmarkResult.h | 14 | ||||
-rw-r--r-- | tools/llvm-exegesis/llvm-exegesis.cpp | 27 |
3 files changed, 53 insertions, 40 deletions
diff --git a/tools/llvm-exegesis/lib/BenchmarkResult.cpp b/tools/llvm-exegesis/lib/BenchmarkResult.cpp index aac93abcbe8..9fe7a846353 100644 --- a/tools/llvm-exegesis/lib/BenchmarkResult.cpp +++ b/tools/llvm-exegesis/lib/BenchmarkResult.cpp @@ -210,27 +210,32 @@ unsigned BenchmarkResultContext::getInstrOpcode(llvm::StringRef Name) const { } template <typename ObjectOrList> -static ObjectOrList readYamlOrDieCommon(const BenchmarkResultContext &Context, - llvm::StringRef Filename) { - std::unique_ptr<llvm::MemoryBuffer> MemBuffer = llvm::cantFail( - llvm::errorOrToExpected(llvm::MemoryBuffer::getFile(Filename))); - llvm::yaml::Input Yin(*MemBuffer, getUntypedContext(Context)); - ObjectOrList Benchmark; - Yin >> Benchmark; - return Benchmark; +static llvm::Expected<ObjectOrList> +readYamlCommon(const BenchmarkResultContext &Context, + llvm::StringRef Filename) { + if (auto ExpectedMemoryBuffer = + llvm::errorOrToExpected(llvm::MemoryBuffer::getFile(Filename))) { + std::unique_ptr<llvm::MemoryBuffer> MemoryBuffer = + std::move(ExpectedMemoryBuffer.get()); + llvm::yaml::Input Yin(*MemoryBuffer, getUntypedContext(Context)); + ObjectOrList Benchmark; + Yin >> Benchmark; + return Benchmark; + } else { + return ExpectedMemoryBuffer.takeError(); + } } -InstructionBenchmark -InstructionBenchmark::readYamlOrDie(const BenchmarkResultContext &Context, - llvm::StringRef Filename) { - return readYamlOrDieCommon<InstructionBenchmark>(Context, Filename); +llvm::Expected<InstructionBenchmark> +InstructionBenchmark::readYaml(const BenchmarkResultContext &Context, + llvm::StringRef Filename) { + return readYamlCommon<InstructionBenchmark>(Context, Filename); } -std::vector<InstructionBenchmark> -InstructionBenchmark::readYamlsOrDie(const BenchmarkResultContext &Context, - llvm::StringRef Filename) { - return readYamlOrDieCommon<std::vector<InstructionBenchmark>>(Context, - Filename); +llvm::Expected<std::vector<InstructionBenchmark>> +InstructionBenchmark::readYamls(const BenchmarkResultContext &Context, + llvm::StringRef Filename) { + return readYamlCommon<std::vector<InstructionBenchmark>>(Context, Filename); } void InstructionBenchmark::writeYamlTo(const BenchmarkResultContext &Context, @@ -245,18 +250,21 @@ void InstructionBenchmark::readYamlFrom(const BenchmarkResultContext &Context, Yin >> *this; } -// FIXME: Change the API to let the caller handle errors. -void InstructionBenchmark::writeYamlOrDie(const BenchmarkResultContext &Context, - const llvm::StringRef Filename) { +llvm::Error +InstructionBenchmark::writeYaml(const BenchmarkResultContext &Context, + const llvm::StringRef Filename) { if (Filename == "-") { writeYamlTo(Context, llvm::outs()); } else { int ResultFD = 0; - llvm::cantFail(llvm::errorCodeToError( - openFileForWrite(Filename, ResultFD, llvm::sys::fs::F_Text))); + if (auto E = llvm::errorCodeToError( + openFileForWrite(Filename, ResultFD, llvm::sys::fs::F_Text))) { + return E; + } llvm::raw_fd_ostream Ostr(ResultFD, true /*shouldClose*/); writeYamlTo(Context, Ostr); } + return llvm::Error::success(); } void BenchmarkMeasureStats::push(const BenchmarkMeasure &BM) { diff --git a/tools/llvm-exegesis/lib/BenchmarkResult.h b/tools/llvm-exegesis/lib/BenchmarkResult.h index 421e210274f..5fa9af8e9d3 100644 --- a/tools/llvm-exegesis/lib/BenchmarkResult.h +++ b/tools/llvm-exegesis/lib/BenchmarkResult.h @@ -58,13 +58,11 @@ struct InstructionBenchmark { std::string Info; // Read functions. - static InstructionBenchmark - readYamlOrDie(const BenchmarkResultContext &Context, - llvm::StringRef Filename); + static llvm::Expected<InstructionBenchmark> + readYaml(const BenchmarkResultContext &Context, llvm::StringRef Filename); - static std::vector<InstructionBenchmark> - readYamlsOrDie(const BenchmarkResultContext &Context, - llvm::StringRef Filename); + static llvm::Expected<std::vector<InstructionBenchmark>> + readYamls(const BenchmarkResultContext &Context, llvm::StringRef Filename); void readYamlFrom(const BenchmarkResultContext &Context, llvm::StringRef InputContent); @@ -72,8 +70,8 @@ struct InstructionBenchmark { // Write functions, non-const because of YAML traits. void writeYamlTo(const BenchmarkResultContext &Context, llvm::raw_ostream &S); - void writeYamlOrDie(const BenchmarkResultContext &Context, - const llvm::StringRef Filename); + llvm::Error writeYaml(const BenchmarkResultContext &Context, + const llvm::StringRef Filename); }; //------------------------------------------------------------------------------ diff --git a/tools/llvm-exegesis/llvm-exegesis.cpp b/tools/llvm-exegesis/llvm-exegesis.cpp index a1848c3f14f..e59843b4aca 100644 --- a/tools/llvm-exegesis/llvm-exegesis.cpp +++ b/tools/llvm-exegesis/llvm-exegesis.cpp @@ -45,7 +45,7 @@ static llvm::cl::opt<std::string> llvm::cl::init("")); static llvm::cl::opt<std::string> - BenchmarkFile("benchmarks-file", llvm::cl::desc(""), llvm::cl::init("-")); + BenchmarkFile("benchmarks-file", llvm::cl::desc(""), llvm::cl::init("")); enum class BenchmarkModeE { Latency, Uops, Analysis }; static llvm::cl::opt<BenchmarkModeE> BenchmarkMode( @@ -79,6 +79,8 @@ static llvm::cl::opt<std::string> namespace exegesis { +static llvm::ExitOnError ExitOnErr; + static unsigned GetOpcodeOrDie(const llvm::MCInstrInfo &MCInstrInfo) { if (OpcodeName.empty() && (OpcodeIndex == 0)) llvm::report_fatal_error( @@ -138,8 +140,13 @@ void benchmarkMain() { if (NumRepetitions == 0) llvm::report_fatal_error("--num-repetitions must be greater than zero"); - Runner->run(GetOpcodeOrDie(State.getInstrInfo()), Filter, NumRepetitions) - .writeYamlOrDie(getBenchmarkResultContext(State), BenchmarkFile); + // Write to standard output if file is not set. + if (BenchmarkFile.empty()) + BenchmarkFile = "-"; + + ExitOnErr( + Runner->run(GetOpcodeOrDie(State.getInstrInfo()), Filter, NumRepetitions) + .writeYaml(getBenchmarkResultContext(State), BenchmarkFile)); exegesis::pfm::pfmTerminate(); } @@ -157,21 +164,21 @@ static void maybeRunAnalysis(const Analysis &Analyzer, const std::string &Name, std::error_code ErrorCode; llvm::raw_fd_ostream ClustersOS(OutputFilename, ErrorCode, llvm::sys::fs::F_RW); - if (ErrorCode) - llvm::report_fatal_error("cannot open out file: " + OutputFilename); - if (auto Err = Analyzer.run<Pass>(ClustersOS)) - llvm::report_fatal_error(std::move(Err)); + ExitOnErr(llvm::errorCodeToError(ErrorCode)); + ExitOnErr(Analyzer.run<Pass>(ClustersOS)); } static void analysisMain() { + if (BenchmarkFile.empty()) + llvm::report_fatal_error("--benchmarks-file must be set."); + llvm::InitializeNativeTarget(); llvm::InitializeNativeTargetAsmPrinter(); - // Read benchmarks. const LLVMState State; const std::vector<InstructionBenchmark> Points = - InstructionBenchmark::readYamlsOrDie(getBenchmarkResultContext(State), - BenchmarkFile); + ExitOnErr(InstructionBenchmark::readYamls( + getBenchmarkResultContext(State), BenchmarkFile)); llvm::outs() << "Parsed " << Points.size() << " benchmark points\n"; if (Points.empty()) { llvm::errs() << "no benchmarks to analyze\n"; |