Skip to content

Commit

Permalink
[Parse] Remove TimeTraceScope for "ParseTemplate"
Browse files Browse the repository at this point in the history
Fix #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
  • Loading branch information
MaskRay committed Apr 17, 2023
1 parent 65aaabc commit 676a96f
Showing 1 changed file with 0 additions and 6 deletions.
6 changes: 0 additions & 6 deletions clang/lib/Parse/ParseTemplate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)) {
Expand Down

0 comments on commit 676a96f

Please sign in to comment.