diff --git a/projects/rocprofiler-systems/external/timemory b/projects/rocprofiler-systems/external/timemory index 69a6c7ad9d..05438aaf0f 160000 --- a/projects/rocprofiler-systems/external/timemory +++ b/projects/rocprofiler-systems/external/timemory @@ -1 +1 @@ -Subproject commit 69a6c7ad9df7c7fc6a1d275a506d6c0a71692c66 +Subproject commit 05438aaf0fd21aa75a237239f641d849e1d21bc0 diff --git a/projects/rocprofiler-systems/source/lib/omnitrace/library/components/category_region.hpp b/projects/rocprofiler-systems/source/lib/omnitrace/library/components/category_region.hpp index b7c6699c09..140f3cc0c3 100644 --- a/projects/rocprofiler-systems/source/lib/omnitrace/library/components/category_region.hpp +++ b/projects/rocprofiler-systems/source/lib/omnitrace/library/components/category_region.hpp @@ -248,10 +248,10 @@ void category_region::audit(const gotcha_data_t& _data, audit::incoming, Args&&... _args) { - start( - _data.tool_id.c_str(), "args", - JOIN(", ", - JOIN('=', tim::try_demangle>(), _args)...)); + start(_data.tool_id.c_str(), [&](perfetto::EventContext ctx) { + OMNITRACE_FOLD_EXPRESSION(tracing::add_perfetto_annotation( + ctx, tim::try_demangle>(), _args)); + }); } template @@ -269,10 +269,10 @@ void category_region::audit(std::string_view _name, audit::incoming, Args&&... _args) { - start( - _name.data(), "args", - JOIN(", ", - JOIN('=', tim::try_demangle>(), _args)...)); + start(_name.data(), [&](perfetto::EventContext ctx) { + OMNITRACE_FOLD_EXPRESSION(tracing::add_perfetto_annotation( + ctx, tim::try_demangle>(), _args)); + }); } template diff --git a/projects/rocprofiler-systems/source/lib/omnitrace/library/concepts.hpp b/projects/rocprofiler-systems/source/lib/omnitrace/library/concepts.hpp index 1440ec90f0..5b0dbf48bd 100644 --- a/projects/rocprofiler-systems/source/lib/omnitrace/library/concepts.hpp +++ b/projects/rocprofiler-systems/source/lib/omnitrace/library/concepts.hpp @@ -64,5 +64,22 @@ struct is_optional : std::false_type template struct is_optional> : std::true_type {}; + +template +struct can_stringify +{ +private: + static constexpr auto sfinae(int) + -> decltype(std::declval() << std::declval(), bool()) + { + return true; + } + + static constexpr auto sfinae(long) { return false; } + +public: + static constexpr bool value = sfinae(0); + constexpr auto operator()() const { return sfinae(0); } +}; } // namespace concepts } // namespace tim diff --git a/projects/rocprofiler-systems/source/lib/omnitrace/library/tracing.hpp b/projects/rocprofiler-systems/source/lib/omnitrace/library/tracing.hpp index 9f5f4c1a67..c9773d1e42 100644 --- a/projects/rocprofiler-systems/source/lib/omnitrace/library/tracing.hpp +++ b/projects/rocprofiler-systems/source/lib/omnitrace/library/tracing.hpp @@ -23,6 +23,7 @@ #pragma once #include "library/common.hpp" +#include "library/concepts.hpp" #include "library/config.hpp" #include "library/debug.hpp" #include "library/defines.hpp" @@ -34,6 +35,8 @@ #include +#include + namespace omnitrace { namespace tracing @@ -194,13 +197,74 @@ pop_timemory(CategoryT, const char* name, Args&&... args) } } +template +auto +add_perfetto_annotation(perfetto::EventContext& ctx, Np&& _name, Tp&& _val) +{ + using named_type = std::remove_reference_t>>; + using value_type = std::remove_reference_t>>; + + static_assert(concepts::is_string_type::value, + "Error! name is not a string type"); + + auto _get_dbg = [&]() { + auto* _dbg = ctx.event()->add_debug_annotations(); + _dbg->set_name(std::string_view{ std::forward(_name) }.data()); + return _dbg; + }; + + if constexpr(std::is_same::value) + { + _get_dbg()->set_string_value(_val.data()); + } + else if constexpr(concepts::is_string_type::value) + { + _get_dbg()->set_string_value(std::forward(_val)); + } + else if constexpr(std::is_same::value) + { + _get_dbg()->set_bool_value(std::forward(_val)); + } + else if constexpr(std::is_enum::value) + { + _get_dbg()->set_int_value(static_cast(std::forward(_val))); + } + else if constexpr(std::is_floating_point::value) + { + _get_dbg()->set_double_value(std::forward(_val)); + } + else if constexpr(std::is_integral::value) + { + if constexpr(std::is_unsigned::value) + { + _get_dbg()->set_uint_value(std::forward(_val)); + } + else + { + _get_dbg()->set_int_value(std::forward(_val)); + } + } + else if constexpr(std::is_pointer::value) + { + _get_dbg()->set_pointer_value(reinterpret_cast(std::forward(_val))); + } + else if constexpr(concepts::can_stringify::value) + { + _get_dbg()->set_string_value(JOIN("", std::forward(_val))); + } + else + { + static_assert(std::is_empty::value, "Error! unsupported data type"); + } +} + template inline void push_perfetto(CategoryT, const char* name, Args&&... args) { uint64_t _ts = comp::wall_clock::record(); TRACE_EVENT_BEGIN(trait::name::value, perfetto::StaticString(name), _ts, - std::forward(args)..., "begin_ns", _ts); + "begin_ns", _ts, std::forward(args)...); } template @@ -208,8 +272,8 @@ inline void pop_perfetto(CategoryT, const char*, Args&&... args) { uint64_t _ts = comp::wall_clock::record(); - TRACE_EVENT_END(trait::name::value, _ts, std::forward(args)..., - "end_ns", _ts); + TRACE_EVENT_END(trait::name::value, _ts, "end_ns", _ts, + std::forward(args)...); } template