Skip to content

Commit cd7f205

Browse files
committed
[IRGen] Check as early as possible for Clang decls we've seen before.
Previously, we were only doing this after the fast-path code that handles decls without any executable code. This meant, however, that we were potentially processing these decls multiple times. This is definitely inefficient; it may even be a correctness issue, depending on what amount of checking `HandleTopLevelDecl` does to see if it has processed a particular decl before (which I'm not sure about either way).
1 parent 87d3b4d commit cd7f205

File tree

1 file changed

+4
-2
lines changed

1 file changed

+4
-2
lines changed

lib/IRGen/GenClangDecl.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,15 +37,17 @@ class ClangDeclRefFinder
3737
} // end anonymous namespace
3838

3939
void IRGenModule::emitClangDecl(const clang::Decl *decl) {
40+
// Ignore this decl if we've seen it before.
41+
if (!GlobalClangDecls.insert(decl->getCanonicalDecl()).second)
42+
return;
43+
4044
auto valueDecl = dyn_cast<clang::ValueDecl>(decl);
4145
if (!valueDecl || valueDecl->isExternallyVisible()) {
4246
ClangCodeGen->HandleTopLevelDecl(
4347
clang::DeclGroupRef(const_cast<clang::Decl*>(decl)));
4448
return;
4549
}
4650

47-
if (!GlobalClangDecls.insert(decl->getCanonicalDecl()).second)
48-
return;
4951
SmallVector<const clang::Decl *, 8> stack;
5052
stack.push_back(decl);
5153

0 commit comments

Comments
 (0)