https://github.com/alanzhao1 updated 
https://github.com/llvm/llvm-project/pull/154231

>From 9f07859077fb6df79388d1cc346f3e57f2832f7c Mon Sep 17 00:00:00 2001
From: Alan Zhao <ayz...@google.com>
Date: Mon, 18 Aug 2025 16:46:48 -0700
Subject: [PATCH 1/3] [clang][timers][modules] Fix a timer being started when
 it's running

`ASTReader::FinishedDeserializing()` calls
`adjustDeductedFunctionResultType(...)` [0], which in turn calls
`FunctionDecl::getMostRecentDecl()`[1]. In modules builds,
`getMostRecentDecl()` may reach out to the `ASTReader` and start
deserializing again. Starting deserialization starts `ReadTimer`;
however, `FinishedDeserializing()` doesn't call `stopTimer()` until
after it's call to `adjustDeductedFunctionResultType(...)` [2]. As a
result, we hit an assert checking that we don't start an already started
timer [3]. To fix this, we simply don't start the timer if it's already
running.

Unfortunately I don't have a test case for this yet as modules builds
are notoriously difficult to reduce.

[0]: 
https://github.com/llvm/llvm-project/blob/4d2288d31866013bd361800df4746fbc2fcf742a/clang/lib/Serialization/ASTReader.cpp#L11053
[1]: 
https://github.com/llvm/llvm-project/blob/4d2288d31866013bd361800df4746fbc2fcf742a/clang/lib/AST/ASTContext.cpp#L3804
[2]: 
https://github.com/llvm/llvm-project/blob/4d2288d31866013bd361800df4746fbc2fcf742a/clang/lib/Serialization/ASTReader.cpp#L11065-L11066
[3]: 
https://github.com/llvm/llvm-project/blob/4d2288d31866013bd361800df4746fbc2fcf742a/llvm/lib/Support/Timer.cpp#L150
---
 clang/lib/Serialization/ASTReader.cpp | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/clang/lib/Serialization/ASTReader.cpp 
b/clang/lib/Serialization/ASTReader.cpp
index e8dddda584a9b..bff289f1c1b76 100644
--- a/clang/lib/Serialization/ASTReader.cpp
+++ b/clang/lib/Serialization/ASTReader.cpp
@@ -11003,7 +11003,8 @@ void ASTReader::diagnoseOdrViolations() {
 }
 
 void ASTReader::StartedDeserializing() {
-  if (++NumCurrentElementsDeserializing == 1 && ReadTimer.get())
+  if (Timer *T = ReadTimer.get();
+      ++NumCurrentElementsDeserializing == 1 && T && !T->isRunning())
     ReadTimer->startTimer();
 }
 

>From 686c6c3d28e945fc56a0fbd565b5b9a21f99dcd5 Mon Sep 17 00:00:00 2001
From: Alan Zhao <ayz...@google.com>
Date: Mon, 18 Aug 2025 17:22:44 -0700
Subject: [PATCH 2/3] fix namespace identifier issue

---
 clang/lib/Serialization/ASTReader.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/clang/lib/Serialization/ASTReader.cpp 
b/clang/lib/Serialization/ASTReader.cpp
index bff289f1c1b76..a61238fb7698d 100644
--- a/clang/lib/Serialization/ASTReader.cpp
+++ b/clang/lib/Serialization/ASTReader.cpp
@@ -11003,7 +11003,7 @@ void ASTReader::diagnoseOdrViolations() {
 }
 
 void ASTReader::StartedDeserializing() {
-  if (Timer *T = ReadTimer.get();
+  if (llvm::Timer *T = ReadTimer.get();
       ++NumCurrentElementsDeserializing == 1 && T && !T->isRunning())
     ReadTimer->startTimer();
 }

>From b45ce002b10987c0a6c8d8bda15f572c58c75e9d Mon Sep 17 00:00:00 2001
From: Alan Zhao <ayz...@google.com>
Date: Mon, 18 Aug 2025 21:47:07 -0700
Subject: [PATCH 3/3] use T instead of ReadTimer

---
 clang/lib/Serialization/ASTReader.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/clang/lib/Serialization/ASTReader.cpp 
b/clang/lib/Serialization/ASTReader.cpp
index a61238fb7698d..51222956ae0e1 100644
--- a/clang/lib/Serialization/ASTReader.cpp
+++ b/clang/lib/Serialization/ASTReader.cpp
@@ -11005,7 +11005,7 @@ void ASTReader::diagnoseOdrViolations() {
 void ASTReader::StartedDeserializing() {
   if (llvm::Timer *T = ReadTimer.get();
       ++NumCurrentElementsDeserializing == 1 && T && !T->isRunning())
-    ReadTimer->startTimer();
+    T->startTimer();
 }
 
 void ASTReader::FinishedDeserializing() {

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to