1414#include < executorch/runtime/core/exec_aten/util/tensor_util.h>
1515#include < numeric>
1616
17+ #ifdef EXECUTORCH_ENABLE_EVENT_TRACER
18+ #include < executorch/devtools/etdump/etdump_flatcc.h>
19+ #endif
20+
1721#define THROW_JS_ERROR (errorType, message, ...) \
1822 ({ \
1923 char msg_buf[256 ]; \
@@ -51,10 +55,15 @@ using executorch::aten::Tensor;
5155using ::executorch::extension::BufferDataLoader;
5256using ::executorch::runtime::Error;
5357using ::executorch::runtime::EValue;
58+ using ::executorch::runtime::EventTracer;
5459using ::executorch::runtime::Result;
5560using ::executorch::runtime::Tag;
5661using ::executorch::runtime::TensorInfo;
5762
63+ #ifdef EXECUTORCH_ENABLE_EVENT_TRACER
64+ using executorch::etdump::ETDumpGen;
65+ #endif
66+
5867namespace executorch {
5968namespace extension {
6069namespace wasm {
@@ -495,6 +504,35 @@ struct ET_EXPERIMENTAL JsMethodMeta {
495504 }
496505};
497506
507+ /* *
508+ * EXPERIMENTAL: Wrapper around ETDumpResult for JavaScript.
509+ */
510+ #ifdef EXECUTORCH_ENABLE_EVENT_TRACER
511+ class ET_EXPERIMENTAL JsETDumpResult final {
512+ public:
513+ JsETDumpResult () = delete ;
514+ JsETDumpResult (const JsETDumpResult&) = delete ;
515+ JsETDumpResult& operator =(const JsETDumpResult&) = delete ;
516+ JsETDumpResult (JsETDumpResult&&) = default ;
517+ JsETDumpResult& operator =(JsETDumpResult&&) = default ;
518+
519+ explicit JsETDumpResult (uint8_t * buffer, size_t size)
520+ : buffer_(buffer), size_(size) {}
521+
522+ ~JsETDumpResult () {
523+ free (buffer_);
524+ }
525+
526+ val get_buffer () const {
527+ return val (typed_memory_view (size_, buffer_));
528+ }
529+
530+ private:
531+ uint8_t * buffer_;
532+ size_t size_;
533+ };
534+ #endif
535+
498536/* *
499537 * EXPERIMENTAL: Wrapper around extension/Module for JavaScript.
500538 */
@@ -518,17 +556,32 @@ class ET_EXPERIMENTAL JsModule final {
518556 val memory_view = val (typed_memory_view (length, buffer.data ()));
519557 memory_view.call <void >(" set" , data);
520558 auto loader = std::make_unique<BufferDataLoader>(buffer.data (), length);
559+
560+ #ifdef EXECUTORCH_ENABLE_EVENT_TRACER
561+ std::unique_ptr<EventTracer> etdump_gen = std::make_unique<ETDumpGen>();
562+ #else
563+ std::unique_ptr<EventTracer> etdump_gen = nullptr ;
564+ #endif
521565 return std::make_unique<JsModule>(
522- std::move (buffer), std::make_unique<Module>(std::move (loader)));
566+ std::move (buffer),
567+ std::make_unique<Module>(
568+ std::move (loader), nullptr , nullptr , std::move (etdump_gen)));
523569 }
524570
525571 static std::unique_ptr<JsModule> load (val data) {
526572 if (data.isNull () || data.isUndefined ()) {
527573 THROW_JS_ERROR (TypeError, " Data cannot be null or undefined" );
528574 }
529575 if (data.isString ()) {
530- return std::make_unique<JsModule>(
531- std::make_unique<Module>(data.as <std::string>()));
576+ #ifdef EXECUTORCH_ENABLE_EVENT_TRACER
577+ std::unique_ptr<EventTracer> etdump_gen = std::make_unique<ETDumpGen>();
578+ #else
579+ std::unique_ptr<EventTracer> etdump_gen = nullptr ;
580+ #endif
581+ return std::make_unique<JsModule>(std::make_unique<Module>(
582+ data.as <std::string>(),
583+ Module::LoadMode::File,
584+ std::move (etdump_gen)));
532585 } else if (data.instanceof (val::global (" Uint8Array" ))) {
533586 return load_from_uint8_array (data);
534587 } else if (data.instanceof (val::global (" ArrayBuffer" ))) {
@@ -569,6 +622,18 @@ class ET_EXPERIMENTAL JsModule final {
569622 return JsMethodMeta::from_method_meta (res.get ());
570623 }
571624
625+ #ifdef EXECUTORCH_ENABLE_EVENT_TRACER
626+ std::unique_ptr<JsETDumpResult> etdump () {
627+ ETDumpGen* etdump_gen = dynamic_cast <ETDumpGen*>(module_->event_tracer ());
628+ if (etdump_gen == nullptr ) {
629+ return nullptr ;
630+ }
631+ auto etdump_data = etdump_gen->get_etdump_data ();
632+ return std::make_unique<JsETDumpResult>(
633+ static_cast <uint8_t *>(etdump_data.buf ), etdump_data.size );
634+ }
635+ #endif
636+
572637 val_array<val> execute (const std::string& method, val js_inputs) {
573638 std::vector<EValue> inputs;
574639 if (js_inputs.isArray ()) {
@@ -613,11 +678,19 @@ EMSCRIPTEN_BINDINGS(WasmBindings) {
613678#define JS_DECLARE_TAG (NAME ) .value(#NAME, Tag::NAME)
614679 EXECUTORCH_FORALL_TAGS (JS_DECLARE_TAG);
615680
681+ #ifdef EXECUTORCH_ENABLE_EVENT_TRACER
682+ class_<JsETDumpResult>(" ETDumpResult" )
683+ .property (" buffer" , &JsETDumpResult::get_buffer);
684+ #endif
685+
616686 class_<JsModule>(" Module" )
617687 .class_function (" load" , &JsModule::load)
618688 .function (" getMethods" , &JsModule::get_methods)
619689 .function (" loadMethod" , &JsModule::load_method)
620690 .function (" getMethodMeta" , &JsModule::get_method_meta)
691+ #ifdef EXECUTORCH_ENABLE_EVENT_TRACER
692+ .function (" etdump" , &JsModule::etdump)
693+ #endif
621694 .function (" execute" , &JsModule::execute)
622695 .function (" forward" , &JsModule::forward);
623696 class_<JsTensor>(" Tensor" )
0 commit comments