diff options
author | Clement Courbet <courbet@google.com> | 2023-12-08 13:01:01 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-12-08 13:01:01 +0100 |
commit | 9017229ecda119e7977739dcab125e455289ade6 (patch) | |
tree | 55fb81dd79f1231b7f48ea514952bdfc6fd987c7 /llvm/tools/llvm-exegesis/lib/BenchmarkRunner.cpp | |
parent | 1d6a678591076f316bfcaa03a55beba20406dc00 (diff) | |
download | llvm-9017229ecda119e7977739dcab125e455289ade6.zip llvm-9017229ecda119e7977739dcab125e455289ade6.tar.gz llvm-9017229ecda119e7977739dcab125e455289ade6.tar.bz2 |
[llvm-exegesis]Allow clients to do their own snippet running error ha… (#74711)
…ndling.
Returns an error *and* a benchmark rather than an error *or* a
benchmark. This allows users to have custom error handling while still
being able to inspect the benchmark.
Apart from this small API change, this is an NFC.
This is an alternative to #74211.
Diffstat (limited to 'llvm/tools/llvm-exegesis/lib/BenchmarkRunner.cpp')
-rw-r--r-- | llvm/tools/llvm-exegesis/lib/BenchmarkRunner.cpp | 16 |
1 files changed, 6 insertions, 10 deletions
diff --git a/llvm/tools/llvm-exegesis/lib/BenchmarkRunner.cpp b/llvm/tools/llvm-exegesis/lib/BenchmarkRunner.cpp index 8e242cd..6c34446 100644 --- a/llvm/tools/llvm-exegesis/lib/BenchmarkRunner.cpp +++ b/llvm/tools/llvm-exegesis/lib/BenchmarkRunner.cpp @@ -572,7 +572,7 @@ BenchmarkRunner::createFunctionExecutor( llvm_unreachable("ExecutionMode is outside expected range"); } -Expected<Benchmark> BenchmarkRunner::runConfiguration( +std::pair<Error, Benchmark> BenchmarkRunner::runConfiguration( RunnableConfiguration &&RC, const std::optional<StringRef> &DumpFile) const { Benchmark &InstrBenchmark = RC.InstrBenchmark; @@ -583,8 +583,7 @@ Expected<Benchmark> BenchmarkRunner::runConfiguration( auto ObjectFilePath = writeObjectFile(ObjectFile.getBinary()->getData(), *DumpFile); if (Error E = ObjectFilePath.takeError()) { - InstrBenchmark.Error = toString(std::move(E)); - return std::move(InstrBenchmark); + return {std::move(E), std::move(InstrBenchmark)}; } outs() << "Check generated assembly with: /usr/bin/objdump -d " << *ObjectFilePath << "\n"; @@ -592,20 +591,17 @@ Expected<Benchmark> BenchmarkRunner::runConfiguration( if (BenchmarkPhaseSelector < BenchmarkPhaseSelectorE::Measure) { InstrBenchmark.Error = "actual measurements skipped."; - return std::move(InstrBenchmark); + return {Error::success(), std::move(InstrBenchmark)}; } Expected<std::unique_ptr<BenchmarkRunner::FunctionExecutor>> Executor = createFunctionExecutor(std::move(ObjectFile), RC.InstrBenchmark.Key); if (!Executor) - return Executor.takeError(); + return {Executor.takeError(), std::move(InstrBenchmark)}; auto NewMeasurements = runMeasurements(**Executor); if (Error E = NewMeasurements.takeError()) { - if (!E.isA<SnippetCrash>()) - return std::move(E); - InstrBenchmark.Error = toString(std::move(E)); - return std::move(InstrBenchmark); + return {std::move(E), std::move(InstrBenchmark)}; } assert(InstrBenchmark.NumRepetitions > 0 && "invalid NumRepetitions"); for (BenchmarkMeasure &BM : *NewMeasurements) { @@ -618,7 +614,7 @@ Expected<Benchmark> BenchmarkRunner::runConfiguration( } InstrBenchmark.Measurements = std::move(*NewMeasurements); - return std::move(InstrBenchmark); + return {Error::success(), std::move(InstrBenchmark)}; } Expected<std::string> |