@@ -161,10 +161,24 @@ void setup_output_storage(
161
161
inline std::unique_ptr<Module> load_module_from_buffer (
162
162
const void * ptr,
163
163
size_t ptr_len,
164
+ std::optional<const void *> data_map_ptr,
165
+ std::optional<size_t > data_map_len,
164
166
std::unique_ptr<runtime::EventTracer> event_tracer,
165
167
Program::Verification program_verification) {
166
168
EXECUTORCH_SCOPE_PROF (" load_module_from_buffer" );
167
169
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
+
168
182
return std::make_unique<Module>(
169
183
std::move (loader),
170
184
nullptr , // memory_allocator
@@ -504,6 +518,7 @@ struct PyMethodMeta final {
504
518
struct PyModule final {
505
519
explicit PyModule (
506
520
const py::bytes& buffer,
521
+ std::optional<const py::bytes> data_map_buffer,
507
522
bool enable_etdump,
508
523
size_t debug_buffer_size = 0 ,
509
524
Program::Verification program_verification =
@@ -512,12 +527,21 @@ struct PyModule final {
512
527
module_(load_module_from_buffer(
513
528
buffer.cast<std::string_view>().data(),
514
529
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,
515
537
setup_event_tracer(enable_etdump, debug_buffer_size),
516
538
program_verification)) {}
517
539
518
540
explicit PyModule (
519
541
const void * ptr,
520
542
size_t ptr_len,
543
+ std::optional<const void *> data_map_ptr,
544
+ std::optional<size_t > data_map_ptr_len,
521
545
bool enable_etdump,
522
546
size_t debug_buffer_size = 0 ,
523
547
Program::Verification program_verification =
@@ -526,6 +550,8 @@ struct PyModule final {
526
550
module_(load_module_from_buffer(
527
551
ptr,
528
552
ptr_len,
553
+ data_map_ptr,
554
+ data_map_ptr_len,
529
555
setup_event_tracer (enable_etdump, debug_buffer_size),
530
556
program_verification)) {}
531
557
@@ -551,12 +577,17 @@ struct PyModule final {
551
577
// Module is only valid as long as the python buffer is alive.
552
578
static std::unique_ptr<PyModule> load_from_buffer (
553
579
const py::bytes& buffer,
580
+ std::optional<const py::bytes> data_map_buffer,
554
581
bool enable_etdump,
555
582
size_t debug_buffer_size = 0 ,
556
583
Program::Verification program_verification =
557
584
Program::Verification::InternalConsistency) {
558
585
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);
560
591
}
561
592
562
593
static std::unique_ptr<PyModule> load_from_file (
@@ -576,13 +607,25 @@ struct PyModule final {
576
607
577
608
static std::unique_ptr<PyModule> load_from_bundled_program (
578
609
PyBundledModule& m,
610
+ std::optional<const py::bytes> data_map_buffer,
579
611
bool enable_etdump,
580
612
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
+
581
621
return std::make_unique<PyModule>(
582
622
m.get_program_ptr (),
583
623
m.get_program_len (),
624
+ data_map_ptr,
625
+ data_map_len,
584
626
enable_etdump,
585
- debug_buffer_size);
627
+ debug_buffer_size,
628
+ Program::Verification::InternalConsistency);
586
629
}
587
630
588
631
py::list run_method (
@@ -1423,6 +1466,7 @@ PYBIND11_MODULE(EXECUTORCH_PYTHON_MODULE_NAME, m) {
1423
1466
" _load_for_executorch_from_buffer" ,
1424
1467
&PyModule::load_from_buffer,
1425
1468
py::arg (" buffer" ),
1469
+ py::arg (" data_buffer" ) = std::nullopt ,
1426
1470
py::arg (" enable_etdump" ) = false ,
1427
1471
py::arg (" debug_buffer_size" ) = 0 ,
1428
1472
py::arg (" program_verification" ) =
@@ -1432,6 +1476,7 @@ PYBIND11_MODULE(EXECUTORCH_PYTHON_MODULE_NAME, m) {
1432
1476
" _load_for_executorch_from_bundled_program" ,
1433
1477
&PyModule::load_from_bundled_program,
1434
1478
py::arg (" ptr" ),
1479
+ py::arg (" data_map_ptr" ) = std::nullopt ,
1435
1480
py::arg (" enable_etdump" ) = false ,
1436
1481
py::arg (" debug_buffer_size" ) = 0 ,
1437
1482
call_guard);
0 commit comments