From: Richard Smith Date: Fri, 15 May 2015 02:34:32 +0000 (+0000) Subject: Refactor: when exposing a definition in some module, provide listeners with the X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=47b21db9e69c7b70ef754da5f42f2969875a7474;p=clang Refactor: when exposing a definition in some module, provide listeners with the module rather than requiring them to work it out themselves. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@237416 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/ASTMutationListener.h b/include/clang/AST/ASTMutationListener.h index d2b0a8b0c7..4f3acc3a75 100644 --- a/include/clang/AST/ASTMutationListener.h +++ b/include/clang/AST/ASTMutationListener.h @@ -13,8 +13,6 @@ #ifndef LLVM_CLANG_AST_ASTMUTATIONLISTENER_H #define LLVM_CLANG_AST_ASTMUTATIONLISTENER_H -#include "clang/Basic/SourceLocation.h" - namespace clang { class ClassTemplateDecl; class ClassTemplateSpecializationDecl; @@ -24,6 +22,7 @@ namespace clang { class DeclContext; class FunctionDecl; class FunctionTemplateDecl; + class Module; class NamedDecl; class ObjCCategoryDecl; class ObjCContainerDecl; @@ -117,8 +116,9 @@ public: /// \brief A definition has been made visible by being redefined locally. /// /// \param D The definition that was previously not visible. - virtual void RedefinedHiddenDefinition(const NamedDecl *D, - SourceLocation Loc) {} + /// \param M The containing module in which the definition was made visible, + /// if any. + virtual void RedefinedHiddenDefinition(const NamedDecl *D, Module *M) {} // NOTE: If new methods are added they should also be added to // MultiplexASTMutationListener. diff --git a/include/clang/Lex/Preprocessor.h b/include/clang/Lex/Preprocessor.h index 3f668e1e27..4562741658 100644 --- a/include/clang/Lex/Preprocessor.h +++ b/include/clang/Lex/Preprocessor.h @@ -1790,6 +1790,7 @@ private: void HandleImportDirective(SourceLocation HashLoc, Token &Tok); void HandleMicrosoftImportDirective(Token &Tok); +public: // Module inclusion testing. /// \brief Find the module that owns the source or header file that /// \p Loc points to. If the location is in a file that was included @@ -1800,6 +1801,7 @@ private: /// directly or indirectly. Module *getModuleContainingLocation(SourceLocation Loc); +private: // Macro handling. void HandleDefineDirective(Token &Tok, bool ImmediatelyAfterTopLevelIfndef); void HandleUndefDirective(Token &Tok); diff --git a/include/clang/Serialization/ASTWriter.h b/include/clang/Serialization/ASTWriter.h index 649dbd8b85..297ee22dfa 100644 --- a/include/clang/Serialization/ASTWriter.h +++ b/include/clang/Serialization/ASTWriter.h @@ -300,6 +300,7 @@ private: void *Type; unsigned Loc; unsigned Val; + Module *Mod; }; public: @@ -311,6 +312,8 @@ private: : Kind(Kind), Loc(Loc.getRawEncoding()) {} DeclUpdate(unsigned Kind, unsigned Val) : Kind(Kind), Val(Val) {} + DeclUpdate(unsigned Kind, Module *M) + : Kind(Kind), Mod(M) {} unsigned getKind() const { return Kind; } const Decl *getDecl() const { return Dcl; } @@ -319,6 +322,7 @@ private: return SourceLocation::getFromRawEncoding(Loc); } unsigned getNumber() const { return Val; } + Module *getModule() const { return Mod; } }; typedef SmallVector UpdateRecord; @@ -854,8 +858,7 @@ public: const ObjCCategoryDecl *ClassExt) override; void DeclarationMarkedUsed(const Decl *D) override; void DeclarationMarkedOpenMPThreadPrivate(const Decl *D) override; - void RedefinedHiddenDefinition(const NamedDecl *D, - SourceLocation Loc) override; + void RedefinedHiddenDefinition(const NamedDecl *D, Module *M) override; }; /// \brief AST and semantic-analysis consumer that generates a diff --git a/lib/Frontend/MultiplexConsumer.cpp b/lib/Frontend/MultiplexConsumer.cpp index 1512b5e6ba..219e9492d2 100644 --- a/lib/Frontend/MultiplexConsumer.cpp +++ b/lib/Frontend/MultiplexConsumer.cpp @@ -111,8 +111,7 @@ public: const ObjCCategoryDecl *ClassExt) override; void DeclarationMarkedUsed(const Decl *D) override; void DeclarationMarkedOpenMPThreadPrivate(const Decl *D) override; - void RedefinedHiddenDefinition(const NamedDecl *D, - SourceLocation Loc) override; + void RedefinedHiddenDefinition(const NamedDecl *D, Module *M) override; private: std::vector Listeners; @@ -196,10 +195,10 @@ void MultiplexASTMutationListener::DeclarationMarkedOpenMPThreadPrivate( for (size_t i = 0, e = Listeners.size(); i != e; ++i) Listeners[i]->DeclarationMarkedOpenMPThreadPrivate(D); } -void MultiplexASTMutationListener::RedefinedHiddenDefinition( - const NamedDecl *D, SourceLocation Loc) { +void MultiplexASTMutationListener::RedefinedHiddenDefinition(const NamedDecl *D, + Module *M) { for (auto *L : Listeners) - L->RedefinedHiddenDefinition(D, Loc); + L->RedefinedHiddenDefinition(D, M); } } // end namespace clang diff --git a/lib/Sema/SemaLookup.cpp b/lib/Sema/SemaLookup.cpp index 012c1cf392..5e7e34a892 100644 --- a/lib/Sema/SemaLookup.cpp +++ b/lib/Sema/SemaLookup.cpp @@ -25,6 +25,7 @@ #include "clang/Basic/Builtins.h" #include "clang/Basic/LangOptions.h" #include "clang/Lex/ModuleLoader.h" +#include "clang/Lex/Preprocessor.h" #include "clang/Sema/DeclSpec.h" #include "clang/Sema/ExternalSemaSource.h" #include "clang/Sema/Overload.h" @@ -1172,7 +1173,8 @@ static Decl *getInstantiatedFrom(Decl *D, MemberSpecializationInfo *MSInfo) { void Sema::makeMergedDefinitionVisible(NamedDecl *ND, SourceLocation Loc) { if (auto *Listener = getASTMutationListener()) - Listener->RedefinedHiddenDefinition(ND, Loc); + Listener->RedefinedHiddenDefinition(ND, + PP.getModuleContainingLocation(Loc)); ND->setHidden(false); } diff --git a/lib/Serialization/ASTWriter.cpp b/lib/Serialization/ASTWriter.cpp index 29a88a13d3..1e7fc5cdb6 100644 --- a/lib/Serialization/ASTWriter.cpp +++ b/lib/Serialization/ASTWriter.cpp @@ -4598,7 +4598,7 @@ void ASTWriter::WriteDeclUpdatesBlocks(RecordDataImpl &OffsetsRecord) { break; case UPD_DECL_EXPORTED: - Record.push_back(inferSubmoduleIDFromLocation(Update.getLoc())); + Record.push_back(getSubmoduleID(Update.getModule())); break; } } @@ -5743,10 +5743,9 @@ void ASTWriter::DeclarationMarkedOpenMPThreadPrivate(const Decl *D) { DeclUpdates[D].push_back(DeclUpdate(UPD_DECL_MARKED_OPENMP_THREADPRIVATE)); } -void ASTWriter::RedefinedHiddenDefinition(const NamedDecl *D, - SourceLocation Loc) { +void ASTWriter::RedefinedHiddenDefinition(const NamedDecl *D, Module *M) { assert(!WritingAST && "Already writing the AST!"); assert(D->isHidden() && "expected a hidden declaration"); assert(D->isFromASTFile() && "hidden decl not from AST file"); - DeclUpdates[D].push_back(DeclUpdate(UPD_DECL_EXPORTED, Loc)); + DeclUpdates[D].push_back(DeclUpdate(UPD_DECL_EXPORTED, M)); }