1010
1111#include < cstring>
1212
13+ #include < executorch/devtools/etdump/buffer_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>
@@ -28,6 +29,7 @@ using ::executorch::runtime::DebugHandle;
2829using ::executorch::runtime::DelegateDebugIdType;
2930using ::executorch::runtime::EValue;
3031using ::executorch::runtime::EventTracerEntry;
32+ using ::executorch::runtime::Result;
3133using ::executorch::runtime::LoggedEValueType;
3234using ::executorch::runtime::Span;
3335using ::executorch::runtime::Tag;
@@ -347,10 +349,10 @@ void ETDumpGen::log_intermediate_output_delegate_helper(
347349 ET_CHECK_MSG (
348350 (name == nullptr ) ^ (delegate_debug_index == -1 ),
349351 " 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- }
352+
353+ ET_CHECK_MSG (
354+ data_sink_,
355+ " Must pre-set data sink before logging evalue with set_data_sink() or set_debug_buffer() \n " );
354356
355357 check_ready_to_add_events ();
356358 int64_t string_id = name != nullptr ? create_string_entry (name) : -1 ;
@@ -367,7 +369,7 @@ void ETDumpGen::log_intermediate_output_delegate_helper(
367369
368370 // Check the type of `output` then call the corresponding logging functions
369371 if constexpr (std::is_same<T, Tensor>::value) {
370- long offset = copy_tensor_to_debug_buffer (output);
372+ long offset = write_tensor_or_raise_error (output);
371373 etdump_Tensor_ref_t tensor_ref = add_tensor_entry (builder_, output, offset);
372374
373375 etdump_Value_start (builder_);
@@ -377,7 +379,8 @@ void ETDumpGen::log_intermediate_output_delegate_helper(
377379 } else if constexpr (std::is_same<T, ArrayRef<Tensor>>::value) {
378380 etdump_Tensor_vec_start (builder_);
379381 for (size_t i = 0 ; i < output.size (); ++i) {
380- long offset = copy_tensor_to_debug_buffer (output[i]);
382+
383+ long offset = write_tensor_or_raise_error (output[i]);
381384 etdump_Tensor_vec_push (
382385 builder_, add_tensor_entry (builder_, output[i], offset));
383386 }
@@ -497,27 +500,15 @@ ETDumpResult ETDumpGen::get_etdump_data() {
497500}
498501
499502void ETDumpGen::set_debug_buffer (Span<uint8_t > buffer) {
500- debug_buffer_ = buffer;
503+ data_sink_ = std::make_shared<BufferDataSink>( buffer) ;
501504}
502505
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 ());
506+ void ETDumpGen::set_data_sink (std::shared_ptr<DataSinkBase> buffer_data_sink) {
507+ data_sink_ = buffer_data_sink;
515508}
516509
517510void ETDumpGen::log_evalue (const EValue& evalue, LoggedEValueType evalue_type) {
518- if (debug_buffer_.empty ()) {
519- return ;
520- }
511+ ET_CHECK_MSG (data_sink_, " Must set data sink before logging evalue\n " );
521512
522513 check_ready_to_add_events ();
523514
@@ -529,7 +520,7 @@ void ETDumpGen::log_evalue(const EValue& evalue, LoggedEValueType evalue_type) {
529520 switch (evalue.tag ) {
530521 case Tag::Tensor: {
531522 executorch::aten::Tensor tensor = evalue.toTensor ();
532- long offset = copy_tensor_to_debug_buffer (tensor);
523+ long offset = write_tensor_or_raise_error (tensor);
533524 etdump_Tensor_ref_t tensor_ref =
534525 add_tensor_entry (builder_, tensor, offset);
535526
@@ -551,7 +542,7 @@ void ETDumpGen::log_evalue(const EValue& evalue, LoggedEValueType evalue_type) {
551542 evalue.toTensorList ();
552543 etdump_Tensor_vec_start (builder_);
553544 for (size_t i = 0 ; i < tensors.size (); ++i) {
554- long offset = copy_tensor_to_debug_buffer (tensors[i]);
545+ long offset = write_tensor_or_raise_error (tensors[i]);
555546 etdump_Tensor_vec_push (
556547 builder_, add_tensor_entry (builder_, tensors[i], offset));
557548 }
@@ -636,7 +627,21 @@ bool ETDumpGen::is_static_etdump() {
636627}
637628
638629size_t ETDumpGen::get_debug_buffer_size () const {
639- return debug_buffer_.size ();
630+ return ETDumpGen::get_data_sink_size ();
631+ }
632+
633+ size_t ETDumpGen::get_data_sink_size () const {
634+ ET_CHECK_MSG (data_sink_, " Must set data sink before checking its size\n " );
635+ Result<size_t > ret = data_sink_->get_storage_size ();
636+ ET_CHECK_MSG (ret.ok (), " Failed to get storage size with error 0x%" PRIx32, static_cast <uint32_t >(ret.error ()));
637+ return ret.get ();
638+ }
639+
640+ long ETDumpGen::write_tensor_or_raise_error (Tensor tensor) {
641+ ET_CHECK_MSG (data_sink_, " Must set data sink before writing data\n " );
642+ Result<size_t > ret = data_sink_->write (tensor.const_data_ptr (), tensor.nbytes ());
643+ ET_CHECK_MSG (ret.ok (), " Failed to write tensor with error 0x%" PRIx32, static_cast <uint32_t >(ret.error ()));
644+ return static_cast <long >(ret.get ());
640645}
641646
642647} // namespace etdump
0 commit comments