void FunctionDecl::Destroy(ASTContext& C) { if (Body && Body.isOffset()) Body.get(C.getExternalSource())->Destroy(C); for (param_iterator I=param_begin(), E=param_end(); I!=E; ++I) (*I)->Destroy(C); C.Deallocate(ParamInfo); Decl::Destroy(C); }
/// ParseAST - Parse the entire file specified, notifying the ASTConsumer as /// the file is parsed. This inserts the parsed decls into the translation unit /// held by Ctx. /// void clang::ParseAST(Preprocessor &PP, ASTConsumer *Consumer, ASTContext &Ctx, bool PrintStats, bool CompleteTranslationUnit) { // Collect global stats on Decls/Stmts (until we have a module streamer). if (PrintStats) { Decl::CollectingStats(true); Stmt::CollectingStats(true); } Sema S(PP, Ctx, *Consumer, CompleteTranslationUnit); Parser P(PP, S); PP.EnterMainSourceFile(); // Initialize the parser. P.Initialize(); Consumer->Initialize(Ctx); if (SemaConsumer *SC = dyn_cast<SemaConsumer>(Consumer)) SC->InitializeSema(S); if (ExternalASTSource *External = Ctx.getExternalSource()) { if (ExternalSemaSource *ExternalSema = dyn_cast<ExternalSemaSource>(External)) ExternalSema->InitializeSema(S); External->StartTranslationUnit(Consumer); } Parser::DeclGroupPtrTy ADecl; while (!P.ParseTopLevelDecl(ADecl)) { // Not end of file. // If we got a null return and something *was* parsed, ignore it. This // is due to a top-level semicolon, an action override, or a parse error // skipping something. if (ADecl) Consumer->HandleTopLevelDecl(ADecl.getAsVal<DeclGroupRef>()); }; Consumer->HandleTranslationUnit(Ctx); if (PrintStats) { fprintf(stderr, "\nSTATISTICS:\n"); P.getActions().PrintStats(); Ctx.PrintStats(); Decl::PrintStats(); Stmt::PrintStats(); Consumer->PrintStats(); Decl::CollectingStats(false); Stmt::CollectingStats(false); } }
void StoredDeclsList::materializeDecls(ASTContext &Context) { if (isNull()) return; switch ((DataKind)(Data & 0x03)) { case DK_Decl: case DK_Decl_Vector: break; case DK_DeclID: { // Resolve this declaration ID to an actual declaration by // querying the external AST source. unsigned DeclID = Data >> 2; ExternalASTSource *Source = Context.getExternalSource(); assert(Source && "No external AST source available!"); Data = reinterpret_cast<uintptr_t>(Source->GetDecl(DeclID)); break; } case DK_ID_Vector: { // We have a vector of declaration IDs. Resolve all of them to // actual declarations. VectorTy &Vector = *getAsVector(); ExternalASTSource *Source = Context.getExternalSource(); assert(Source && "No external AST source available!"); for (unsigned I = 0, N = Vector.size(); I != N; ++I) Vector[I] = reinterpret_cast<uintptr_t>(Source->GetDecl(Vector[I])); Data = (Data & ~0x03) | DK_Decl_Vector; break; } } }
uint32_t ExternalASTSource::incrementGeneration(ASTContext &C) { uint32_t OldGeneration = CurrentGeneration; // Make sure the generation of the topmost external source for the context is // incremented. That might not be us. auto *P = C.getExternalSource(); if (P && P != this) CurrentGeneration = P->incrementGeneration(C); else { // FIXME: Only bump the generation counter if the current generation number // has been observed? if (!++CurrentGeneration) llvm::report_fatal_error("generation counter overflowed", false); } return OldGeneration; }
void FunctionDecl::Destroy(ASTContext& C) { if (Body && Body.isOffset()) Body.get(C.getExternalSource())->Destroy(C); for (param_iterator I=param_begin(), E=param_end(); I!=E; ++I) (*I)->Destroy(C); FunctionTemplateSpecializationInfo *FTSInfo = TemplateOrSpecialization.dyn_cast<FunctionTemplateSpecializationInfo*>(); if (FTSInfo) C.Deallocate(FTSInfo); MemberSpecializationInfo *MSInfo = TemplateOrSpecialization.dyn_cast<MemberSpecializationInfo*>(); if (MSInfo) C.Deallocate(MSInfo); C.Deallocate(ParamInfo); Decl::Destroy(C); }
/// ParseAST - Parse the entire file specified, notifying the ASTConsumer as /// the file is parsed. This inserts the parsed decls into the translation unit /// held by Ctx. /// void clang::ParseAST(Preprocessor &PP, ASTConsumer *Consumer, ASTContext &Ctx, bool PrintStats, bool CompleteTranslationUnit, CodeCompleteConsumer *CompletionConsumer) { // Collect global stats on Decls/Stmts (until we have a module streamer). if (PrintStats) { Decl::CollectingStats(true); Stmt::CollectingStats(true); } Sema S(PP, Ctx, *Consumer, CompleteTranslationUnit, CompletionConsumer); Parser P(PP, S); PP.EnterMainSourceFile(); // Initialize the parser. P.Initialize(); Consumer->Initialize(Ctx); if (SemaConsumer *SC = dyn_cast<SemaConsumer>(Consumer)) SC->InitializeSema(S); if (ExternalASTSource *External = Ctx.getExternalSource()) { if (ExternalSemaSource *ExternalSema = dyn_cast<ExternalSemaSource>(External)) ExternalSema->InitializeSema(S); External->StartTranslationUnit(Consumer); } Parser::DeclGroupPtrTy ADecl; while (!P.ParseTopLevelDecl(ADecl)) { // Not end of file. // If we got a null return and something *was* parsed, ignore it. This // is due to a top-level semicolon, an action override, or a parse error // skipping something. if (ADecl) Consumer->HandleTopLevelDecl(ADecl.getAsVal<DeclGroupRef>()); }; // Check for any pending objective-c implementation decl. while ((ADecl = P.FinishPendingObjCActions())) Consumer->HandleTopLevelDecl(ADecl.getAsVal<DeclGroupRef>()); // Process any TopLevelDecls generated by #pragma weak. for (llvm::SmallVector<Decl*,2>::iterator I = S.WeakTopLevelDecls().begin(), E = S.WeakTopLevelDecls().end(); I != E; ++I) Consumer->HandleTopLevelDecl(DeclGroupRef(*I)); // Dump record layouts, if requested. if (PP.getLangOptions().DumpRecordLayouts) DumpRecordLayouts(Ctx); Consumer->HandleTranslationUnit(Ctx); if (ExternalSemaSource *ESS = dyn_cast_or_null<ExternalSemaSource>(Ctx.getExternalSource())) ESS->ForgetSema(); if (SemaConsumer *SC = dyn_cast<SemaConsumer>(Consumer)) SC->ForgetSema(); if (PrintStats) { fprintf(stderr, "\nSTATISTICS:\n"); P.getActions().PrintStats(); Ctx.PrintStats(); Decl::PrintStats(); Stmt::PrintStats(); Consumer->PrintStats(); } }