Author: Gabor Marton Date: 2022-05-18T10:35:52+02:00 New Revision: 25ac078a961de91522e5b5afaa6d4ffdd0dd05c4
URL: https://github.com/llvm/llvm-project/commit/25ac078a961de91522e5b5afaa6d4ffdd0dd05c4 DIFF: https://github.com/llvm/llvm-project/commit/25ac078a961de91522e5b5afaa6d4ffdd0dd05c4.diff LOG: [clang][ASTImporter] Add isNewDecl Summary: Add a new function with which we can query if a Decl had been newly created during the import process. This feature is a must if we want to have a different static analysis strategy for such newly created declarations. This is a dependent patch that is needed for the new CTU implementation discribed at https://discourse.llvm.org/t/rfc-much-faster-cross-translation-unit-ctu-analysis-implementation/61728 Differential Revision: https://reviews.llvm.org/D123685 Added: Modified: clang/include/clang/AST/ASTImporterSharedState.h clang/lib/AST/ASTImporter.cpp clang/unittests/AST/ASTImporterTest.cpp Removed: ################################################################################ diff --git a/clang/include/clang/AST/ASTImporterSharedState.h b/clang/include/clang/AST/ASTImporterSharedState.h index 7be6f1460a856..a64c9d6be455f 100644 --- a/clang/include/clang/AST/ASTImporterSharedState.h +++ b/clang/include/clang/AST/ASTImporterSharedState.h @@ -38,6 +38,9 @@ class ASTImporterSharedState { /// never cleared (like ImportedFromDecls). llvm::DenseMap<Decl *, ImportError> ImportErrors; + /// Set of the newly created declarations. + llvm::DenseSet<Decl *> NewDecls; + // FIXME put ImportedFromDecls here! // And from that point we can better encapsulate the lookup table. @@ -73,6 +76,10 @@ class ASTImporterSharedState { void setImportDeclError(Decl *To, ImportError Error) { ImportErrors[To] = Error; } + + bool isNewDecl(const Decl *ToD) const { return NewDecls.count(ToD); } + + void markAsNewDecl(Decl *ToD) { NewDecls.insert(ToD); } }; } // namespace clang diff --git a/clang/lib/AST/ASTImporter.cpp b/clang/lib/AST/ASTImporter.cpp index e2294088908c5..9c4f60511fb2f 100644 --- a/clang/lib/AST/ASTImporter.cpp +++ b/clang/lib/AST/ASTImporter.cpp @@ -285,6 +285,7 @@ namespace clang { ToD = CreateFun(std::forward<Args>(args)...); // Keep track of imported Decls. Importer.RegisterImportedDecl(FromD, ToD); + Importer.SharedState->markAsNewDecl(ToD); InitializeImportedDecl(FromD, ToD); return false; // A new Decl is created. } diff --git a/clang/unittests/AST/ASTImporterTest.cpp b/clang/unittests/AST/ASTImporterTest.cpp index 856010cd4d036..896e3cb7a956c 100644 --- a/clang/unittests/AST/ASTImporterTest.cpp +++ b/clang/unittests/AST/ASTImporterTest.cpp @@ -7698,6 +7698,38 @@ TEST_P(ASTImporterOptionSpecificTestBase, EXPECT_TRUE(ToX->getInClassInitializer()); } +TEST_P(ASTImporterOptionSpecificTestBase, isNewDecl) { + Decl *FromTU = getTuDecl( + R"( + int bar() { + return 0; + } + void other() { + bar(); + } + )", + Lang_CXX11); + Decl *ToTU = getToTuDecl( + R"( + int bar() { + return 0; + } + )", + Lang_CXX11); + auto *FromOther = FirstDeclMatcher<FunctionDecl>().match( + FromTU, functionDecl(hasName("other"))); + ASSERT_TRUE(FromOther); + + auto *ToOther = Import(FromOther, Lang_CXX11); + ASSERT_TRUE(ToOther); + + auto *ToBar = FirstDeclMatcher<FunctionDecl>().match( + ToTU, functionDecl(hasName("bar"))); + + EXPECT_TRUE(SharedStatePtr->isNewDecl(ToOther)); + EXPECT_FALSE(SharedStatePtr->isNewDecl(ToBar)); +} + INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ASTImporterLookupTableTest, DefaultTestValuesForRunOptions); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits