@@ -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" ) = std::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" ) = std::nullopt ,
14351480 py::arg (" enable_etdump" ) = false ,
14361481 py::arg (" debug_buffer_size" ) = 0 ,
14371482 call_guard);
0 commit comments