https://github.com/Endilll updated https://github.com/llvm/llvm-project/pull/74935
>From 4e8f48947d59474e07e08cdc98e4a6fb2e3c80c1 Mon Sep 17 00:00:00 2001 From: Vlad Serebrennikov <serebrennikov.vladis...@gmail.com> Date: Sat, 9 Dec 2023 17:21:35 +0300 Subject: [PATCH 1/2] [llvm][Support] Enable `TimeTraceProfiler` to accept deferred detail string This patch enables `TimeTraceProfiler` and `TimeTraceScope` to accept detail string, which is not yet available at the time new trace entry is created. This is important for Clang parser use cases, e.g. when parsing a class member we don't yet know name of. --- llvm/include/llvm/Support/TimeProfiler.h | 35 ++++++++++++++++++++---- llvm/lib/Support/TimeProfiler.cpp | 34 +++++++++++++++-------- 2 files changed, 52 insertions(+), 17 deletions(-) diff --git a/llvm/include/llvm/Support/TimeProfiler.h b/llvm/include/llvm/Support/TimeProfiler.h index 454a65f70231f..5b8af16ed4a9a 100644 --- a/llvm/include/llvm/Support/TimeProfiler.h +++ b/llvm/include/llvm/Support/TimeProfiler.h @@ -86,6 +86,8 @@ class raw_pwrite_stream; struct TimeTraceProfiler; TimeTraceProfiler *getTimeTraceProfilerInstance(); +struct TimeTraceProfilerEntry; + /// Initialize the time trace profiler. /// This sets up the global \p TimeTraceProfilerInstance /// variable to be the profiler instance. @@ -120,18 +122,29 @@ Error timeTraceProfilerWrite(StringRef PreferredFileName, /// Profiler copies the string data, so the pointers can be given into /// temporaries. Time sections can be hierarchical; every Begin must have a /// matching End pair but they can nest. -void timeTraceProfilerBegin(StringRef Name, StringRef Detail); -void timeTraceProfilerBegin(StringRef Name, +TimeTraceProfilerEntry* timeTraceProfilerBegin(StringRef Name, StringRef Detail); +TimeTraceProfilerEntry* timeTraceProfilerBegin(StringRef Name, llvm::function_ref<std::string()> Detail); /// Manually end the last time section. void timeTraceProfilerEnd(); +/// Set detail string for an existing trace entry. +/// This function sets \p Detail string for an entry previously created by +/// `timeTraceProfilerBegin`. String is handled in the same way as +/// `timeTraceProfilerBegin` does. This is useful when contents of +/// \p Detail is not (fully) known at the time trace entry is created. +void timeTraceProfilerEntrySetDetail(TimeTraceProfilerEntry* Entry, StringRef Detail); +void timeTraceProfilerEntrySetDetail(TimeTraceProfilerEntry* Entry, llvm::function_ref<std::string()> Detail); + /// The TimeTraceScope is a helper class to call the begin and end functions /// of the time trace profiler. When the object is constructed, it begins /// the section; and when it is destroyed, it stops it. If the time profiler /// is not initialized, the overhead is a single branch. -struct TimeTraceScope { +class TimeTraceScope { + TimeTraceProfilerEntry* Entry; + +public: TimeTraceScope() = delete; TimeTraceScope(const TimeTraceScope &) = delete; @@ -141,20 +154,30 @@ struct TimeTraceScope { TimeTraceScope(StringRef Name) { if (getTimeTraceProfilerInstance() != nullptr) - timeTraceProfilerBegin(Name, StringRef("")); + Entry = timeTraceProfilerBegin(Name, StringRef("")); } TimeTraceScope(StringRef Name, StringRef Detail) { if (getTimeTraceProfilerInstance() != nullptr) - timeTraceProfilerBegin(Name, Detail); + Entry = timeTraceProfilerBegin(Name, Detail); } TimeTraceScope(StringRef Name, llvm::function_ref<std::string()> Detail) { if (getTimeTraceProfilerInstance() != nullptr) - timeTraceProfilerBegin(Name, Detail); + Entry = timeTraceProfilerBegin(Name, Detail); } ~TimeTraceScope() { if (getTimeTraceProfilerInstance() != nullptr) timeTraceProfilerEnd(); } + void setDetail(StringRef Detail) { + if (Entry != nullptr) { + timeTraceProfilerEntrySetDetail(Entry, Detail); + } + } + void setDetail(llvm::function_ref<std::string()> Detail) { + if (Entry != nullptr) { + timeTraceProfilerEntrySetDetail(Entry, Detail); + } + } }; } // end namespace llvm diff --git a/llvm/lib/Support/TimeProfiler.cpp b/llvm/lib/Support/TimeProfiler.cpp index 4d625b3eb5b17..bd8a04ed8962d 100644 --- a/llvm/lib/Support/TimeProfiler.cpp +++ b/llvm/lib/Support/TimeProfiler.cpp @@ -64,12 +64,14 @@ using CountAndDurationType = std::pair<size_t, DurationType>; using NameAndCountAndDurationType = std::pair<std::string, CountAndDurationType>; +} // anonymous namespace + /// Represents an open or completed time section entry to be captured. -struct TimeTraceProfilerEntry { +struct llvm::TimeTraceProfilerEntry { const TimePointType Start; TimePointType End; const std::string Name; - const std::string Detail; + std::string Detail; TimeTraceProfilerEntry(TimePointType &&S, TimePointType &&E, std::string &&N, std::string &&Dt) @@ -92,8 +94,6 @@ struct TimeTraceProfilerEntry { } }; -} // anonymous namespace - struct llvm::TimeTraceProfiler { TimeTraceProfiler(unsigned TimeTraceGranularity = 0, StringRef ProcName = "") : BeginningOfTime(system_clock::now()), StartTime(ClockType::now()), @@ -102,8 +102,8 @@ struct llvm::TimeTraceProfiler { llvm::get_thread_name(ThreadName); } - void begin(std::string Name, llvm::function_ref<std::string()> Detail) { - Stack.emplace_back(ClockType::now(), TimePointType(), std::move(Name), + llvm::TimeTraceProfilerEntry* begin(std::string Name, llvm::function_ref<std::string()> Detail) { + return &Stack.emplace_back(ClockType::now(), TimePointType(), std::move(Name), Detail()); } @@ -341,19 +341,31 @@ Error llvm::timeTraceProfilerWrite(StringRef PreferredFileName, return Error::success(); } -void llvm::timeTraceProfilerBegin(StringRef Name, StringRef Detail) { +llvm::TimeTraceProfilerEntry* llvm::timeTraceProfilerBegin(StringRef Name, StringRef Detail) { if (TimeTraceProfilerInstance != nullptr) - TimeTraceProfilerInstance->begin(std::string(Name), - [&]() { return std::string(Detail); }); + return TimeTraceProfilerInstance->begin(std::string(Name), + [&]() { return std::string(Detail); }); } -void llvm::timeTraceProfilerBegin(StringRef Name, +llvm::TimeTraceProfilerEntry* llvm::timeTraceProfilerBegin(StringRef Name, llvm::function_ref<std::string()> Detail) { if (TimeTraceProfilerInstance != nullptr) - TimeTraceProfilerInstance->begin(std::string(Name), Detail); + return TimeTraceProfilerInstance->begin(std::string(Name), Detail); } void llvm::timeTraceProfilerEnd() { if (TimeTraceProfilerInstance != nullptr) TimeTraceProfilerInstance->end(); } + +void llvm::timeTraceProfilerEntrySetDetail(llvm::TimeTraceProfilerEntry* Entry, StringRef Detail) { + if (Entry != nullptr) { + Entry->Detail = Detail; + } +} + +void llvm::timeTraceProfilerEntrySetDetail(llvm::TimeTraceProfilerEntry* Entry, llvm::function_ref<std::string()> Detail) { + if (Entry != nullptr) { + Entry->Detail = Detail(); + } +} >From 740fbff0fe9283eec6e09099f1d05f2a67ec8382 Mon Sep 17 00:00:00 2001 From: Vlad Serebrennikov <serebrennikov.vladis...@gmail.com> Date: Sat, 9 Dec 2023 17:46:21 +0300 Subject: [PATCH 2/2] Run clang-format --- llvm/include/llvm/Support/TimeProfiler.h | 17 +++++++++------- llvm/lib/Support/TimeProfiler.cpp | 26 +++++++++++++++--------- 2 files changed, 26 insertions(+), 17 deletions(-) diff --git a/llvm/include/llvm/Support/TimeProfiler.h b/llvm/include/llvm/Support/TimeProfiler.h index 5b8af16ed4a9a..f96b3a0fb831f 100644 --- a/llvm/include/llvm/Support/TimeProfiler.h +++ b/llvm/include/llvm/Support/TimeProfiler.h @@ -122,9 +122,11 @@ Error timeTraceProfilerWrite(StringRef PreferredFileName, /// Profiler copies the string data, so the pointers can be given into /// temporaries. Time sections can be hierarchical; every Begin must have a /// matching End pair but they can nest. -TimeTraceProfilerEntry* timeTraceProfilerBegin(StringRef Name, StringRef Detail); -TimeTraceProfilerEntry* timeTraceProfilerBegin(StringRef Name, - llvm::function_ref<std::string()> Detail); +TimeTraceProfilerEntry *timeTraceProfilerBegin(StringRef Name, + StringRef Detail); +TimeTraceProfilerEntry * +timeTraceProfilerBegin(StringRef Name, + llvm::function_ref<std::string()> Detail); /// Manually end the last time section. void timeTraceProfilerEnd(); @@ -134,18 +136,19 @@ void timeTraceProfilerEnd(); /// `timeTraceProfilerBegin`. String is handled in the same way as /// `timeTraceProfilerBegin` does. This is useful when contents of /// \p Detail is not (fully) known at the time trace entry is created. -void timeTraceProfilerEntrySetDetail(TimeTraceProfilerEntry* Entry, StringRef Detail); -void timeTraceProfilerEntrySetDetail(TimeTraceProfilerEntry* Entry, llvm::function_ref<std::string()> Detail); +void timeTraceProfilerEntrySetDetail(TimeTraceProfilerEntry *Entry, + StringRef Detail); +void timeTraceProfilerEntrySetDetail(TimeTraceProfilerEntry *Entry, + llvm::function_ref<std::string()> Detail); /// The TimeTraceScope is a helper class to call the begin and end functions /// of the time trace profiler. When the object is constructed, it begins /// the section; and when it is destroyed, it stops it. If the time profiler /// is not initialized, the overhead is a single branch. class TimeTraceScope { - TimeTraceProfilerEntry* Entry; + TimeTraceProfilerEntry *Entry; public: - TimeTraceScope() = delete; TimeTraceScope(const TimeTraceScope &) = delete; TimeTraceScope &operator=(const TimeTraceScope &) = delete; diff --git a/llvm/lib/Support/TimeProfiler.cpp b/llvm/lib/Support/TimeProfiler.cpp index bd8a04ed8962d..ebf0f40efaae7 100644 --- a/llvm/lib/Support/TimeProfiler.cpp +++ b/llvm/lib/Support/TimeProfiler.cpp @@ -102,9 +102,10 @@ struct llvm::TimeTraceProfiler { llvm::get_thread_name(ThreadName); } - llvm::TimeTraceProfilerEntry* begin(std::string Name, llvm::function_ref<std::string()> Detail) { - return &Stack.emplace_back(ClockType::now(), TimePointType(), std::move(Name), - Detail()); + llvm::TimeTraceProfilerEntry * + begin(std::string Name, llvm::function_ref<std::string()> Detail) { + return &Stack.emplace_back(ClockType::now(), TimePointType(), + std::move(Name), Detail()); } void end() { @@ -341,14 +342,16 @@ Error llvm::timeTraceProfilerWrite(StringRef PreferredFileName, return Error::success(); } -llvm::TimeTraceProfilerEntry* llvm::timeTraceProfilerBegin(StringRef Name, StringRef Detail) { +llvm::TimeTraceProfilerEntry *llvm::timeTraceProfilerBegin(StringRef Name, + StringRef Detail) { if (TimeTraceProfilerInstance != nullptr) - return TimeTraceProfilerInstance->begin(std::string(Name), - [&]() { return std::string(Detail); }); + return TimeTraceProfilerInstance->begin( + std::string(Name), [&]() { return std::string(Detail); }); } -llvm::TimeTraceProfilerEntry* llvm::timeTraceProfilerBegin(StringRef Name, - llvm::function_ref<std::string()> Detail) { +llvm::TimeTraceProfilerEntry * +llvm::timeTraceProfilerBegin(StringRef Name, + llvm::function_ref<std::string()> Detail) { if (TimeTraceProfilerInstance != nullptr) return TimeTraceProfilerInstance->begin(std::string(Name), Detail); } @@ -358,13 +361,16 @@ void llvm::timeTraceProfilerEnd() { TimeTraceProfilerInstance->end(); } -void llvm::timeTraceProfilerEntrySetDetail(llvm::TimeTraceProfilerEntry* Entry, StringRef Detail) { +void llvm::timeTraceProfilerEntrySetDetail(llvm::TimeTraceProfilerEntry *Entry, + StringRef Detail) { if (Entry != nullptr) { Entry->Detail = Detail; } } -void llvm::timeTraceProfilerEntrySetDetail(llvm::TimeTraceProfilerEntry* Entry, llvm::function_ref<std::string()> Detail) { +void llvm::timeTraceProfilerEntrySetDetail( + llvm::TimeTraceProfilerEntry *Entry, + llvm::function_ref<std::string()> Detail) { if (Entry != nullptr) { Entry->Detail = Detail(); } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits