1218887Sdim//===- MultiplexConsumer.cpp - AST Consumer for PCH Generation --*- C++ -*-===// 2218887Sdim// 3218887Sdim// The LLVM Compiler Infrastructure 4218887Sdim// 5218887Sdim// This file is distributed under the University of Illinois Open Source 6218887Sdim// License. See LICENSE.TXT for details. 7218887Sdim// 8218887Sdim//===----------------------------------------------------------------------===// 9218887Sdim// 10218887Sdim// This file defines the MultiplexConsumer class. It also declares and defines 11218887Sdim// MultiplexASTDeserializationListener and MultiplexASTMutationListener, which 12218887Sdim// are implementation details of MultiplexConsumer. 13218887Sdim// 14218887Sdim//===----------------------------------------------------------------------===// 15218887Sdim 16218887Sdim#include "clang/Frontend/MultiplexConsumer.h" 17218887Sdim#include "clang/AST/ASTMutationListener.h" 18218887Sdim#include "clang/AST/DeclGroup.h" 19218887Sdim#include "clang/Serialization/ASTDeserializationListener.h" 20218887Sdim 21218887Sdimusing namespace clang; 22218887Sdim 23218887Sdimnamespace clang { 24218887Sdim 25218887Sdim// This ASTDeserializationListener forwards its notifications to a set of 26218887Sdim// child listeners. 27218887Sdimclass MultiplexASTDeserializationListener 28218887Sdim : public ASTDeserializationListener { 29218887Sdimpublic: 30218887Sdim // Does NOT take ownership of the elements in L. 31218887Sdim MultiplexASTDeserializationListener( 32218887Sdim const std::vector<ASTDeserializationListener*>& L); 33276479Sdim void ReaderInitialized(ASTReader *Reader) override; 34276479Sdim void IdentifierRead(serialization::IdentID ID, 35276479Sdim IdentifierInfo *II) override; 36288943Sdim void MacroRead(serialization::MacroID ID, MacroInfo *MI) override; 37276479Sdim void TypeRead(serialization::TypeIdx Idx, QualType T) override; 38276479Sdim void DeclRead(serialization::DeclID ID, const Decl *D) override; 39276479Sdim void SelectorRead(serialization::SelectorID iD, Selector Sel) override; 40276479Sdim void MacroDefinitionRead(serialization::PreprocessedEntityID, 41288943Sdim MacroDefinitionRecord *MD) override; 42288943Sdim void ModuleRead(serialization::SubmoduleID ID, Module *Mod) override; 43288943Sdim 44218887Sdimprivate: 45288943Sdim std::vector<ASTDeserializationListener *> Listeners; 46218887Sdim}; 47218887Sdim 48218887SdimMultiplexASTDeserializationListener::MultiplexASTDeserializationListener( 49218887Sdim const std::vector<ASTDeserializationListener*>& L) 50218887Sdim : Listeners(L) { 51218887Sdim} 52218887Sdim 53218887Sdimvoid MultiplexASTDeserializationListener::ReaderInitialized( 54218887Sdim ASTReader *Reader) { 55218887Sdim for (size_t i = 0, e = Listeners.size(); i != e; ++i) 56218887Sdim Listeners[i]->ReaderInitialized(Reader); 57218887Sdim} 58218887Sdim 59218887Sdimvoid MultiplexASTDeserializationListener::IdentifierRead( 60218887Sdim serialization::IdentID ID, IdentifierInfo *II) { 61218887Sdim for (size_t i = 0, e = Listeners.size(); i != e; ++i) 62218887Sdim Listeners[i]->IdentifierRead(ID, II); 63218887Sdim} 64218887Sdim 65288943Sdimvoid MultiplexASTDeserializationListener::MacroRead( 66288943Sdim serialization::MacroID ID, MacroInfo *MI) { 67288943Sdim for (auto &Listener : Listeners) 68288943Sdim Listener->MacroRead(ID, MI); 69288943Sdim} 70288943Sdim 71218887Sdimvoid MultiplexASTDeserializationListener::TypeRead( 72218887Sdim serialization::TypeIdx Idx, QualType T) { 73218887Sdim for (size_t i = 0, e = Listeners.size(); i != e; ++i) 74218887Sdim Listeners[i]->TypeRead(Idx, T); 75218887Sdim} 76218887Sdim 77218887Sdimvoid MultiplexASTDeserializationListener::DeclRead( 78218887Sdim serialization::DeclID ID, const Decl *D) { 79218887Sdim for (size_t i = 0, e = Listeners.size(); i != e; ++i) 80218887Sdim Listeners[i]->DeclRead(ID, D); 81218887Sdim} 82218887Sdim 83218887Sdimvoid MultiplexASTDeserializationListener::SelectorRead( 84218887Sdim serialization::SelectorID ID, Selector Sel) { 85218887Sdim for (size_t i = 0, e = Listeners.size(); i != e; ++i) 86218887Sdim Listeners[i]->SelectorRead(ID, Sel); 87218887Sdim} 88218887Sdim 89218887Sdimvoid MultiplexASTDeserializationListener::MacroDefinitionRead( 90288943Sdim serialization::PreprocessedEntityID ID, MacroDefinitionRecord *MD) { 91218887Sdim for (size_t i = 0, e = Listeners.size(); i != e; ++i) 92218887Sdim Listeners[i]->MacroDefinitionRead(ID, MD); 93218887Sdim} 94218887Sdim 95288943Sdimvoid MultiplexASTDeserializationListener::ModuleRead( 96288943Sdim serialization::SubmoduleID ID, Module *Mod) { 97288943Sdim for (auto &Listener : Listeners) 98288943Sdim Listener->ModuleRead(ID, Mod); 99288943Sdim} 100288943Sdim 101218887Sdim// This ASTMutationListener forwards its notifications to a set of 102218887Sdim// child listeners. 103218887Sdimclass MultiplexASTMutationListener : public ASTMutationListener { 104218887Sdimpublic: 105218887Sdim // Does NOT take ownership of the elements in L. 106234353Sdim MultiplexASTMutationListener(ArrayRef<ASTMutationListener*> L); 107276479Sdim void CompletedTagDefinition(const TagDecl *D) override; 108276479Sdim void AddedVisibleDecl(const DeclContext *DC, const Decl *D) override; 109276479Sdim void AddedCXXImplicitMember(const CXXRecordDecl *RD, const Decl *D) override; 110276479Sdim void AddedCXXTemplateSpecialization(const ClassTemplateDecl *TD, 111276479Sdim const ClassTemplateSpecializationDecl *D) override; 112276479Sdim void AddedCXXTemplateSpecialization(const VarTemplateDecl *TD, 113276479Sdim const VarTemplateSpecializationDecl *D) override; 114276479Sdim void AddedCXXTemplateSpecialization(const FunctionTemplateDecl *TD, 115276479Sdim const FunctionDecl *D) override; 116288943Sdim void ResolvedExceptionSpec(const FunctionDecl *FD) override; 117276479Sdim void DeducedReturnType(const FunctionDecl *FD, QualType ReturnType) override; 118288943Sdim void ResolvedOperatorDelete(const CXXDestructorDecl *DD, 119288943Sdim const FunctionDecl *Delete) override; 120276479Sdim void CompletedImplicitDefinition(const FunctionDecl *D) override; 121276479Sdim void StaticDataMemberInstantiated(const VarDecl *D) override; 122296417Sdim void DefaultArgumentInstantiated(const ParmVarDecl *D) override; 123276479Sdim void AddedObjCCategoryToInterface(const ObjCCategoryDecl *CatD, 124276479Sdim const ObjCInterfaceDecl *IFD) override; 125288943Sdim void FunctionDefinitionInstantiated(const FunctionDecl *D) override; 126276479Sdim void DeclarationMarkedUsed(const Decl *D) override; 127280031Sdim void DeclarationMarkedOpenMPThreadPrivate(const Decl *D) override; 128288943Sdim void RedefinedHiddenDefinition(const NamedDecl *D, Module *M) override; 129288943Sdim void AddedAttributeToRecord(const Attr *Attr, 130288943Sdim const RecordDecl *Record) override; 131261991Sdim 132218887Sdimprivate: 133218887Sdim std::vector<ASTMutationListener*> Listeners; 134218887Sdim}; 135218887Sdim 136218887SdimMultiplexASTMutationListener::MultiplexASTMutationListener( 137234353Sdim ArrayRef<ASTMutationListener*> L) 138234353Sdim : Listeners(L.begin(), L.end()) { 139218887Sdim} 140218887Sdim 141218887Sdimvoid MultiplexASTMutationListener::CompletedTagDefinition(const TagDecl *D) { 142218887Sdim for (size_t i = 0, e = Listeners.size(); i != e; ++i) 143218887Sdim Listeners[i]->CompletedTagDefinition(D); 144218887Sdim} 145218887Sdim 146218887Sdimvoid MultiplexASTMutationListener::AddedVisibleDecl( 147218887Sdim const DeclContext *DC, const Decl *D) { 148218887Sdim for (size_t i = 0, e = Listeners.size(); i != e; ++i) 149218887Sdim Listeners[i]->AddedVisibleDecl(DC, D); 150218887Sdim} 151218887Sdim 152218887Sdimvoid MultiplexASTMutationListener::AddedCXXImplicitMember( 153218887Sdim const CXXRecordDecl *RD, const Decl *D) { 154218887Sdim for (size_t i = 0, e = Listeners.size(); i != e; ++i) 155218887Sdim Listeners[i]->AddedCXXImplicitMember(RD, D); 156218887Sdim} 157218887Sdimvoid MultiplexASTMutationListener::AddedCXXTemplateSpecialization( 158218887Sdim const ClassTemplateDecl *TD, const ClassTemplateSpecializationDecl *D) { 159218887Sdim for (size_t i = 0, e = Listeners.size(); i != e; ++i) 160218887Sdim Listeners[i]->AddedCXXTemplateSpecialization(TD, D); 161218887Sdim} 162221345Sdimvoid MultiplexASTMutationListener::AddedCXXTemplateSpecialization( 163261991Sdim const VarTemplateDecl *TD, const VarTemplateSpecializationDecl *D) { 164261991Sdim for (size_t i = 0, e = Listeners.size(); i != e; ++i) 165261991Sdim Listeners[i]->AddedCXXTemplateSpecialization(TD, D); 166261991Sdim} 167261991Sdimvoid MultiplexASTMutationListener::AddedCXXTemplateSpecialization( 168221345Sdim const FunctionTemplateDecl *TD, const FunctionDecl *D) { 169221345Sdim for (size_t i = 0, e = Listeners.size(); i != e; ++i) 170221345Sdim Listeners[i]->AddedCXXTemplateSpecialization(TD, D); 171221345Sdim} 172288943Sdimvoid MultiplexASTMutationListener::ResolvedExceptionSpec( 173288943Sdim const FunctionDecl *FD) { 174288943Sdim for (auto &Listener : Listeners) 175288943Sdim Listener->ResolvedExceptionSpec(FD); 176288943Sdim} 177261991Sdimvoid MultiplexASTMutationListener::DeducedReturnType(const FunctionDecl *FD, 178261991Sdim QualType ReturnType) { 179261991Sdim for (size_t i = 0, e = Listeners.size(); i != e; ++i) 180261991Sdim Listeners[i]->DeducedReturnType(FD, ReturnType); 181261991Sdim} 182288943Sdimvoid MultiplexASTMutationListener::ResolvedOperatorDelete( 183288943Sdim const CXXDestructorDecl *DD, const FunctionDecl *Delete) { 184288943Sdim for (auto *L : Listeners) 185288943Sdim L->ResolvedOperatorDelete(DD, Delete); 186288943Sdim} 187221345Sdimvoid MultiplexASTMutationListener::CompletedImplicitDefinition( 188221345Sdim const FunctionDecl *D) { 189221345Sdim for (size_t i = 0, e = Listeners.size(); i != e; ++i) 190221345Sdim Listeners[i]->CompletedImplicitDefinition(D); 191221345Sdim} 192221345Sdimvoid MultiplexASTMutationListener::StaticDataMemberInstantiated( 193221345Sdim const VarDecl *D) { 194221345Sdim for (size_t i = 0, e = Listeners.size(); i != e; ++i) 195221345Sdim Listeners[i]->StaticDataMemberInstantiated(D); 196221345Sdim} 197296417Sdimvoid MultiplexASTMutationListener::DefaultArgumentInstantiated( 198296417Sdim const ParmVarDecl *D) { 199296417Sdim for (size_t i = 0, e = Listeners.size(); i != e; ++i) 200296417Sdim Listeners[i]->DefaultArgumentInstantiated(D); 201296417Sdim} 202234353Sdimvoid MultiplexASTMutationListener::AddedObjCCategoryToInterface( 203234353Sdim const ObjCCategoryDecl *CatD, 204234353Sdim const ObjCInterfaceDecl *IFD) { 205234353Sdim for (size_t i = 0, e = Listeners.size(); i != e; ++i) 206234353Sdim Listeners[i]->AddedObjCCategoryToInterface(CatD, IFD); 207234353Sdim} 208288943Sdimvoid MultiplexASTMutationListener::FunctionDefinitionInstantiated( 209288943Sdim const FunctionDecl *D) { 210288943Sdim for (auto &Listener : Listeners) 211288943Sdim Listener->FunctionDefinitionInstantiated(D); 212288943Sdim} 213261991Sdimvoid MultiplexASTMutationListener::DeclarationMarkedUsed(const Decl *D) { 214261991Sdim for (size_t i = 0, e = Listeners.size(); i != e; ++i) 215261991Sdim Listeners[i]->DeclarationMarkedUsed(D); 216261991Sdim} 217280031Sdimvoid MultiplexASTMutationListener::DeclarationMarkedOpenMPThreadPrivate( 218280031Sdim const Decl *D) { 219280031Sdim for (size_t i = 0, e = Listeners.size(); i != e; ++i) 220280031Sdim Listeners[i]->DeclarationMarkedOpenMPThreadPrivate(D); 221280031Sdim} 222288943Sdimvoid MultiplexASTMutationListener::RedefinedHiddenDefinition(const NamedDecl *D, 223288943Sdim Module *M) { 224288943Sdim for (auto *L : Listeners) 225288943Sdim L->RedefinedHiddenDefinition(D, M); 226288943Sdim} 227288943Sdim 228288943Sdimvoid MultiplexASTMutationListener::AddedAttributeToRecord( 229288943Sdim const Attr *Attr, 230288943Sdim const RecordDecl *Record) { 231288943Sdim for (auto *L : Listeners) 232288943Sdim L->AddedAttributeToRecord(Attr, Record); 233288943Sdim} 234218887Sdim 235218887Sdim} // end namespace clang 236218887Sdim 237280031SdimMultiplexConsumer::MultiplexConsumer( 238280031Sdim std::vector<std::unique_ptr<ASTConsumer>> C) 239280031Sdim : Consumers(std::move(C)), MutationListener(), DeserializationListener() { 240218887Sdim // Collect the mutation listeners and deserialization listeners of all 241218887Sdim // children, and create a multiplex listener each if so. 242218887Sdim std::vector<ASTMutationListener*> mutationListeners; 243218887Sdim std::vector<ASTDeserializationListener*> serializationListeners; 244280031Sdim for (auto &Consumer : Consumers) { 245280031Sdim if (auto *mutationListener = Consumer->GetASTMutationListener()) 246218887Sdim mutationListeners.push_back(mutationListener); 247280031Sdim if (auto *serializationListener = Consumer->GetASTDeserializationListener()) 248218887Sdim serializationListeners.push_back(serializationListener); 249218887Sdim } 250280031Sdim if (!mutationListeners.empty()) { 251280031Sdim MutationListener = 252280031Sdim llvm::make_unique<MultiplexASTMutationListener>(mutationListeners); 253218887Sdim } 254280031Sdim if (!serializationListeners.empty()) { 255280031Sdim DeserializationListener = 256280031Sdim llvm::make_unique<MultiplexASTDeserializationListener>( 257280031Sdim serializationListeners); 258218887Sdim } 259218887Sdim} 260218887Sdim 261280031SdimMultiplexConsumer::~MultiplexConsumer() {} 262218887Sdim 263218887Sdimvoid MultiplexConsumer::Initialize(ASTContext &Context) { 264280031Sdim for (auto &Consumer : Consumers) 265280031Sdim Consumer->Initialize(Context); 266218887Sdim} 267218887Sdim 268234353Sdimbool MultiplexConsumer::HandleTopLevelDecl(DeclGroupRef D) { 269234353Sdim bool Continue = true; 270280031Sdim for (auto &Consumer : Consumers) 271280031Sdim Continue = Continue && Consumer->HandleTopLevelDecl(D); 272234353Sdim return Continue; 273218887Sdim} 274218887Sdim 275276479Sdimvoid MultiplexConsumer::HandleInlineMethodDefinition(CXXMethodDecl *D) { 276280031Sdim for (auto &Consumer : Consumers) 277280031Sdim Consumer->HandleInlineMethodDefinition(D); 278276479Sdim} 279276479Sdim 280280031Sdimvoid MultiplexConsumer::HandleCXXStaticMemberVarInstantiation(VarDecl *VD) { 281280031Sdim for (auto &Consumer : Consumers) 282280031Sdim Consumer->HandleCXXStaticMemberVarInstantiation(VD); 283234353Sdim} 284234353Sdim 285218887Sdimvoid MultiplexConsumer::HandleInterestingDecl(DeclGroupRef D) { 286280031Sdim for (auto &Consumer : Consumers) 287280031Sdim Consumer->HandleInterestingDecl(D); 288218887Sdim} 289218887Sdim 290218887Sdimvoid MultiplexConsumer::HandleTranslationUnit(ASTContext &Ctx) { 291280031Sdim for (auto &Consumer : Consumers) 292280031Sdim Consumer->HandleTranslationUnit(Ctx); 293218887Sdim} 294218887Sdim 295218887Sdimvoid MultiplexConsumer::HandleTagDeclDefinition(TagDecl *D) { 296280031Sdim for (auto &Consumer : Consumers) 297280031Sdim Consumer->HandleTagDeclDefinition(D); 298218887Sdim} 299218887Sdim 300276479Sdimvoid MultiplexConsumer::HandleTagDeclRequiredDefinition(const TagDecl *D) { 301280031Sdim for (auto &Consumer : Consumers) 302280031Sdim Consumer->HandleTagDeclRequiredDefinition(D); 303276479Sdim} 304276479Sdim 305234353Sdimvoid MultiplexConsumer::HandleCXXImplicitFunctionInstantiation(FunctionDecl *D){ 306280031Sdim for (auto &Consumer : Consumers) 307280031Sdim Consumer->HandleCXXImplicitFunctionInstantiation(D); 308234353Sdim} 309234353Sdim 310234353Sdimvoid MultiplexConsumer::HandleTopLevelDeclInObjCContainer(DeclGroupRef D) { 311280031Sdim for (auto &Consumer : Consumers) 312280031Sdim Consumer->HandleTopLevelDeclInObjCContainer(D); 313234353Sdim} 314234353Sdim 315276479Sdimvoid MultiplexConsumer::HandleImplicitImportDecl(ImportDecl *D) { 316280031Sdim for (auto &Consumer : Consumers) 317280031Sdim Consumer->HandleImplicitImportDecl(D); 318276479Sdim} 319276479Sdim 320276479Sdimvoid MultiplexConsumer::HandleLinkerOptionPragma(llvm::StringRef Opts) { 321280031Sdim for (auto &Consumer : Consumers) 322280031Sdim Consumer->HandleLinkerOptionPragma(Opts); 323276479Sdim} 324276479Sdim 325276479Sdimvoid MultiplexConsumer::HandleDetectMismatch(llvm::StringRef Name, llvm::StringRef Value) { 326280031Sdim for (auto &Consumer : Consumers) 327280031Sdim Consumer->HandleDetectMismatch(Name, Value); 328276479Sdim} 329276479Sdim 330276479Sdimvoid MultiplexConsumer::HandleDependentLibrary(llvm::StringRef Lib) { 331280031Sdim for (auto &Consumer : Consumers) 332280031Sdim Consumer->HandleDependentLibrary(Lib); 333276479Sdim} 334276479Sdim 335218887Sdimvoid MultiplexConsumer::CompleteTentativeDefinition(VarDecl *D) { 336280031Sdim for (auto &Consumer : Consumers) 337280031Sdim Consumer->CompleteTentativeDefinition(D); 338218887Sdim} 339218887Sdim 340288943Sdimvoid MultiplexConsumer::HandleVTable(CXXRecordDecl *RD) { 341280031Sdim for (auto &Consumer : Consumers) 342288943Sdim Consumer->HandleVTable(RD); 343218887Sdim} 344218887Sdim 345218887SdimASTMutationListener *MultiplexConsumer::GetASTMutationListener() { 346218887Sdim return MutationListener.get(); 347218887Sdim} 348218887Sdim 349218887SdimASTDeserializationListener *MultiplexConsumer::GetASTDeserializationListener() { 350218887Sdim return DeserializationListener.get(); 351218887Sdim} 352218887Sdim 353218887Sdimvoid MultiplexConsumer::PrintStats() { 354280031Sdim for (auto &Consumer : Consumers) 355280031Sdim Consumer->PrintStats(); 356218887Sdim} 357218887Sdim 358218887Sdimvoid MultiplexConsumer::InitializeSema(Sema &S) { 359280031Sdim for (auto &Consumer : Consumers) 360280031Sdim if (SemaConsumer *SC = dyn_cast<SemaConsumer>(Consumer.get())) 361218887Sdim SC->InitializeSema(S); 362218887Sdim} 363218887Sdim 364218887Sdimvoid MultiplexConsumer::ForgetSema() { 365280031Sdim for (auto &Consumer : Consumers) 366280031Sdim if (SemaConsumer *SC = dyn_cast<SemaConsumer>(Consumer.get())) 367218887Sdim SC->ForgetSema(); 368218887Sdim} 369