@@ -89,13 +89,25 @@ BenchmarkRunner::FunctionExecutor::runAndSample(const char *Counters) const {
8989namespace {
9090class InProcessFunctionExecutorImpl : public BenchmarkRunner ::FunctionExecutor {
9191public:
92+ static Expected<std::unique_ptr<InProcessFunctionExecutorImpl>>
93+ create (const LLVMState &State, object::OwningBinary<object::ObjectFile> Obj,
94+ BenchmarkRunner::ScratchSpace *Scratch) {
95+ Expected<ExecutableFunction> EF =
96+ ExecutableFunction::create (State.createTargetMachine (), std::move (Obj));
97+
98+ if (!EF)
99+ return EF.takeError ();
100+
101+ return std::unique_ptr<InProcessFunctionExecutorImpl>(
102+ new InProcessFunctionExecutorImpl (State, std::move (*EF), Scratch));
103+ }
104+
105+ private:
92106 InProcessFunctionExecutorImpl (const LLVMState &State,
93- object::OwningBinary<object::ObjectFile> Obj ,
107+ ExecutableFunction Function ,
94108 BenchmarkRunner::ScratchSpace *Scratch)
95- : State(State), Function(State.createTargetMachine(), std::move(Obj)),
96- Scratch (Scratch) {}
109+ : State(State), Function(std::move(Function)), Scratch(Scratch) {}
97110
98- private:
99111 static void
100112 accumulateCounterValues (const llvm::SmallVector<int64_t , 4 > &NewValues,
101113 llvm::SmallVector<int64_t , 4 > *Result) {
@@ -161,13 +173,24 @@ class InProcessFunctionExecutorImpl : public BenchmarkRunner::FunctionExecutor {
161173class SubProcessFunctionExecutorImpl
162174 : public BenchmarkRunner::FunctionExecutor {
163175public:
176+ static Expected<std::unique_ptr<SubProcessFunctionExecutorImpl>>
177+ create (const LLVMState &State, object::OwningBinary<object::ObjectFile> Obj,
178+ const BenchmarkKey &Key) {
179+ Expected<ExecutableFunction> EF =
180+ ExecutableFunction::create (State.createTargetMachine (), std::move (Obj));
181+ if (!EF)
182+ return EF.takeError ();
183+
184+ return std::unique_ptr<SubProcessFunctionExecutorImpl>(
185+ new SubProcessFunctionExecutorImpl (State, std::move (*EF), Key));
186+ }
187+
188+ private:
164189 SubProcessFunctionExecutorImpl (const LLVMState &State,
165- object::OwningBinary<object::ObjectFile> Obj ,
190+ ExecutableFunction Function ,
166191 const BenchmarkKey &Key)
167- : State(State), Function(State.createTargetMachine(), std::move(Obj)),
168- Key (Key) {}
192+ : State(State), Function(std::move(Function)), Key(Key) {}
169193
170- private:
171194 enum ChildProcessExitCodeE {
172195 CounterFDReadFailed = 1 ,
173196 RSeqDisableFailed,
@@ -497,17 +520,27 @@ BenchmarkRunner::createFunctionExecutor(
497520 object::OwningBinary<object::ObjectFile> ObjectFile,
498521 const BenchmarkKey &Key) const {
499522 switch (ExecutionMode) {
500- case ExecutionModeE::InProcess:
501- return std::make_unique<InProcessFunctionExecutorImpl> (
523+ case ExecutionModeE::InProcess: {
524+ auto InProcessExecutorOrErr = InProcessFunctionExecutorImpl::create (
502525 State, std::move (ObjectFile), Scratch.get ());
503- case ExecutionModeE::SubProcess:
526+ if (!InProcessExecutorOrErr)
527+ return InProcessExecutorOrErr.takeError ();
528+
529+ return std::move (*InProcessExecutorOrErr);
530+ }
531+ case ExecutionModeE::SubProcess: {
504532#ifdef __linux__
505- return std::make_unique<SubProcessFunctionExecutorImpl> (
533+ auto SubProcessExecutorOrErr = SubProcessFunctionExecutorImpl::create (
506534 State, std::move (ObjectFile), Key);
535+ if (!SubProcessExecutorOrErr)
536+ return SubProcessExecutorOrErr.takeError ();
537+
538+ return std::move (*SubProcessExecutorOrErr);
507539#else
508540 return make_error<Failure>(
509541 " The subprocess execution mode is only supported on Linux" );
510542#endif
543+ }
511544 }
512545 llvm_unreachable (" ExecutionMode is outside expected range" );
513546}
0 commit comments