diff --git a/include/clang/AST/ASTContext.h b/include/clang/AST/ASTContext.h index 2152390f7a6e0497214ff244d4fa20d9b5537d06..6ed7c0804b12add8d68a547431ba32d3efeee8f7 100644 --- a/include/clang/AST/ASTContext.h +++ b/include/clang/AST/ASTContext.h @@ -416,7 +416,7 @@ public: SelectorTable &Selectors; Builtin::Context &BuiltinInfo; mutable DeclarationNameTable DeclarationNames; - OwningPtr<ExternalASTSource> ExternalSource; + IntrusiveRefCntPtr<ExternalASTSource> ExternalSource; ASTMutationListener *Listener; /// \brief Contains parents of a node. @@ -811,11 +811,13 @@ public: /// The external AST source provides the ability to load parts of /// the abstract syntax tree as needed from some external storage, /// e.g., a precompiled header. - void setExternalSource(OwningPtr<ExternalASTSource> &Source); + void setExternalSource(IntrusiveRefCntPtr<ExternalASTSource> Source); /// \brief Retrieve a pointer to the external AST source associated /// with this AST context, if any. - ExternalASTSource *getExternalSource() const { return ExternalSource.get(); } + ExternalASTSource *getExternalSource() const { + return ExternalSource.getPtr(); + } /// \brief Attach an AST mutation listener to the AST context. /// diff --git a/include/clang/AST/ExternalASTSource.h b/include/clang/AST/ExternalASTSource.h index b077426e6a479d865ca48288ef3d194b9739406f..54e96d99bc907fffd05d53c5ecc2b67eb2e34ccd 100644 --- a/include/clang/AST/ExternalASTSource.h +++ b/include/clang/AST/ExternalASTSource.h @@ -53,7 +53,7 @@ enum ExternalLoadResult { /// sources can resolve types and declarations from abstract IDs into /// actual type and declaration nodes, and read parts of declaration /// contexts. -class ExternalASTSource { +class ExternalASTSource : public RefCountedBase<ExternalASTSource> { /// \brief Whether this AST source also provides information for /// semantic analysis. bool SemaSource; diff --git a/include/clang/Frontend/ASTUnit.h b/include/clang/Frontend/ASTUnit.h index 4a64b24b38e5a62bae374d7a69016a4ad35380d4..adc920a8c7693fcee501918fb9f775897a2a1714 100644 --- a/include/clang/Frontend/ASTUnit.h +++ b/include/clang/Frontend/ASTUnit.h @@ -75,7 +75,7 @@ private: IntrusiveRefCntPtr<ASTContext> Ctx; IntrusiveRefCntPtr<TargetOptions> TargetOpts; IntrusiveRefCntPtr<HeaderSearchOptions> HSOpts; - ASTReader *Reader; + IntrusiveRefCntPtr<ASTReader> Reader; bool HadModuleLoaderFatalFailure; struct ASTWriterData; diff --git a/include/clang/Frontend/ChainedIncludesSource.h b/include/clang/Frontend/ChainedIncludesSource.h index aa30460040a5ddab028c4138281eeabacd576bda..bc05c078a6349a51eb4836ed924528335b7682f7 100644 --- a/include/clang/Frontend/ChainedIncludesSource.h +++ b/include/clang/Frontend/ChainedIncludesSource.h @@ -24,13 +24,13 @@ class ChainedIncludesSource : public ExternalSemaSource { public: virtual ~ChainedIncludesSource(); - static ChainedIncludesSource *create(CompilerInstance &CI); + static IntrusiveRefCntPtr<ChainedIncludesSource> create(CompilerInstance &CI); ExternalSemaSource &getFinalReader() const { return *FinalReader; } private: std::vector<CompilerInstance *> CIs; - OwningPtr<ExternalSemaSource> FinalReader; + IntrusiveRefCntPtr<ExternalSemaSource> FinalReader; protected: diff --git a/include/clang/Frontend/CompilerInstance.h b/include/clang/Frontend/CompilerInstance.h index be1e1eaf3b2b880b6e48720be14686ef23adb24a..c8ffd326242a2a3ba184126d4252fb7eab7a7d89 100644 --- a/include/clang/Frontend/CompilerInstance.h +++ b/include/clang/Frontend/CompilerInstance.h @@ -102,8 +102,8 @@ class CompilerInstance : public ModuleLoader { /// \brief The frontend timer OwningPtr<llvm::Timer> FrontendTimer; - /// \brief Non-owning reference to the ASTReader, if one exists. - ASTReader *ModuleManager; + /// \brief The ASTReader, if one exists. + IntrusiveRefCntPtr<ASTReader> ModuleManager; /// \brief The set of top-level modules that has already been loaded, /// along with the module map @@ -454,8 +454,8 @@ public: /// @name Module Management /// { - ASTReader *getModuleManager() const { return ModuleManager; } - void setModuleManager(ASTReader *Reader) { ModuleManager = Reader; } + IntrusiveRefCntPtr<ASTReader> getModuleManager() const; + void setModuleManager(IntrusiveRefCntPtr<ASTReader> Reader); /// } /// @name Code Completion diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index 46d0451017b2e4fb869d9559314de3b8ccfff049..65bb024b2a93678da75f5d1f6676e9e60bf9f168 100644 --- a/lib/AST/ASTContext.cpp +++ b/lib/AST/ASTContext.cpp @@ -791,8 +791,8 @@ void ASTContext::AddDeallocation(void (*Callback)(void*), void *Data) { } void -ASTContext::setExternalSource(OwningPtr<ExternalASTSource> &Source) { - ExternalSource.reset(Source.take()); +ASTContext::setExternalSource(IntrusiveRefCntPtr<ExternalASTSource> Source) { + ExternalSource = Source; } void ASTContext::PrintStats() const { @@ -846,7 +846,7 @@ void ASTContext::PrintStats() const { << NumImplicitDestructors << " implicit destructors created\n"; - if (ExternalSource.get()) { + if (ExternalSource) { llvm::errs() << "\n"; ExternalSource->PrintStats(); } diff --git a/lib/Frontend/ASTUnit.cpp b/lib/Frontend/ASTUnit.cpp index 8d46a8f4a5db701644a98a3df66c004b6437fc8f..93429cba8870f566c692d064357ef08ea911d4e6 100644 --- a/lib/Frontend/ASTUnit.cpp +++ b/lib/Frontend/ASTUnit.cpp @@ -718,8 +718,6 @@ ASTUnit *ASTUnit::LoadFromASTFile(const std::string &Filename, HeaderSearch &HeaderInfo = *AST->HeaderInfo.get(); unsigned Counter; - OwningPtr<ASTReader> Reader; - AST->PP = new Preprocessor(PPOpts, AST->getDiagnostics(), AST->ASTFileLangOpts, /*Target=*/0, AST->getSourceManager(), HeaderInfo, @@ -742,21 +740,17 @@ ASTUnit *ASTUnit::LoadFromASTFile(const std::string &Filename, bool disableValid = false; if (::getenv("LIBCLANG_DISABLE_PCH_VALIDATION")) disableValid = true; - Reader.reset(new ASTReader(PP, Context, + AST->Reader = new ASTReader(PP, Context, /*isysroot=*/"", /*DisableValidation=*/disableValid, - AllowPCHWithCompilerErrors)); - - // Recover resources if we crash before exiting this method. - llvm::CrashRecoveryContextCleanupRegistrar<ASTReader> - ReaderCleanup(Reader.get()); + AllowPCHWithCompilerErrors); - Reader->setListener(new ASTInfoCollector(*AST->PP, Context, + AST->Reader->setListener(new ASTInfoCollector(*AST->PP, Context, AST->ASTFileLangOpts, AST->TargetOpts, AST->Target, Counter)); - switch (Reader->ReadAST(Filename, serialization::MK_MainFile, + switch (AST->Reader->ReadAST(Filename, serialization::MK_MainFile, SourceLocation(), ASTReader::ARR_None)) { case ASTReader::Success: break; @@ -771,21 +765,14 @@ ASTUnit *ASTUnit::LoadFromASTFile(const std::string &Filename, return NULL; } - AST->OriginalSourceFile = Reader->getOriginalSourceFile(); + AST->OriginalSourceFile = AST->Reader->getOriginalSourceFile(); PP.setCounterValue(Counter); // Attach the AST reader to the AST context as an external AST // source, so that declarations will be deserialized from the // AST file as needed. - ASTReader *ReaderPtr = Reader.get(); - OwningPtr<ExternalASTSource> Source(Reader.take()); - - // Unregister the cleanup for ASTReader. It will get cleaned up - // by the ASTUnit cleanup. - ReaderCleanup.unregister(); - - Context.setExternalSource(Source); + Context.setExternalSource(AST->Reader); // Create an AST consumer, even though it isn't used. AST->Consumer.reset(new ASTConsumer); @@ -793,8 +780,7 @@ ASTUnit *ASTUnit::LoadFromASTFile(const std::string &Filename, // Create a semantic analysis object and tell the AST reader about it. AST->TheSema.reset(new Sema(PP, Context, *AST->Consumer)); AST->TheSema->Initialize(); - ReaderPtr->InitializeSema(*AST->TheSema); - AST->Reader = ReaderPtr; + AST->Reader->InitializeSema(*AST->TheSema); // Tell the diagnostic client that we have started a source file. AST->getDiagnostics().getClient()->BeginSourceFile(Context.getLangOpts(),&PP); @@ -1173,7 +1159,7 @@ bool ASTUnit::Parse(llvm::MemoryBuffer *OverrideMainBuffer) { if (OverrideMainBuffer) { std::string ModName = getPreambleFile(this); - TranslateStoredDiagnostics(Clang->getModuleManager(), ModName, + TranslateStoredDiagnostics(Clang->getModuleManager().getPtr(), ModName, getSourceManager(), PreambleDiagnostics, StoredDiagnostics); } diff --git a/lib/Frontend/ChainedIncludesSource.cpp b/lib/Frontend/ChainedIncludesSource.cpp index 442177ec3197df6024743a17b237039f43892e6b..ab5c81fb588ee4b67f0b9fdee385b0c97c9097e5 100644 --- a/lib/Frontend/ChainedIncludesSource.cpp +++ b/lib/Frontend/ChainedIncludesSource.cpp @@ -62,12 +62,13 @@ ChainedIncludesSource::~ChainedIncludesSource() { delete CIs[i]; } -ChainedIncludesSource *ChainedIncludesSource::create(CompilerInstance &CI) { +IntrusiveRefCntPtr<ChainedIncludesSource> +ChainedIncludesSource::create(CompilerInstance &CI) { std::vector<std::string> &includes = CI.getPreprocessorOpts().ChainedIncludes; assert(!includes.empty() && "No '-chain-include' in options!"); - OwningPtr<ChainedIncludesSource> source(new ChainedIncludesSource()); + IntrusiveRefCntPtr<ChainedIncludesSource> source(new ChainedIncludesSource()); InputKind IK = CI.getFrontendOpts().Inputs[0].getKind(); SmallVector<llvm::MemoryBuffer *, 4> serialBufs; @@ -137,13 +138,12 @@ ChainedIncludesSource *ChainedIncludesSource::create(CompilerInstance &CI) { serialBufNames.push_back(pchName); - OwningPtr<ExternalASTSource> Reader; - - Reader.reset(createASTReader(*Clang, pchName, bufs, serialBufNames, - Clang->getASTConsumer().GetASTDeserializationListener())); + IntrusiveRefCntPtr<ASTReader> Reader; + Reader = createASTReader(*Clang, pchName, bufs, serialBufNames, + Clang->getASTConsumer().GetASTDeserializationListener()); if (!Reader) return 0; - Clang->setModuleManager(static_cast<ASTReader*>(Reader.get())); + Clang->setModuleManager(Reader); Clang->getASTContext().setExternalSource(Reader); } @@ -162,13 +162,13 @@ ChainedIncludesSource *ChainedIncludesSource::create(CompilerInstance &CI) { assert(!serialBufs.empty()); std::string pchName = includes.back() + ".pch-final"; serialBufNames.push_back(pchName); - OwningPtr<ASTReader> Reader; - Reader.reset(createASTReader(CI, pchName, serialBufs, serialBufNames)); + IntrusiveRefCntPtr<ASTReader> Reader; + Reader = createASTReader(CI, pchName, serialBufs, serialBufNames); if (!Reader) return 0; - source->FinalReader.reset(Reader.take()); - return source.take(); + source->FinalReader = Reader; + return source; } //===----------------------------------------------------------------------===// diff --git a/lib/Frontend/CompilerInstance.cpp b/lib/Frontend/CompilerInstance.cpp index 3fe8f0e82f7df6e1333f2b7aaf0027ee253b95a7..cdc4b64af77376bac69d2bb72ad177e3969a77b3 100644 --- a/lib/Frontend/CompilerInstance.cpp +++ b/lib/Frontend/CompilerInstance.cpp @@ -104,6 +104,13 @@ void CompilerInstance::setASTConsumer(ASTConsumer *Value) { void CompilerInstance::setCodeCompletionConsumer(CodeCompleteConsumer *Value) { CompletionConsumer.reset(Value); } + +IntrusiveRefCntPtr<ASTReader> CompilerInstance::getModuleManager() const { + return ModuleManager; +} +void CompilerInstance::setModuleManager(IntrusiveRefCntPtr<ASTReader> Reader) { + ModuleManager = Reader; +} // Diagnostics static void SetUpDiagnosticLog(DiagnosticOptions *DiagOpts, @@ -301,16 +308,16 @@ void CompilerInstance::createPCHExternalASTSource(StringRef Path, bool DisablePCHValidation, bool AllowPCHWithCompilerErrors, void *DeserializationListener){ - OwningPtr<ExternalASTSource> Source; + IntrusiveRefCntPtr<ExternalASTSource> Source; bool Preamble = getPreprocessorOpts().PrecompiledPreambleBytes.first != 0; - Source.reset(createPCHExternalASTSource(Path, getHeaderSearchOpts().Sysroot, + Source = createPCHExternalASTSource(Path, getHeaderSearchOpts().Sysroot, DisablePCHValidation, AllowPCHWithCompilerErrors, getPreprocessor(), getASTContext(), DeserializationListener, Preamble, - getFrontendOpts().UseGlobalModuleIndex)); - ModuleManager = static_cast<ASTReader*>(Source.get()); + getFrontendOpts().UseGlobalModuleIndex); + ModuleManager = static_cast<ASTReader*>(Source.getPtr()); getASTContext().setExternalSource(Source); } @@ -1176,9 +1183,7 @@ CompilerInstance::loadModule(SourceLocation ImportLoc, getASTContext().setASTMutationListener( getASTConsumer().GetASTMutationListener()); } - OwningPtr<ExternalASTSource> Source; - Source.reset(ModuleManager); - getASTContext().setExternalSource(Source); + getASTContext().setExternalSource(ModuleManager); if (hasSema()) ModuleManager->InitializeSema(getSema()); if (hasASTConsumer()) diff --git a/lib/Frontend/FrontendAction.cpp b/lib/Frontend/FrontendAction.cpp index 6cfa12168dbf44f823b6ce2a4cb0ef91d938ff2f..f028a56053da31b72a559172195aa0b9993dcd50 100644 --- a/lib/Frontend/FrontendAction.cpp +++ b/lib/Frontend/FrontendAction.cpp @@ -316,12 +316,11 @@ bool FrontendAction::BeginSourceFile(CompilerInstance &CI, if (!CI.getPreprocessorOpts().ChainedIncludes.empty()) { // Convert headers to PCH and chain them. - OwningPtr<ExternalASTSource> source; - source.reset(ChainedIncludesSource::create(CI)); + IntrusiveRefCntPtr<ChainedIncludesSource> source; + source = ChainedIncludesSource::create(CI); if (!source) goto failure; - CI.setModuleManager(static_cast<ASTReader*>( - &static_cast<ChainedIncludesSource*>(source.get())->getFinalReader())); + CI.setModuleManager(static_cast<ASTReader*>(&source->getFinalReader())); CI.getASTContext().setExternalSource(source); } else if (!CI.getPreprocessorOpts().ImplicitPCHInclude.empty()) { @@ -361,7 +360,7 @@ bool FrontendAction::BeginSourceFile(CompilerInstance &CI, // provides the layouts from that file. if (!CI.getFrontendOpts().OverrideRecordLayoutsFile.empty() && CI.hasASTContext() && !CI.getASTContext().getExternalSource()) { - OwningPtr<ExternalASTSource> + IntrusiveRefCntPtr<ExternalASTSource> Override(new LayoutOverrideSource( CI.getFrontendOpts().OverrideRecordLayoutsFile)); CI.getASTContext().setExternalSource(Override);