diff --git a/clang/include/clang/Serialization/ASTReader.h b/clang/include/clang/Serialization/ASTReader.h index 7ce626cedae74..3ede0925676e8 100644 --- a/clang/include/clang/Serialization/ASTReader.h +++ b/clang/include/clang/Serialization/ASTReader.h @@ -526,6 +526,9 @@ class ASTReader /// A timer used to track the time spent deserializing. std::unique_ptr ReadTimer; + // A TimeRegion used to start and stop ReadTimer via RAII. + std::optional ReadTimeRegion; + /// The location where the module file will be considered as /// imported from. For non-module AST types it should be invalid. SourceLocation CurrentImportLoc; diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index e8dddda584a9b..23ba26c484ad7 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -11003,8 +11003,9 @@ void ASTReader::diagnoseOdrViolations() { } void ASTReader::StartedDeserializing() { - if (++NumCurrentElementsDeserializing == 1 && ReadTimer.get()) - ReadTimer->startTimer(); + if (llvm::Timer *T = ReadTimer.get(); + ++NumCurrentElementsDeserializing == 1 && T) + ReadTimeRegion.emplace(T); } void ASTReader::FinishedDeserializing() { @@ -11062,8 +11063,7 @@ void ASTReader::FinishedDeserializing() { (void)UndeducedFD->getMostRecentDecl(); } - if (ReadTimer) - ReadTimer->stopTimer(); + ReadTimeRegion.reset(); diagnoseOdrViolations(); }