Author: ibiryukov Date: Thu Jul 18 08:43:26 2019 New Revision: 366453 URL: http://llvm.org/viewvc/llvm-project?rev=366453&view=rev Log: Revert r366449: [CrossTU] Add a function to retrieve original source location.
Reason: the commit breaks layering by adding a dependency on ASTUnit (which is inside clangFrontend) from the ASTImporter (which is inside clangAST). Modified: cfe/trunk/include/clang/AST/ASTImporter.h cfe/trunk/include/clang/AST/ASTImporterSharedState.h cfe/trunk/include/clang/CrossTU/CrossTranslationUnit.h cfe/trunk/lib/AST/ASTImporter.cpp cfe/trunk/lib/CrossTU/CrossTranslationUnit.cpp cfe/trunk/unittests/CrossTU/CrossTranslationUnitTest.cpp Modified: cfe/trunk/include/clang/AST/ASTImporter.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/ASTImporter.h?rev=366453&r1=366452&r2=366453&view=diff ============================================================================== --- cfe/trunk/include/clang/AST/ASTImporter.h (original) +++ cfe/trunk/include/clang/AST/ASTImporter.h Thu Jul 18 08:43:26 2019 @@ -34,7 +34,6 @@ namespace clang { class ASTContext; class ASTImporterSharedState; -class ASTUnit; class Attr; class CXXBaseSpecifier; class CXXCtorInitializer; @@ -230,11 +229,6 @@ class TypeSourceInfo; /// The file managers we're importing to and from. FileManager &ToFileManager, &FromFileManager; - /// The ASTUnit for the From context, if any. - /// This is used to create a mapping of imported ('To') FileID's to the - /// original ('From') FileID and ASTUnit. - ASTUnit *FromUnit; - /// Whether to perform a minimal import. bool Minimal; @@ -283,11 +277,6 @@ class TypeSourceInfo; void AddToLookupTable(Decl *ToD); - ASTImporter(ASTContext &ToContext, FileManager &ToFileManager, - ASTContext &FromContext, FileManager &FromFileManager, - ASTUnit *FromUnit, bool MinimalImport, - std::shared_ptr<ASTImporterSharedState> SharedState); - protected: /// Can be overwritten by subclasses to implement their own import logic. /// The overwritten method should call this method if it didn't import the @@ -298,6 +287,7 @@ class TypeSourceInfo; virtual bool returnWithErrorInTest() { return false; }; public: + /// \param ToContext The context we'll be importing into. /// /// \param ToFileManager The file manager we'll be importing into. @@ -317,23 +307,6 @@ class TypeSourceInfo; ASTContext &FromContext, FileManager &FromFileManager, bool MinimalImport, std::shared_ptr<ASTImporterSharedState> SharedState = nullptr); - /// \param ToContext The context we'll be importing into. - /// - /// \param ToFileManager The file manager we'll be importing into. - /// - /// \param FromUnit Pointer to an ASTUnit that contains the context and - /// file manager to import from. - /// - /// \param MinimalImport If true, the importer will attempt to import - /// as little as it can, e.g., by importing declarations as forward - /// declarations that can be completed at a later point. - /// - /// \param SharedState The importer specific lookup table which may be - /// shared amongst several ASTImporter objects. - /// If not set then the original C/C++ lookup is used. - ASTImporter(ASTContext &ToContext, FileManager &ToFileManager, - ASTUnit &FromUnit, bool MinimalImport, - std::shared_ptr<ASTImporterSharedState> SharedState = nullptr); virtual ~ASTImporter(); Modified: cfe/trunk/include/clang/AST/ASTImporterSharedState.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/ASTImporterSharedState.h?rev=366453&r1=366452&r2=366453&view=diff ============================================================================== --- cfe/trunk/include/clang/AST/ASTImporterSharedState.h (original) +++ cfe/trunk/include/clang/AST/ASTImporterSharedState.h Thu Jul 18 08:43:26 2019 @@ -17,24 +17,18 @@ #include "clang/AST/ASTImporterLookupTable.h" #include "clang/AST/Decl.h" -#include "clang/Basic/SourceLocation.h" #include "llvm/ADT/DenseMap.h" // FIXME We need this because of ImportError. #include "clang/AST/ASTImporter.h" namespace clang { -class ASTUnit; class TranslationUnitDecl; /// Importer specific state, which may be shared amongst several ASTImporter /// objects. class ASTImporterSharedState { -public: - using ImportedFileIDMap = - llvm::DenseMap<FileID, std::pair<FileID, ASTUnit *>>; -private: /// Pointer to the import specific lookup table. std::unique_ptr<ASTImporterLookupTable> LookupTable; @@ -49,16 +43,6 @@ private: // FIXME put ImportedFromDecls here! // And from that point we can better encapsulate the lookup table. - /// Map of imported FileID's (in "To" context) to FileID in "From" context - /// and the ASTUnit that contains the preprocessor and source manager for the - /// "From" FileID. This map is used to lookup a FileID and its SourceManager - /// when knowing only the FileID in the 'To' context. The FileID could be - /// imported by any of multiple ASTImporter objects. The map is used because - /// we do not want to loop over all ASTImporter's to find the one that - /// imported the FileID. (The ASTUnit is usable to get the SourceManager and - /// additional data.) - ImportedFileIDMap ImportedFileIDs; - public: ASTImporterSharedState() = default; @@ -91,12 +75,6 @@ public: void setImportDeclError(Decl *To, ImportError Error) { ImportErrors[To] = Error; } - - ImportedFileIDMap &getImportedFileIDs() { return ImportedFileIDs; } - - const ImportedFileIDMap &getImportedFileIDs() const { - return ImportedFileIDs; - } }; } // namespace clang Modified: cfe/trunk/include/clang/CrossTU/CrossTranslationUnit.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/CrossTU/CrossTranslationUnit.h?rev=366453&r1=366452&r2=366453&view=diff ============================================================================== --- cfe/trunk/include/clang/CrossTU/CrossTranslationUnit.h (original) +++ cfe/trunk/include/clang/CrossTU/CrossTranslationUnit.h Thu Jul 18 08:43:26 2019 @@ -153,10 +153,8 @@ public: /// was passed to the constructor. /// /// \return Returns the resulting definition or an error. - llvm::Expected<const FunctionDecl *> importDefinition(const FunctionDecl *FD, - ASTUnit *Unit); - llvm::Expected<const VarDecl *> importDefinition(const VarDecl *VD, - ASTUnit *Unit); + llvm::Expected<const FunctionDecl *> importDefinition(const FunctionDecl *FD); + llvm::Expected<const VarDecl *> importDefinition(const VarDecl *VD); /// Get a name to identify a named decl. static std::string getLookupName(const NamedDecl *ND); @@ -164,19 +162,9 @@ public: /// Emit diagnostics for the user for potential configuration errors. void emitCrossTUDiagnostics(const IndexError &IE); - /// Determine the original source location in the original TU for an - /// imported source location. - /// \p ToLoc Source location in the imported-to AST. - /// \return Source location in the imported-from AST and the corresponding - /// ASTUnit. - /// If any error happens (ToLoc is a non-imported source location) empty is - /// returned. - llvm::Optional<std::pair<SourceLocation /*FromLoc*/, ASTUnit *>> - getImportedFromSourceLocation(const clang::SourceLocation &ToLoc) const; - private: void lazyInitImporterSharedSt(TranslationUnitDecl *ToTU); - ASTImporter &getOrCreateASTImporter(ASTUnit *Unit); + ASTImporter &getOrCreateASTImporter(ASTContext &From); template <typename T> llvm::Expected<const T *> getCrossTUDefinitionImpl(const T *D, StringRef CrossTUDir, @@ -186,7 +174,7 @@ private: const T *findDefInDeclContext(const DeclContext *DC, StringRef LookupName); template <typename T> - llvm::Expected<const T *> importDefinitionImpl(const T *D, ASTUnit *Unit); + llvm::Expected<const T *> importDefinitionImpl(const T *D); llvm::StringMap<std::unique_ptr<clang::ASTUnit>> FileASTUnitMap; llvm::StringMap<clang::ASTUnit *> NameASTUnitMap; Modified: cfe/trunk/lib/AST/ASTImporter.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTImporter.cpp?rev=366453&r1=366452&r2=366453&view=diff ============================================================================== --- cfe/trunk/lib/AST/ASTImporter.cpp (original) +++ cfe/trunk/lib/AST/ASTImporter.cpp Thu Jul 18 08:43:26 2019 @@ -12,9 +12,9 @@ //===----------------------------------------------------------------------===// #include "clang/AST/ASTImporter.h" +#include "clang/AST/ASTImporterSharedState.h" #include "clang/AST/ASTContext.h" #include "clang/AST/ASTDiagnostic.h" -#include "clang/AST/ASTImporterSharedState.h" #include "clang/AST/ASTStructuralEquivalence.h" #include "clang/AST/Attr.h" #include "clang/AST/Decl.h" @@ -52,14 +52,13 @@ #include "clang/Basic/SourceLocation.h" #include "clang/Basic/SourceManager.h" #include "clang/Basic/Specifiers.h" -#include "clang/Frontend/ASTUnit.h" #include "llvm/ADT/APSInt.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/None.h" #include "llvm/ADT/Optional.h" -#include "llvm/ADT/STLExtras.h" #include "llvm/ADT/ScopeExit.h" +#include "llvm/ADT/STLExtras.h" #include "llvm/ADT/SmallVector.h" #include "llvm/Support/Casting.h" #include "llvm/Support/ErrorHandling.h" @@ -7717,22 +7716,9 @@ ASTImporter::ASTImporter(ASTContext &ToC ASTContext &FromContext, FileManager &FromFileManager, bool MinimalImport, std::shared_ptr<ASTImporterSharedState> SharedState) - : ASTImporter(ToContext, ToFileManager, FromContext, FromFileManager, - nullptr, MinimalImport, SharedState){} -ASTImporter::ASTImporter(ASTContext &ToContext, FileManager &ToFileManager, - ASTUnit &FromUnit, bool MinimalImport, - std::shared_ptr<ASTImporterSharedState> SharedState) - : ASTImporter(ToContext, ToFileManager, FromUnit.getASTContext(), - FromUnit.getFileManager(), &FromUnit, MinimalImport, - SharedState){} - -ASTImporter::ASTImporter(ASTContext &ToContext, FileManager &ToFileManager, - ASTContext &FromContext, FileManager &FromFileManager, - ASTUnit *FromUnit, bool MinimalImport, - std::shared_ptr<ASTImporterSharedState> SharedState) : SharedState(SharedState), ToContext(ToContext), FromContext(FromContext), ToFileManager(ToFileManager), FromFileManager(FromFileManager), - FromUnit(FromUnit), Minimal(MinimalImport) { + Minimal(MinimalImport) { // Create a default state without the lookup table: LLDB case. if (!SharedState) { @@ -8435,13 +8421,6 @@ Expected<FileID> ASTImporter::Import(Fil assert(ToID.isValid() && "Unexpected invalid fileID was created."); ImportedFileIDs[FromID] = ToID; - if (FromUnit) { - assert(SharedState->getImportedFileIDs().find(ToID) == - SharedState->getImportedFileIDs().end() && - "FileID already imported!"); - SharedState->getImportedFileIDs()[ToID] = std::make_pair(FromID, FromUnit); - } - return ToID; } Modified: cfe/trunk/lib/CrossTU/CrossTranslationUnit.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CrossTU/CrossTranslationUnit.cpp?rev=366453&r1=366452&r2=366453&view=diff ============================================================================== --- cfe/trunk/lib/CrossTU/CrossTranslationUnit.cpp (original) +++ cfe/trunk/lib/CrossTU/CrossTranslationUnit.cpp Thu Jul 18 08:43:26 2019 @@ -295,7 +295,7 @@ llvm::Expected<const T *> CrossTranslati TranslationUnitDecl *TU = Unit->getASTContext().getTranslationUnitDecl(); if (const T *ResultDecl = findDefInDeclContext<T>(TU, LookupName)) - return importDefinition(ResultDecl, Unit); + return importDefinition(ResultDecl); return llvm::make_error<IndexError>(index_error_code::failed_import); } @@ -411,13 +411,10 @@ llvm::Expected<ASTUnit *> CrossTranslati template <typename T> llvm::Expected<const T *> -CrossTranslationUnitContext::importDefinitionImpl(const T *D, ASTUnit *Unit) { +CrossTranslationUnitContext::importDefinitionImpl(const T *D) { assert(hasBodyOrInit(D) && "Decls to be imported should have body or init."); - assert(&D->getASTContext() == &Unit->getASTContext() && - "ASTContext of Decl and the unit should match."); - ASTImporter &Importer = getOrCreateASTImporter(Unit); - + ASTImporter &Importer = getOrCreateASTImporter(D->getASTContext()); auto ToDeclOrError = Importer.Import(D); if (!ToDeclOrError) { handleAllErrors(ToDeclOrError.takeError(), @@ -444,15 +441,13 @@ CrossTranslationUnitContext::importDefin } llvm::Expected<const FunctionDecl *> -CrossTranslationUnitContext::importDefinition(const FunctionDecl *FD, - ASTUnit *Unit) { - return importDefinitionImpl(FD, Unit); +CrossTranslationUnitContext::importDefinition(const FunctionDecl *FD) { + return importDefinitionImpl(FD); } llvm::Expected<const VarDecl *> -CrossTranslationUnitContext::importDefinition(const VarDecl *VD, - ASTUnit *Unit) { - return importDefinitionImpl(VD, Unit); +CrossTranslationUnitContext::importDefinition(const VarDecl *VD) { + return importDefinitionImpl(VD); } void CrossTranslationUnitContext::lazyInitImporterSharedSt( @@ -462,40 +457,17 @@ void CrossTranslationUnitContext::lazyIn } ASTImporter & -CrossTranslationUnitContext::getOrCreateASTImporter(ASTUnit *Unit) { - ASTContext &From = Unit->getASTContext(); - +CrossTranslationUnitContext::getOrCreateASTImporter(ASTContext &From) { auto I = ASTUnitImporterMap.find(From.getTranslationUnitDecl()); if (I != ASTUnitImporterMap.end()) return *I->second; lazyInitImporterSharedSt(Context.getTranslationUnitDecl()); - ASTImporter *NewImporter = - new ASTImporter(Context, Context.getSourceManager().getFileManager(), - *Unit, false, ImporterSharedSt); + ASTImporter *NewImporter = new ASTImporter( + Context, Context.getSourceManager().getFileManager(), From, + From.getSourceManager().getFileManager(), false, ImporterSharedSt); ASTUnitImporterMap[From.getTranslationUnitDecl()].reset(NewImporter); return *NewImporter; } -llvm::Optional<std::pair<SourceLocation, ASTUnit *>> -CrossTranslationUnitContext::getImportedFromSourceLocation( - const clang::SourceLocation &ToLoc) const { - if (!ImporterSharedSt) - return {}; - - const SourceManager &SM = Context.getSourceManager(); - auto DecToLoc = SM.getDecomposedLoc(ToLoc); - - auto I = ImporterSharedSt->getImportedFileIDs().find(DecToLoc.first); - if (I == ImporterSharedSt->getImportedFileIDs().end()) - return {}; - - FileID FromID = I->second.first; - clang::ASTUnit *Unit = I->second.second; - SourceLocation FromLoc = - Unit->getSourceManager().getComposedLoc(FromID, DecToLoc.second); - - return std::make_pair(FromLoc, Unit); -} - } // namespace cross_tu } // namespace clang Modified: cfe/trunk/unittests/CrossTU/CrossTranslationUnitTest.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/CrossTU/CrossTranslationUnitTest.cpp?rev=366453&r1=366452&r2=366453&view=diff ============================================================================== --- cfe/trunk/unittests/CrossTU/CrossTranslationUnitTest.cpp (original) +++ cfe/trunk/unittests/CrossTU/CrossTranslationUnitTest.cpp Thu Jul 18 08:43:26 2019 @@ -28,18 +28,13 @@ public: : CTU(CI), Success(Success) {} void HandleTranslationUnit(ASTContext &Ctx) { - auto FindFInTU = [](const TranslationUnitDecl *TU) { - const FunctionDecl *FD = nullptr; - for (const Decl *D : TU->decls()) { - FD = dyn_cast<FunctionDecl>(D); - if (FD && FD->getName() == "f") - break; - } - return FD; - }; - const TranslationUnitDecl *TU = Ctx.getTranslationUnitDecl(); - const FunctionDecl *FD = FindFInTU(TU); + const FunctionDecl *FD = nullptr; + for (const Decl *D : TU->decls()) { + FD = dyn_cast<FunctionDecl>(D); + if (FD && FD->getName() == "f") + break; + } assert(FD && FD->getName() == "f"); bool OrigFDHasBody = FD->hasBody(); @@ -83,28 +78,6 @@ public: if (NewFDorError) { const FunctionDecl *NewFD = *NewFDorError; *Success = NewFD && NewFD->hasBody() && !OrigFDHasBody; - - if (NewFD) { - // Check GetImportedFromSourceLocation. - llvm::Optional<std::pair<SourceLocation, ASTUnit *>> SLocResult = - CTU.getImportedFromSourceLocation(NewFD->getLocation()); - EXPECT_TRUE(SLocResult); - if (SLocResult) { - SourceLocation OrigSLoc = (*SLocResult).first; - ASTUnit *OrigUnit = (*SLocResult).second; - // OrigUnit is created internally by CTU (is not the - // ASTWithDefinition). - TranslationUnitDecl *OrigTU = - OrigUnit->getASTContext().getTranslationUnitDecl(); - const FunctionDecl *FDWithDefinition = FindFInTU(OrigTU); - EXPECT_TRUE(FDWithDefinition); - if (FDWithDefinition) { - EXPECT_EQ(FDWithDefinition->getName(), "f"); - EXPECT_TRUE(FDWithDefinition->isThisDeclarationADefinition()); - EXPECT_EQ(OrigSLoc, FDWithDefinition->getLocation()); - } - } - } } } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits