1 //===- MultiplexConsumer.cpp - AST Consumer for PCH Generation --*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file defines the MultiplexConsumer class. It also declares and defines 11 // MultiplexASTDeserializationListener and MultiplexASTMutationListener, which 12 // are implementation details of MultiplexConsumer. 13 // 14 //===----------------------------------------------------------------------===// 15 16 #include "clang/Frontend/MultiplexConsumer.h" 17 #include "clang/AST/ASTMutationListener.h" 18 #include "clang/AST/DeclGroup.h" 19 #include "clang/Serialization/ASTDeserializationListener.h" 20 21 using namespace clang; 22 23 namespace clang { 24 25 // This ASTDeserializationListener forwards its notifications to a set of 26 // child listeners. 27 class MultiplexASTDeserializationListener 28 : public ASTDeserializationListener { 29 public: 30 // Does NOT take ownership of the elements in L. 31 MultiplexASTDeserializationListener( 32 const std::vector<ASTDeserializationListener*>& L); 33 void ReaderInitialized(ASTReader *Reader) override; 34 void IdentifierRead(serialization::IdentID ID, 35 IdentifierInfo *II) override; 36 void MacroRead(serialization::MacroID ID, MacroInfo *MI) override; 37 void TypeRead(serialization::TypeIdx Idx, QualType T) override; 38 void DeclRead(serialization::DeclID ID, const Decl *D) override; 39 void SelectorRead(serialization::SelectorID iD, Selector Sel) override; 40 void MacroDefinitionRead(serialization::PreprocessedEntityID, 41 MacroDefinitionRecord *MD) override; 42 void ModuleRead(serialization::SubmoduleID ID, Module *Mod) override; 43 44 private: 45 std::vector<ASTDeserializationListener *> Listeners; 46 }; 47 48 MultiplexASTDeserializationListener::MultiplexASTDeserializationListener( 49 const std::vector<ASTDeserializationListener*>& L) 50 : Listeners(L) { 51 } 52 53 void MultiplexASTDeserializationListener::ReaderInitialized( 54 ASTReader *Reader) { 55 for (size_t i = 0, e = Listeners.size(); i != e; ++i) 56 Listeners[i]->ReaderInitialized(Reader); 57 } 58 59 void MultiplexASTDeserializationListener::IdentifierRead( 60 serialization::IdentID ID, IdentifierInfo *II) { 61 for (size_t i = 0, e = Listeners.size(); i != e; ++i) 62 Listeners[i]->IdentifierRead(ID, II); 63 } 64 65 void MultiplexASTDeserializationListener::MacroRead( 66 serialization::MacroID ID, MacroInfo *MI) { 67 for (auto &Listener : Listeners) 68 Listener->MacroRead(ID, MI); 69 } 70 71 void MultiplexASTDeserializationListener::TypeRead( 72 serialization::TypeIdx Idx, QualType T) { 73 for (size_t i = 0, e = Listeners.size(); i != e; ++i) 74 Listeners[i]->TypeRead(Idx, T); 75 } 76 77 void MultiplexASTDeserializationListener::DeclRead( 78 serialization::DeclID ID, const Decl *D) { 79 for (size_t i = 0, e = Listeners.size(); i != e; ++i) 80 Listeners[i]->DeclRead(ID, D); 81 } 82 83 void MultiplexASTDeserializationListener::SelectorRead( 84 serialization::SelectorID ID, Selector Sel) { 85 for (size_t i = 0, e = Listeners.size(); i != e; ++i) 86 Listeners[i]->SelectorRead(ID, Sel); 87 } 88 89 void MultiplexASTDeserializationListener::MacroDefinitionRead( 90 serialization::PreprocessedEntityID ID, MacroDefinitionRecord *MD) { 91 for (size_t i = 0, e = Listeners.size(); i != e; ++i) 92 Listeners[i]->MacroDefinitionRead(ID, MD); 93 } 94 95 void MultiplexASTDeserializationListener::ModuleRead( 96 serialization::SubmoduleID ID, Module *Mod) { 97 for (auto &Listener : Listeners) 98 Listener->ModuleRead(ID, Mod); 99 } 100 101 // This ASTMutationListener forwards its notifications to a set of 102 // child listeners. 103 class MultiplexASTMutationListener : public ASTMutationListener { 104 public: 105 // Does NOT take ownership of the elements in L. 106 MultiplexASTMutationListener(ArrayRef<ASTMutationListener*> L); 107 void CompletedTagDefinition(const TagDecl *D) override; 108 void AddedVisibleDecl(const DeclContext *DC, const Decl *D) override; 109 void AddedCXXImplicitMember(const CXXRecordDecl *RD, const Decl *D) override; 110 void AddedCXXTemplateSpecialization(const ClassTemplateDecl *TD, 111 const ClassTemplateSpecializationDecl *D) override; 112 void AddedCXXTemplateSpecialization(const VarTemplateDecl *TD, 113 const VarTemplateSpecializationDecl *D) override; 114 void AddedCXXTemplateSpecialization(const FunctionTemplateDecl *TD, 115 const FunctionDecl *D) override; 116 void ResolvedExceptionSpec(const FunctionDecl *FD) override; 117 void DeducedReturnType(const FunctionDecl *FD, QualType ReturnType) override; 118 void ResolvedOperatorDelete(const CXXDestructorDecl *DD, 119 const FunctionDecl *Delete, 120 Expr *ThisArg) override; 121 void CompletedImplicitDefinition(const FunctionDecl *D) override; 122 void InstantiationRequested(const ValueDecl *D) override; 123 void VariableDefinitionInstantiated(const VarDecl *D) override; 124 void FunctionDefinitionInstantiated(const FunctionDecl *D) override; 125 void DefaultArgumentInstantiated(const ParmVarDecl *D) override; 126 void DefaultMemberInitializerInstantiated(const FieldDecl *D) override; 127 void AddedObjCCategoryToInterface(const ObjCCategoryDecl *CatD, 128 const ObjCInterfaceDecl *IFD) override; 129 void DeclarationMarkedUsed(const Decl *D) override; 130 void DeclarationMarkedOpenMPThreadPrivate(const Decl *D) override; 131 void DeclarationMarkedOpenMPDeclareTarget(const Decl *D, 132 const Attr *Attr) override; 133 void RedefinedHiddenDefinition(const NamedDecl *D, Module *M) override; 134 void AddedAttributeToRecord(const Attr *Attr, 135 const RecordDecl *Record) override; 136 137 private: 138 std::vector<ASTMutationListener*> Listeners; 139 }; 140 141 MultiplexASTMutationListener::MultiplexASTMutationListener( 142 ArrayRef<ASTMutationListener*> L) 143 : Listeners(L.begin(), L.end()) { 144 } 145 146 void MultiplexASTMutationListener::CompletedTagDefinition(const TagDecl *D) { 147 for (size_t i = 0, e = Listeners.size(); i != e; ++i) 148 Listeners[i]->CompletedTagDefinition(D); 149 } 150 151 void MultiplexASTMutationListener::AddedVisibleDecl( 152 const DeclContext *DC, const Decl *D) { 153 for (size_t i = 0, e = Listeners.size(); i != e; ++i) 154 Listeners[i]->AddedVisibleDecl(DC, D); 155 } 156 157 void MultiplexASTMutationListener::AddedCXXImplicitMember( 158 const CXXRecordDecl *RD, const Decl *D) { 159 for (size_t i = 0, e = Listeners.size(); i != e; ++i) 160 Listeners[i]->AddedCXXImplicitMember(RD, D); 161 } 162 void MultiplexASTMutationListener::AddedCXXTemplateSpecialization( 163 const ClassTemplateDecl *TD, const ClassTemplateSpecializationDecl *D) { 164 for (size_t i = 0, e = Listeners.size(); i != e; ++i) 165 Listeners[i]->AddedCXXTemplateSpecialization(TD, D); 166 } 167 void MultiplexASTMutationListener::AddedCXXTemplateSpecialization( 168 const VarTemplateDecl *TD, const VarTemplateSpecializationDecl *D) { 169 for (size_t i = 0, e = Listeners.size(); i != e; ++i) 170 Listeners[i]->AddedCXXTemplateSpecialization(TD, D); 171 } 172 void MultiplexASTMutationListener::AddedCXXTemplateSpecialization( 173 const FunctionTemplateDecl *TD, const FunctionDecl *D) { 174 for (size_t i = 0, e = Listeners.size(); i != e; ++i) 175 Listeners[i]->AddedCXXTemplateSpecialization(TD, D); 176 } 177 void MultiplexASTMutationListener::ResolvedExceptionSpec( 178 const FunctionDecl *FD) { 179 for (auto &Listener : Listeners) 180 Listener->ResolvedExceptionSpec(FD); 181 } 182 void MultiplexASTMutationListener::DeducedReturnType(const FunctionDecl *FD, 183 QualType ReturnType) { 184 for (size_t i = 0, e = Listeners.size(); i != e; ++i) 185 Listeners[i]->DeducedReturnType(FD, ReturnType); 186 } 187 void MultiplexASTMutationListener::ResolvedOperatorDelete( 188 const CXXDestructorDecl *DD, const FunctionDecl *Delete, Expr *ThisArg) { 189 for (auto *L : Listeners) 190 L->ResolvedOperatorDelete(DD, Delete, ThisArg); 191 } 192 void MultiplexASTMutationListener::CompletedImplicitDefinition( 193 const FunctionDecl *D) { 194 for (size_t i = 0, e = Listeners.size(); i != e; ++i) 195 Listeners[i]->CompletedImplicitDefinition(D); 196 } 197 void MultiplexASTMutationListener::InstantiationRequested(const ValueDecl *D) { 198 for (size_t i = 0, e = Listeners.size(); i != e; ++i) 199 Listeners[i]->InstantiationRequested(D); 200 } 201 void MultiplexASTMutationListener::VariableDefinitionInstantiated( 202 const VarDecl *D) { 203 for (size_t i = 0, e = Listeners.size(); i != e; ++i) 204 Listeners[i]->VariableDefinitionInstantiated(D); 205 } 206 void MultiplexASTMutationListener::FunctionDefinitionInstantiated( 207 const FunctionDecl *D) { 208 for (auto &Listener : Listeners) 209 Listener->FunctionDefinitionInstantiated(D); 210 } 211 void MultiplexASTMutationListener::DefaultArgumentInstantiated( 212 const ParmVarDecl *D) { 213 for (size_t i = 0, e = Listeners.size(); i != e; ++i) 214 Listeners[i]->DefaultArgumentInstantiated(D); 215 } 216 void MultiplexASTMutationListener::DefaultMemberInitializerInstantiated( 217 const FieldDecl *D) { 218 for (size_t i = 0, e = Listeners.size(); i != e; ++i) 219 Listeners[i]->DefaultMemberInitializerInstantiated(D); 220 } 221 void MultiplexASTMutationListener::AddedObjCCategoryToInterface( 222 const ObjCCategoryDecl *CatD, 223 const ObjCInterfaceDecl *IFD) { 224 for (size_t i = 0, e = Listeners.size(); i != e; ++i) 225 Listeners[i]->AddedObjCCategoryToInterface(CatD, IFD); 226 } 227 void MultiplexASTMutationListener::DeclarationMarkedUsed(const Decl *D) { 228 for (size_t i = 0, e = Listeners.size(); i != e; ++i) 229 Listeners[i]->DeclarationMarkedUsed(D); 230 } 231 void MultiplexASTMutationListener::DeclarationMarkedOpenMPThreadPrivate( 232 const Decl *D) { 233 for (size_t i = 0, e = Listeners.size(); i != e; ++i) 234 Listeners[i]->DeclarationMarkedOpenMPThreadPrivate(D); 235 } 236 void MultiplexASTMutationListener::DeclarationMarkedOpenMPDeclareTarget( 237 const Decl *D, const Attr *Attr) { 238 for (auto *L : Listeners) 239 L->DeclarationMarkedOpenMPDeclareTarget(D, Attr); 240 } 241 void MultiplexASTMutationListener::RedefinedHiddenDefinition(const NamedDecl *D, 242 Module *M) { 243 for (auto *L : Listeners) 244 L->RedefinedHiddenDefinition(D, M); 245 } 246 247 void MultiplexASTMutationListener::AddedAttributeToRecord( 248 const Attr *Attr, 249 const RecordDecl *Record) { 250 for (auto *L : Listeners) 251 L->AddedAttributeToRecord(Attr, Record); 252 } 253 254 } // end namespace clang 255 256 MultiplexConsumer::MultiplexConsumer( 257 std::vector<std::unique_ptr<ASTConsumer>> C) 258 : Consumers(std::move(C)), MutationListener(), DeserializationListener() { 259 // Collect the mutation listeners and deserialization listeners of all 260 // children, and create a multiplex listener each if so. 261 std::vector<ASTMutationListener*> mutationListeners; 262 std::vector<ASTDeserializationListener*> serializationListeners; 263 for (auto &Consumer : Consumers) { 264 if (auto *mutationListener = Consumer->GetASTMutationListener()) 265 mutationListeners.push_back(mutationListener); 266 if (auto *serializationListener = Consumer->GetASTDeserializationListener()) 267 serializationListeners.push_back(serializationListener); 268 } 269 if (!mutationListeners.empty()) { 270 MutationListener = 271 llvm::make_unique<MultiplexASTMutationListener>(mutationListeners); 272 } 273 if (!serializationListeners.empty()) { 274 DeserializationListener = 275 llvm::make_unique<MultiplexASTDeserializationListener>( 276 serializationListeners); 277 } 278 } 279 280 MultiplexConsumer::~MultiplexConsumer() {} 281 282 void MultiplexConsumer::Initialize(ASTContext &Context) { 283 for (auto &Consumer : Consumers) 284 Consumer->Initialize(Context); 285 } 286 287 bool MultiplexConsumer::HandleTopLevelDecl(DeclGroupRef D) { 288 bool Continue = true; 289 for (auto &Consumer : Consumers) 290 Continue = Continue && Consumer->HandleTopLevelDecl(D); 291 return Continue; 292 } 293 294 void MultiplexConsumer::HandleInlineFunctionDefinition(FunctionDecl *D) { 295 for (auto &Consumer : Consumers) 296 Consumer->HandleInlineFunctionDefinition(D); 297 } 298 299 void MultiplexConsumer::HandleCXXStaticMemberVarInstantiation(VarDecl *VD) { 300 for (auto &Consumer : Consumers) 301 Consumer->HandleCXXStaticMemberVarInstantiation(VD); 302 } 303 304 void MultiplexConsumer::HandleInterestingDecl(DeclGroupRef D) { 305 for (auto &Consumer : Consumers) 306 Consumer->HandleInterestingDecl(D); 307 } 308 309 void MultiplexConsumer::HandleTranslationUnit(ASTContext &Ctx) { 310 for (auto &Consumer : Consumers) 311 Consumer->HandleTranslationUnit(Ctx); 312 } 313 314 void MultiplexConsumer::HandleTagDeclDefinition(TagDecl *D) { 315 for (auto &Consumer : Consumers) 316 Consumer->HandleTagDeclDefinition(D); 317 } 318 319 void MultiplexConsumer::HandleTagDeclRequiredDefinition(const TagDecl *D) { 320 for (auto &Consumer : Consumers) 321 Consumer->HandleTagDeclRequiredDefinition(D); 322 } 323 324 void MultiplexConsumer::HandleCXXImplicitFunctionInstantiation(FunctionDecl *D){ 325 for (auto &Consumer : Consumers) 326 Consumer->HandleCXXImplicitFunctionInstantiation(D); 327 } 328 329 void MultiplexConsumer::HandleTopLevelDeclInObjCContainer(DeclGroupRef D) { 330 for (auto &Consumer : Consumers) 331 Consumer->HandleTopLevelDeclInObjCContainer(D); 332 } 333 334 void MultiplexConsumer::HandleImplicitImportDecl(ImportDecl *D) { 335 for (auto &Consumer : Consumers) 336 Consumer->HandleImplicitImportDecl(D); 337 } 338 339 void MultiplexConsumer::CompleteTentativeDefinition(VarDecl *D) { 340 for (auto &Consumer : Consumers) 341 Consumer->CompleteTentativeDefinition(D); 342 } 343 344 void MultiplexConsumer::AssignInheritanceModel(CXXRecordDecl *RD) { 345 for (auto &Consumer : Consumers) 346 Consumer->AssignInheritanceModel(RD); 347 } 348 349 void MultiplexConsumer::HandleVTable(CXXRecordDecl *RD) { 350 for (auto &Consumer : Consumers) 351 Consumer->HandleVTable(RD); 352 } 353 354 ASTMutationListener *MultiplexConsumer::GetASTMutationListener() { 355 return MutationListener.get(); 356 } 357 358 ASTDeserializationListener *MultiplexConsumer::GetASTDeserializationListener() { 359 return DeserializationListener.get(); 360 } 361 362 void MultiplexConsumer::PrintStats() { 363 for (auto &Consumer : Consumers) 364 Consumer->PrintStats(); 365 } 366 367 bool MultiplexConsumer::shouldSkipFunctionBody(Decl *D) { 368 bool Skip = true; 369 for (auto &Consumer : Consumers) 370 Skip = Skip && Consumer->shouldSkipFunctionBody(D); 371 return Skip; 372 } 373 374 void MultiplexConsumer::InitializeSema(Sema &S) { 375 for (auto &Consumer : Consumers) 376 if (SemaConsumer *SC = dyn_cast<SemaConsumer>(Consumer.get())) 377 SC->InitializeSema(S); 378 } 379 380 void MultiplexConsumer::ForgetSema() { 381 for (auto &Consumer : Consumers) 382 if (SemaConsumer *SC = dyn_cast<SemaConsumer>(Consumer.get())) 383 SC->ForgetSema(); 384 } 385