@@ -161,10 +161,24 @@ void setup_output_storage(
161161inline  std::unique_ptr<Module> load_module_from_buffer (
162162    const  void * ptr,
163163    size_t  ptr_len,
164+     std::optional<const  void *> data_map_ptr,
165+     std::optional<size_t > data_map_len,
164166    std::unique_ptr<runtime::EventTracer> event_tracer,
165167    Program::Verification program_verification) {
166168  EXECUTORCH_SCOPE_PROF (" load_module_from_buffer" 
167169  auto  loader = std::make_unique<BufferDataLoader>(ptr, ptr_len);
170+ 
171+   if  (data_map_ptr.has_value () && data_map_len.has_value ()) {
172+     auto  data_map_loader = std::make_unique<BufferDataLoader>(
173+         data_map_ptr.value (), data_map_len.value ());
174+     return  std::make_unique<Module>(
175+         std::move (loader),
176+         nullptr , //  memory_allocator
177+         nullptr , //  temp_allocator
178+         std::move (event_tracer), //  event_tracer
179+         std::move (data_map_loader)); //  data_map_loader
180+   }
181+ 
168182  return  std::make_unique<Module>(
169183      std::move (loader),
170184      nullptr , //  memory_allocator
@@ -504,6 +518,7 @@ struct PyMethodMeta final {
504518struct  PyModule  final  {
505519  explicit  PyModule (
506520      const  py::bytes& buffer,
521+       std::optional<const  py::bytes> data_map_buffer,
507522      bool  enable_etdump,
508523      size_t  debug_buffer_size = 0 ,
509524      Program::Verification program_verification =
@@ -512,12 +527,21 @@ struct PyModule final {
512527        module_(load_module_from_buffer(
513528            buffer.cast<std::string_view>().data(),
514529            py::len(buffer),
530+             data_map_buffer.has_value()
531+                 ? std::optional<const  void*>(
532+                       data_map_buffer.value().cast<std::string_view>().data())
533+                 : std::nullopt,
534+             data_map_buffer.has_value()
535+                 ? std::optional<size_t>(py::len(data_map_buffer.value()))
536+                 : std::nullopt,
515537            setup_event_tracer(enable_etdump, debug_buffer_size),
516538            program_verification)) {}
517539
518540  explicit  PyModule (
519541      const  void * ptr,
520542      size_t  ptr_len,
543+       std::optional<const  void *> data_map_ptr,
544+       std::optional<size_t > data_map_ptr_len,
521545      bool  enable_etdump,
522546      size_t  debug_buffer_size = 0 ,
523547      Program::Verification program_verification =
@@ -526,6 +550,8 @@ struct PyModule final {
526550        module_(load_module_from_buffer(
527551            ptr,
528552            ptr_len,
553+             data_map_ptr,
554+             data_map_ptr_len,
529555            setup_event_tracer (enable_etdump, debug_buffer_size),
530556            program_verification)) {}
531557
@@ -551,12 +577,17 @@ struct PyModule final {
551577  //  Module is only valid as long as the python buffer is alive.
552578  static  std::unique_ptr<PyModule> load_from_buffer (
553579      const  py::bytes& buffer,
580+       std::optional<const  py::bytes> data_map_buffer,
554581      bool  enable_etdump,
555582      size_t  debug_buffer_size = 0 ,
556583      Program::Verification program_verification =
557584          Program::Verification::InternalConsistency) {
558585    return  std::make_unique<PyModule>(
559-         buffer, enable_etdump, debug_buffer_size, program_verification);
586+         buffer,
587+         data_map_buffer,
588+         enable_etdump,
589+         debug_buffer_size,
590+         program_verification);
560591  }
561592
562593  static  std::unique_ptr<PyModule> load_from_file (
@@ -576,13 +607,25 @@ struct PyModule final {
576607
577608  static  std::unique_ptr<PyModule> load_from_bundled_program (
578609      PyBundledModule& m,
610+       std::optional<const  py::bytes> data_map_buffer,
579611      bool  enable_etdump,
580612      size_t  debug_buffer_size = 0 ) {
613+     std::optional<const  void *> data_map_ptr = std::nullopt ;
614+     std::optional<size_t > data_map_len = std::nullopt ;
615+ 
616+     if  (data_map_buffer.has_value ()) {
617+       data_map_ptr = data_map_buffer.value ().cast <std::string_view>().data ();
618+       data_map_len = py::len (data_map_buffer.value ());
619+     }
620+ 
581621    return  std::make_unique<PyModule>(
582622        m.get_program_ptr (),
583623        m.get_program_len (),
624+         data_map_ptr,
625+         data_map_len,
584626        enable_etdump,
585-         debug_buffer_size);
627+         debug_buffer_size,
628+         Program::Verification::InternalConsistency);
586629  }
587630
588631  py::list run_method (
@@ -1423,6 +1466,7 @@ PYBIND11_MODULE(EXECUTORCH_PYTHON_MODULE_NAME, m) {
14231466      " _load_for_executorch_from_buffer" 
14241467      &PyModule::load_from_buffer,
14251468      py::arg (" buffer" 
1469+       py::arg (" data_map_buffer" nullopt ,
14261470      py::arg (" enable_etdump" false ,
14271471      py::arg (" debug_buffer_size" 0 ,
14281472      py::arg (" program_verification" 
@@ -1432,6 +1476,7 @@ PYBIND11_MODULE(EXECUTORCH_PYTHON_MODULE_NAME, m) {
14321476      " _load_for_executorch_from_bundled_program" 
14331477      &PyModule::load_from_bundled_program,
14341478      py::arg (" ptr" 
1479+       py::arg (" data_map_buffer" nullopt ,
14351480      py::arg (" enable_etdump" false ,
14361481      py::arg (" debug_buffer_size" 0 ,
14371482      call_guard);
0 commit comments