From: Douglas Gregor Date: Mon, 5 Apr 2010 23:52:57 +0000 (+0000) Subject: Make Diagnostic reference-counted, which is simpler than juggling X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=28019772db70d4547be05a042eb950bc910f134f;p=clang Make Diagnostic reference-counted, which is simpler than juggling maybe-ownership vs. ownership. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@100498 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/Diagnostic.h b/include/clang/Basic/Diagnostic.h index 643868506d..57dd6967fc 100644 --- a/include/clang/Basic/Diagnostic.h +++ b/include/clang/Basic/Diagnostic.h @@ -15,6 +15,7 @@ #define LLVM_CLANG_DIAGNOSTIC_H #include "clang/Basic/SourceLocation.h" +#include "llvm/ADT/IntrusiveRefCntPtr.h" #include "llvm/ADT/StringRef.h" #include "llvm/Support/type_traits.h" #include @@ -150,7 +151,7 @@ public: /// problems and issues. It massages the diagnostics (e.g. handling things like /// "report warnings as errors" and passes them off to the DiagnosticClient for /// reporting to the user. -class Diagnostic { +class Diagnostic : public llvm::RefCountedBase { public: /// Level - The level of the diagnostic, after it has been through mapping. enum Level { diff --git a/include/clang/Frontend/ASTUnit.h b/include/clang/Frontend/ASTUnit.h index 7fc3bf9b1e..9252358f42 100644 --- a/include/clang/Frontend/ASTUnit.h +++ b/include/clang/Frontend/ASTUnit.h @@ -16,6 +16,7 @@ #include "clang/Lex/PreprocessingRecord.h" #include "clang/Basic/SourceManager.h" +#include "llvm/ADT/IntrusiveRefCntPtr.h" #include "llvm/ADT/OwningPtr.h" #include "clang/Basic/FileManager.h" #include "clang/Index/ASTLocation.h" @@ -52,7 +53,7 @@ public: typedef std::map > PreprocessedEntitiesByFileMap; private: - llvm::MaybeOwningPtr Diagnostics; + llvm::IntrusiveRefCntPtr Diagnostics; llvm::OwningPtr FileMgr; llvm::OwningPtr SourceMgr; llvm::OwningPtr HeaderInfo; @@ -214,7 +215,7 @@ public: /// /// \returns - The initialized ASTUnit or null if the PCH failed to load. static ASTUnit *LoadFromPCHFile(const std::string &Filename, - llvm::MaybeOwningPtr Diags, + llvm::IntrusiveRefCntPtr Diags, bool OnlyLocalDecls = false, RemappedFile *RemappedFiles = 0, unsigned NumRemappedFiles = 0, @@ -232,7 +233,7 @@ public: // FIXME: Move OnlyLocalDecls, UseBumpAllocator to setters on the ASTUnit, we // shouldn't need to specify them at construction time. static ASTUnit *LoadFromCompilerInvocation(CompilerInvocation *CI, - llvm::MaybeOwningPtr Diags, + llvm::IntrusiveRefCntPtr Diags, bool OnlyLocalDecls = false, bool CaptureDiagnostics = false); @@ -252,7 +253,7 @@ public: // shouldn't need to specify them at construction time. static ASTUnit *LoadFromCommandLine(const char **ArgBegin, const char **ArgEnd, - llvm::MaybeOwningPtr Diags, + llvm::IntrusiveRefCntPtr Diags, llvm::StringRef ResourceFilesPath, bool OnlyLocalDecls = false, RemappedFile *RemappedFiles = 0, @@ -260,24 +261,6 @@ public: bool CaptureDiagnostics = false); }; -/// \brief Return an potentially-owning pointer for the given diagnostic engine -/// that owns the pointer. -inline llvm::MaybeOwningPtr OwnedDiag(Diagnostic &Diags) { - return llvm::MaybeOwningPtr(&Diags, true); -} - -/// \brief Return a potentially-owning pointer for the given diagnostic engine -/// that does not own the pointer. -inline llvm::MaybeOwningPtr UnownedDiag(Diagnostic &Diags) { - return llvm::MaybeOwningPtr(&Diags, false); -} - -/// \brief Return an potentially-owning pointer that indicates that the -/// default diagnostic engine should be used. -inline llvm::MaybeOwningPtr DefaultDiag() { - return llvm::MaybeOwningPtr(); -} - } // namespace clang #endif diff --git a/include/clang/Frontend/CompilerInstance.h b/include/clang/Frontend/CompilerInstance.h index 3444b640f0..36720c9d14 100644 --- a/include/clang/Frontend/CompilerInstance.h +++ b/include/clang/Frontend/CompilerInstance.h @@ -11,6 +11,7 @@ #define LLVM_CLANG_FRONTEND_COMPILERINSTANCE_H_ #include "clang/Frontend/CompilerInvocation.h" +#include "llvm/ADT/IntrusiveRefCntPtr.h" #include "llvm/ADT/StringRef.h" #include "llvm/ADT/OwningPtr.h" #include @@ -63,7 +64,7 @@ class CompilerInstance { llvm::OwningPtr Invocation; /// The diagnostics engine instance. - llvm::OwningPtr Diagnostics; + llvm::IntrusiveRefCntPtr Diagnostics; /// The diagnostics client instance. llvm::OwningPtr DiagClient; @@ -255,10 +256,6 @@ public: return *Diagnostics; } - /// takeDiagnostics - Remove the current diagnostics engine and give ownership - /// to the caller. - Diagnostic *takeDiagnostics() { return Diagnostics.take(); } - /// setDiagnostics - Replace the current diagnostics engine; the compiler /// instance takes ownership of \arg Value. void setDiagnostics(Diagnostic *Value); @@ -469,8 +466,8 @@ public: /// must extend past that of the diagnostic engine. /// /// \return The new object on success, or null on failure. - static Diagnostic *createDiagnostics(const DiagnosticOptions &Opts, - int Argc, char **Argv); + static llvm::IntrusiveRefCntPtr + createDiagnostics(const DiagnosticOptions &Opts, int Argc, char **Argv); /// Create the file manager and replace any existing one with it. void createFileManager(); diff --git a/lib/Frontend/ASTMerge.cpp b/lib/Frontend/ASTMerge.cpp index 24658615a9..b0faf0ae86 100644 --- a/lib/Frontend/ASTMerge.cpp +++ b/lib/Frontend/ASTMerge.cpp @@ -12,6 +12,7 @@ #include "clang/AST/ASTContext.h" #include "clang/AST/ASTDiagnostic.h" #include "clang/AST/ASTImporter.h" +#include "clang/Basic/Diagnostic.h" using namespace clang; @@ -36,10 +37,9 @@ void ASTMergeAction::ExecuteAction() { CI.getASTContext().getLangOptions()); CI.getDiagnostics().SetArgToStringFn(&FormatASTNodeDiagnosticArgument, &CI.getASTContext()); + llvm::IntrusiveRefCntPtr Diags(&CI.getDiagnostics()); for (unsigned I = 0, N = ASTFiles.size(); I != N; ++I) { - ASTUnit *Unit = ASTUnit::LoadFromPCHFile(ASTFiles[I], - UnownedDiag(CI.getDiagnostics()), - false); + ASTUnit *Unit = ASTUnit::LoadFromPCHFile(ASTFiles[I], Diags, false); if (!Unit) continue; diff --git a/lib/Frontend/ASTUnit.cpp b/lib/Frontend/ASTUnit.cpp index 2a76d6f37b..427bd6a9b8 100644 --- a/lib/Frontend/ASTUnit.cpp +++ b/lib/Frontend/ASTUnit.cpp @@ -141,24 +141,22 @@ const std::string &ASTUnit::getPCHFileName() { } ASTUnit *ASTUnit::LoadFromPCHFile(const std::string &Filename, - llvm::MaybeOwningPtr Diags, + llvm::IntrusiveRefCntPtr Diags, bool OnlyLocalDecls, RemappedFile *RemappedFiles, unsigned NumRemappedFiles, bool CaptureDiagnostics) { llvm::OwningPtr AST(new ASTUnit(true)); - if (Diags.get()) - AST->Diagnostics = Diags; - else { + if (!Diags.getPtr()) { // No diagnostics engine was provided, so create our own diagnostics object // with the default options. DiagnosticOptions DiagOpts; - AST->Diagnostics.reset(CompilerInstance::createDiagnostics(DiagOpts, 0, 0), - true); + Diags = CompilerInstance::createDiagnostics(DiagOpts, 0, 0); } AST->OnlyLocalDecls = OnlyLocalDecls; + AST->Diagnostics = Diags; AST->FileMgr.reset(new FileManager); AST->SourceMgr.reset(new SourceManager(AST->getDiagnostics())); AST->HeaderInfo.reset(new HeaderSearch(AST->getFileManager())); @@ -290,7 +288,7 @@ public: } ASTUnit *ASTUnit::LoadFromCompilerInvocation(CompilerInvocation *CI, - llvm::MaybeOwningPtr Diags, + llvm::IntrusiveRefCntPtr Diags, bool OnlyLocalDecls, bool CaptureDiagnostics) { // Create the compiler instance to use for building the AST. @@ -298,16 +296,16 @@ ASTUnit *ASTUnit::LoadFromCompilerInvocation(CompilerInvocation *CI, llvm::OwningPtr AST; llvm::OwningPtr Act; - if (!Diags.get()) { + if (!Diags.getPtr()) { // No diagnostics engine was provided, so create our own diagnostics object // with the default options. DiagnosticOptions DiagOpts; - Diags.reset(CompilerInstance::createDiagnostics(DiagOpts, 0, 0), true); + Diags = CompilerInstance::createDiagnostics(DiagOpts, 0, 0); } Clang.setInvocation(CI); - Clang.setDiagnostics(Diags.get()); + Clang.setDiagnostics(Diags.getPtr()); Clang.setDiagnosticClient(Diags->getClient()); // Create the target instance. @@ -315,7 +313,6 @@ ASTUnit *ASTUnit::LoadFromCompilerInvocation(CompilerInvocation *CI, Clang.getTargetOpts())); if (!Clang.hasTarget()) { Clang.takeDiagnosticClient(); - Clang.takeDiagnostics(); return 0; } @@ -370,7 +367,6 @@ ASTUnit *ASTUnit::LoadFromCompilerInvocation(CompilerInvocation *CI, Act->EndSourceFile(); Clang.takeDiagnosticClient(); - Clang.takeDiagnostics(); Clang.takeInvocation(); AST->Invocation.reset(Clang.takeInvocation()); @@ -380,23 +376,22 @@ error: Clang.takeSourceManager(); Clang.takeFileManager(); Clang.takeDiagnosticClient(); - Clang.takeDiagnostics(); return 0; } ASTUnit *ASTUnit::LoadFromCommandLine(const char **ArgBegin, const char **ArgEnd, - llvm::MaybeOwningPtr Diags, + llvm::IntrusiveRefCntPtr Diags, llvm::StringRef ResourceFilesPath, bool OnlyLocalDecls, RemappedFile *RemappedFiles, unsigned NumRemappedFiles, bool CaptureDiagnostics) { - if (!Diags.get()) { + if (!Diags.getPtr()) { // No diagnostics engine was provided, so create our own diagnostics object // with the default options. DiagnosticOptions DiagOpts; - Diags.reset(CompilerInstance::createDiagnostics(DiagOpts, 0, 0), true); + Diags = CompilerInstance::createDiagnostics(DiagOpts, 0, 0); } llvm::SmallVector Args; diff --git a/lib/Frontend/CompilerInstance.cpp b/lib/Frontend/CompilerInstance.cpp index 879e9f681d..1f915e3713 100644 --- a/lib/Frontend/CompilerInstance.cpp +++ b/lib/Frontend/CompilerInstance.cpp @@ -52,7 +52,7 @@ void CompilerInstance::setInvocation(CompilerInvocation *Value) { } void CompilerInstance::setDiagnostics(Diagnostic *Value) { - Diagnostics.reset(Value); + Diagnostics = Value; } void CompilerInstance::setDiagnosticClient(DiagnosticClient *Value) { @@ -130,15 +130,16 @@ static void SetUpBuildDumpLog(const DiagnosticOptions &DiagOpts, } void CompilerInstance::createDiagnostics(int Argc, char **Argv) { - Diagnostics.reset(createDiagnostics(getDiagnosticOpts(), Argc, Argv)); + Diagnostics = createDiagnostics(getDiagnosticOpts(), Argc, Argv); if (Diagnostics) DiagClient.reset(Diagnostics->getClient()); } -Diagnostic *CompilerInstance::createDiagnostics(const DiagnosticOptions &Opts, - int Argc, char **Argv) { - llvm::OwningPtr Diags(new Diagnostic()); +llvm::IntrusiveRefCntPtr +CompilerInstance::createDiagnostics(const DiagnosticOptions &Opts, + int Argc, char **Argv) { + llvm::IntrusiveRefCntPtr Diags(new Diagnostic()); // Create the diagnostic client for reporting errors or for // implementing -verify. @@ -152,7 +153,7 @@ Diagnostic *CompilerInstance::createDiagnostics(const DiagnosticOptions &Opts, DiagClient.reset(new TextDiagnosticPrinter(llvm::errs(), Opts)); Diags->setClient(DiagClient.take()); Diags->Report(diag::err_fe_stderr_binary); - return Diags.take(); + return Diags; } else { DiagClient.reset(new BinaryDiagnosticSerializer(llvm::errs())); } @@ -171,7 +172,7 @@ Diagnostic *CompilerInstance::createDiagnostics(const DiagnosticOptions &Opts, // Configure our handling of diagnostics. ProcessWarningOptions(*Diags, Opts); - return Diags.take(); + return Diags; } // File Manager diff --git a/lib/Frontend/FrontendAction.cpp b/lib/Frontend/FrontendAction.cpp index 464b589f18..87fc1227b2 100644 --- a/lib/Frontend/FrontendAction.cpp +++ b/lib/Frontend/FrontendAction.cpp @@ -45,9 +45,9 @@ bool FrontendAction::BeginSourceFile(CompilerInstance &CI, "Attempt to pass AST file to preprocessor only action!"); assert(hasASTSupport() && "This action does not have AST support!"); + llvm::IntrusiveRefCntPtr Diags(&CI.getDiagnostics()); std::string Error; - ASTUnit *AST = ASTUnit::LoadFromPCHFile(Filename, - UnownedDiag(CI.getDiagnostics())); + ASTUnit *AST = ASTUnit::LoadFromPCHFile(Filename, Diags); if (!AST) goto failure; diff --git a/tools/CIndex/CIndex.cpp b/tools/CIndex/CIndex.cpp index 2b56bfb7d1..01130e2277 100644 --- a/tools/CIndex/CIndex.cpp +++ b/tools/CIndex/CIndex.cpp @@ -996,7 +996,8 @@ CXTranslationUnit clang_createTranslationUnit(CXIndex CIdx, CIndexer *CXXIdx = static_cast(CIdx); - return ASTUnit::LoadFromPCHFile(ast_filename, DefaultDiag(), + llvm::IntrusiveRefCntPtr Diags; + return ASTUnit::LoadFromPCHFile(ast_filename, Diags, CXXIdx->getOnlyLocalDecls(), 0, 0, true); } @@ -1015,8 +1016,8 @@ clang_createTranslationUnitFromSourceFile(CXIndex CIdx, // Configure the diagnostics. DiagnosticOptions DiagOpts; - llvm::MaybeOwningPtr Diags; - Diags.reset(CompilerInstance::createDiagnostics(DiagOpts, 0, 0), true); + llvm::IntrusiveRefCntPtr Diags; + Diags = CompilerInstance::createDiagnostics(DiagOpts, 0, 0); llvm::SmallVector RemappedFiles; for (unsigned I = 0; I != num_unsaved_files; ++I) { diff --git a/tools/CIndex/CIndexCodeCompletion.cpp b/tools/CIndex/CIndexCodeCompletion.cpp index 264e5064dd..d11b8dfb50 100644 --- a/tools/CIndex/CIndexCodeCompletion.cpp +++ b/tools/CIndex/CIndexCodeCompletion.cpp @@ -231,8 +231,8 @@ CXCodeCompleteResults *clang_codeComplete(CXIndex CIdx, // Configure the diagnostics. DiagnosticOptions DiagOpts; - llvm::OwningPtr Diags; - Diags.reset(CompilerInstance::createDiagnostics(DiagOpts, 0, 0)); + llvm::IntrusiveRefCntPtr Diags; + Diags = CompilerInstance::createDiagnostics(DiagOpts, 0, 0); // The set of temporary files that we've built. std::vector TemporaryFiles;