diff --git a/runtime/executor/method_meta.cpp b/runtime/executor/method_meta.cpp index 5acf055a89f..f43398d0ab7 100644 --- a/runtime/executor/method_meta.cpp +++ b/runtime/executor/method_meta.cpp @@ -210,5 +210,25 @@ Result MethodMeta::memory_planned_buffer_size(size_t index) const { return s_plan_->non_const_buffer_sizes()->Get(index + 1); } +size_t MethodMeta::num_instructions() const { + const auto chains = s_plan_->chains(); + if (chains == nullptr) { + return 0; + } + const auto num_chains = chains->size(); + auto num_instructions = 0; + for (size_t i = 0; i < num_chains; ++i) { + auto s_chain = chains->Get(i); + if (s_chain == nullptr) { + continue; + } + auto s_instructions = s_chain->instructions(); + if (s_instructions != nullptr) { + num_instructions += s_instructions->size(); + } + } + return num_instructions; +} + } // namespace runtime } // namespace executorch diff --git a/runtime/executor/method_meta.h b/runtime/executor/method_meta.h index 569b93c0f9d..a5e932981c1 100644 --- a/runtime/executor/method_meta.h +++ b/runtime/executor/method_meta.h @@ -185,6 +185,13 @@ class MethodMeta final { */ Result memory_planned_buffer_size(size_t index) const; + /** + * Get the number of instructions in this method. + * + * @returns The number of instructions. + */ + ET_EXPERIMENTAL size_t num_instructions() const; + /** * DEPRECATED: Use num_memory_planned_buffers() instead. */ diff --git a/runtime/executor/test/method_meta_test.cpp b/runtime/executor/test/method_meta_test.cpp index bd48f64d98f..1cb20496f5a 100644 --- a/runtime/executor/test/method_meta_test.cpp +++ b/runtime/executor/test/method_meta_test.cpp @@ -92,6 +92,9 @@ TEST_F(MethodMetaTest, MethodMetaApi) { method_meta->non_const_buffer_size(1).error(), Error::InvalidArgument); // Deprecated API + // Number instructions in method is nonzero + EXPECT_NE(method_meta->num_instructions(), 0); + // Missing method fails EXPECT_EQ( program_->method_meta("not_a_method").error(), Error::InvalidArgument);