blob: a3cd622e7f2e2c092584bb0236be97fb8c4b5908 [file] [log] [blame]
// Copyright 2019 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include "third_party/mlir_edge/iree/hal/interpreter/interpreter_command_processor.h"
#include "third_party/absl/container/inlined_vector.h"
#include "third_party/absl/types/source_location.h"
#include "third_party/absl/types/span.h"
#include "third_party/mlir_edge/iree/base/status.h"
#include "third_party/mlir_edge/iree/base/tracing.h"
#include "third_party/mlir_edge/iree/hal/buffer_view.h"
#include "third_party/mlir_edge/iree/hal/interpreter/bytecode_executable.h"
namespace iree {
namespace hal {
InterpreterCommandProcessor::InterpreterCommandProcessor(
Allocator* allocator, CommandBufferModeBitfield mode,
CommandCategoryBitfield command_categories)
: HostLocalCommandProcessor(allocator, mode, command_categories) {}
InterpreterCommandProcessor::~InterpreterCommandProcessor() = default;
Status InterpreterCommandProcessor::Dispatch(
const DispatchRequest& dispatch_request) {
IREE_TRACE_SCOPE0("InterpreterCommandProcessor::Dispatch");
// Lookup the exported function.
auto* executable =
static_cast<BytecodeExecutable*>(dispatch_request.executable);
const auto& module = executable->module();
ASSIGN_OR_RETURN(auto entry_function, module.function_table().LookupExport(
dispatch_request.entry_point));
vm::Stack stack;
// TODO(benvanik): avoid this by directly referencing the bindings.
absl::InlinedVector<BufferView, 8> args;
args.reserve(dispatch_request.bindings.size());
for (auto& binding : dispatch_request.bindings) {
args.push_back(BufferView{add_ref(binding.buffer), binding.shape,
binding.element_size});
}
absl::InlinedVector<BufferView, 8> results;
if (entry_function.result_count() > 0) {
return UnimplementedErrorBuilder(ABSL_LOC)
<< "Executable export results are not yet implemented";
}
RETURN_IF_ERROR(executable->context().Invoke(
&stack, entry_function, absl::MakeSpan(args), absl::MakeSpan(results)));
return OkStatus();
}
} // namespace hal
} // namespace iree