#pragma once #include #include #include #include #include #include namespace c10 { struct IValue; } namespace torch::jit { class Pickler; class InlinedCallStackSerializer { public: // Serialize InlinedCallStack as // SerializedInlinedCallStack = // [module_info, source range tag, SerializedInlinedCallStack] // module_info = [ClassType.qualifiedName, instance_name] // source_range_tag = unique source range id c10::IValue serialize( const InlinedCallStackPtr& cs_ptr, const SourceRangeTagMap& source_range_tags); private: // module_info = [ClassType.qualifiedName, instance_name] c10::IValue serialize_module_instance_info( const std::optional& m); // This caches serialized inlined callstack ptr, since many // InlinedCallStackPtr can refer to the same one. ska::flat_hash_map serialized_inlined_callstack_; // This caches serialized module instance info. // There might be many nodes that are part of the same // parent, grandparent etc. module. ska::flat_hash_map serialized_module_instance_info_; }; class TORCH_API CallStackDebugInfoPickler { public: CallStackDebugInfoPickler() = default; std::vector pickle( const std::unordered_map& callstack_ptrs, const SourceRangeTagMap& source_range_tags); private: InlinedCallStackSerializer css_; }; class InlinedCallStackDeserializer { public: InlinedCallStackPtr deserialize( const c10::IValue& iv, const ska::flat_hash_map& source_range_map, const std::shared_ptr& cu); private: std::optional deserialize_module_instance_info( const c10::IValue& iv, const std::shared_ptr& cu); ska:: flat_hash_map, InlinedCallStackPtr> cached_inlined_callstacks_; ska::flat_hash_map, ModuleInstanceInfo> cached_module_instance_info_; }; class TORCH_API CallStackDebugInfoUnpickler { public: ska::flat_hash_map unpickle( const at::DataPtr& data, size_t size, const ska::flat_hash_map& source_range_map, const std::shared_ptr& cu); private: InlinedCallStackDeserializer csds_; }; } // namespace torch::jit