1010
1111#include < cstring>
1212
13+ #include < executorch/devtools/etdump/data_sink.h>
1314#include < executorch/devtools/etdump/emitter.h>
1415#include < executorch/devtools/etdump/etdump_schema_flatcc_builder.h>
1516#include < executorch/devtools/etdump/etdump_schema_flatcc_reader.h>
@@ -347,10 +348,10 @@ void ETDumpGen::log_intermediate_output_delegate_helper(
347348 ET_CHECK_MSG (
348349 (name == nullptr ) ^ (delegate_debug_index == -1 ),
349350 " Only name or delegate_debug_index can be valid. Check DelegateMappingBuilder documentation for more details." );
350- if (debug_buffer_. empty ()) {
351- ET_CHECK_MSG (0 , " Must pre-set debug buffer with set_debug_buffer() \n " );
352- return ;
353- }
351+
352+ ET_CHECK_MSG (
353+ data_sink_,
354+ " Must pre-set data sink before logging evalue with set_data_sink() or set_debug_buffer() \n " );
354355
355356 check_ready_to_add_events ();
356357 int64_t string_id = name != nullptr ? create_string_entry (name) : -1 ;
@@ -367,7 +368,7 @@ void ETDumpGen::log_intermediate_output_delegate_helper(
367368
368369 // Check the type of `output` then call the corresponding logging functions
369370 if constexpr (std::is_same<T, Tensor>::value) {
370- long offset = copy_tensor_to_debug_buffer (output);
371+ long offset = data_sink_-> write_tensor (output);
371372 etdump_Tensor_ref_t tensor_ref = add_tensor_entry (builder_, output, offset);
372373
373374 etdump_Value_start (builder_);
@@ -377,7 +378,7 @@ void ETDumpGen::log_intermediate_output_delegate_helper(
377378 } else if constexpr (std::is_same<T, ArrayRef<Tensor>>::value) {
378379 etdump_Tensor_vec_start (builder_);
379380 for (size_t i = 0 ; i < output.size (); ++i) {
380- long offset = copy_tensor_to_debug_buffer (output[i]);
381+ long offset = data_sink_-> write_tensor (output[i]);
381382 etdump_Tensor_vec_push (
382383 builder_, add_tensor_entry (builder_, output[i], offset));
383384 }
@@ -497,27 +498,15 @@ ETDumpResult ETDumpGen::get_etdump_data() {
497498}
498499
499500void ETDumpGen::set_debug_buffer (Span<uint8_t > buffer) {
500- debug_buffer_ = buffer;
501+ data_sink_ = std::make_shared<DataSink>( buffer) ;
501502}
502503
503- size_t ETDumpGen::copy_tensor_to_debug_buffer (executorch::aten::Tensor tensor) {
504- if (tensor.nbytes () == 0 ) {
505- return static_cast <size_t >(-1 );
506- }
507- uint8_t * offset_ptr =
508- internal::alignPointer (debug_buffer_.data () + debug_buffer_offset_, 64 );
509- debug_buffer_offset_ = (offset_ptr - debug_buffer_.data ()) + tensor.nbytes ();
510- ET_CHECK_MSG (
511- debug_buffer_offset_ <= debug_buffer_.size (),
512- " Ran out of space to store intermediate outputs." );
513- memcpy (offset_ptr, tensor.const_data_ptr (), tensor.nbytes ());
514- return (size_t )(offset_ptr - debug_buffer_.data ());
504+ void ETDumpGen::set_data_sink (std::shared_ptr<DataSinkBase> data_sink) {
505+ data_sink_ = data_sink;
515506}
516507
517508void ETDumpGen::log_evalue (const EValue& evalue, LoggedEValueType evalue_type) {
518- if (debug_buffer_.empty ()) {
519- return ;
520- }
509+ ET_CHECK_MSG (data_sink_, " Must set data sink before logging evalue\n " );
521510
522511 check_ready_to_add_events ();
523512
@@ -529,7 +518,7 @@ void ETDumpGen::log_evalue(const EValue& evalue, LoggedEValueType evalue_type) {
529518 switch (evalue.tag ) {
530519 case Tag::Tensor: {
531520 executorch::aten::Tensor tensor = evalue.toTensor ();
532- long offset = copy_tensor_to_debug_buffer (tensor);
521+ long offset = data_sink_-> write_tensor (tensor);
533522 etdump_Tensor_ref_t tensor_ref =
534523 add_tensor_entry (builder_, tensor, offset);
535524
@@ -551,7 +540,7 @@ void ETDumpGen::log_evalue(const EValue& evalue, LoggedEValueType evalue_type) {
551540 evalue.toTensorList ();
552541 etdump_Tensor_vec_start (builder_);
553542 for (size_t i = 0 ; i < tensors.size (); ++i) {
554- long offset = copy_tensor_to_debug_buffer (tensors[i]);
543+ long offset = data_sink_-> write_tensor (tensors[i]);
555544 etdump_Tensor_vec_push (
556545 builder_, add_tensor_entry (builder_, tensors[i], offset));
557546 }
@@ -636,7 +625,13 @@ bool ETDumpGen::is_static_etdump() {
636625}
637626
638627size_t ETDumpGen::get_debug_buffer_size () const {
639- return debug_buffer_.size ();
628+ ET_CHECK_MSG (data_sink_, " Must set data sink before checking its size\n " );
629+ return data_sink_->get_storage_size ();
630+ }
631+
632+ size_t ETDumpGen::get_data_sink_size () const {
633+ ET_CHECK_MSG (data_sink_, " Must set data sink before checking its size\n " );
634+ return data_sink_->get_storage_size ();
640635}
641636
642637} // namespace etdump
0 commit comments