[clang] 676a96f - [Parse] Remove TimeTraceScope for "ParseTemplate"
Fangrui Song via cfe-commits
cfe-commits at lists.llvm.org
Mon Apr 17 09:57:58 PDT 2023
Author: Fangrui Song
Date: 2023-04-17T09:57:53-07:00
New Revision: 676a96f768e1101ed5187c7751e56e1e11ebe593
URL: https://github.com/llvm/llvm-project/commit/676a96f768e1101ed5187c7751e56e1e11ebe593
DIFF: https://github.com/llvm/llvm-project/commit/676a96f768e1101ed5187c7751e56e1e11ebe593.diff
LOG: [Parse] Remove TimeTraceScope for "ParseTemplate"
Fix https://github.com/llvm/llvm-project/issues/56554
```
#include "1.h"
#include "2.h"
int foo();
```
Suppose that 1.h ends with a template function. When parsing the function,
the `ParseFunctionDefinition` call after the TimeTraceScope object
may consume a `r_brace` token and lex the end of file (1.h), resulting
in an ExitFile event in SemaPPCallbacks::FileChanged. This event will call `llvm::timeTraceProfilerEnd();`,
which incorrectly ends "ParseTemplate" instead of "Source" (1.h).
Once 2.h has been fully parsed, the destructor of 1.h's TimeTraceScope object
will end "Source" (1.h).
This behavior erroneously extends the end of "Source" (1.h), which makes
"Source" (2.h) appear to be nested inside "Source" (1.h). This bug is difficult
to fix correctly in an elegant way, and we have two options: either end
"ParseTemplate" when ending "Source" (1.h), or delay the ExitFile event.
However, both approaches require complex code. For now, we can remove the
"ParseTemplate" TimeTraceScope. This can be re-added if properly repaired.
Reviewed By: anton-afanasyev
Differential Revision: https://reviews.llvm.org/D148410
Added:
Modified:
clang/lib/Parse/ParseTemplate.cpp
Removed:
################################################################################
diff --git a/clang/lib/Parse/ParseTemplate.cpp b/clang/lib/Parse/ParseTemplate.cpp
index 6fc67b6965dd4..f4c45c86b0397 100644
--- a/clang/lib/Parse/ParseTemplate.cpp
+++ b/clang/lib/Parse/ParseTemplate.cpp
@@ -281,12 +281,6 @@ Decl *Parser::ParseSingleDeclarationAfterTemplate(
return nullptr;
}
- llvm::TimeTraceScope TimeScope("ParseTemplate", [&]() {
- return std::string(DeclaratorInfo.getIdentifier() != nullptr
- ? DeclaratorInfo.getIdentifier()->getName()
- : "<unknown>");
- });
-
LateParsedAttrList LateParsedAttrs(true);
if (DeclaratorInfo.isFunctionDeclarator()) {
if (Tok.is(tok::kw_requires)) {
More information about the cfe-commits
mailing list