Author: Jan Svoboda Date: 2025-04-28T12:42:03-07:00 New Revision: cebaf0cea1f2cf9d71b4d965104e08a7ff6c89c4
URL: https://github.com/llvm/llvm-project/commit/cebaf0cea1f2cf9d71b4d965104e08a7ff6c89c4 DIFF: https://github.com/llvm/llvm-project/commit/cebaf0cea1f2cf9d71b4d965104e08a7ff6c89c4.diff LOG: [clang] Make the `AnalyzerOptions` reference count non-intrusive (#137680) This PR makes `CompilerInvocation` the sole owner of the `AnalyzerOptions` instance. Clients can no longer become co-owners by doing something like this: ```c++ void shareOwnership(CompilerInvocation &CI) { IntrusiveRefCntPtr Shared = &CI.getAnalyzerOpts(); } ``` The motivation for this is given here: https://github.com/llvm/llvm-project/pull/133467#issuecomment-2762065443 Added: Modified: clang/include/clang/Frontend/CompilerInvocation.h clang/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h clang/lib/Frontend/CompilerInvocation.cpp Removed: ################################################################################ diff --git a/clang/include/clang/Frontend/CompilerInvocation.h b/clang/include/clang/Frontend/CompilerInvocation.h index 1827ff0f6816d..f2c653d3075df 100644 --- a/clang/include/clang/Frontend/CompilerInvocation.h +++ b/clang/include/clang/Frontend/CompilerInvocation.h @@ -89,7 +89,7 @@ class CompilerInvocationBase { std::shared_ptr<PreprocessorOptions> PPOpts; /// Options controlling the static analyzer. - AnalyzerOptionsRef AnalyzerOpts; + std::shared_ptr<AnalyzerOptions> AnalyzerOpts; std::shared_ptr<MigratorOptions> MigratorOpts; diff --git a/clang/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h b/clang/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h index 2c970301879d2..54c2fb8a60ca1 100644 --- a/clang/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h +++ b/clang/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h @@ -176,7 +176,7 @@ class PositiveAnalyzerOption { /// and should be eventually converted into -analyzer-config flags. New analyzer /// options should not be implemented as frontend flags. Frontend flags still /// make sense for things that do not affect the actual analysis. -class AnalyzerOptions : public RefCountedBase<AnalyzerOptions> { +class AnalyzerOptions { public: using ConfigTable = llvm::StringMap<std::string>; @@ -416,8 +416,6 @@ class AnalyzerOptions : public RefCountedBase<AnalyzerOptions> { } }; -using AnalyzerOptionsRef = IntrusiveRefCntPtr<AnalyzerOptions>; - //===----------------------------------------------------------------------===// // We'll use AnalyzerOptions in the frontend, but we can't link the frontend // with clangStaticAnalyzerCore, because clangStaticAnalyzerCore depends on diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 1df503859204d..8ff62ae2552c3 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -142,7 +142,7 @@ CompilerInvocationBase::CompilerInvocationBase() DiagnosticOpts(llvm::makeIntrusiveRefCnt<DiagnosticOptions>()), HSOpts(std::make_shared<HeaderSearchOptions>()), PPOpts(std::make_shared<PreprocessorOptions>()), - AnalyzerOpts(llvm::makeIntrusiveRefCnt<AnalyzerOptions>()), + AnalyzerOpts(std::make_shared<AnalyzerOptions>()), MigratorOpts(std::make_shared<MigratorOptions>()), APINotesOpts(std::make_shared<APINotesOptions>()), CodeGenOpts(std::make_shared<CodeGenOptions>()), @@ -159,7 +159,7 @@ CompilerInvocationBase::deep_copy_assign(const CompilerInvocationBase &X) { DiagnosticOpts = makeIntrusiveRefCntCopy(X.getDiagnosticOpts()); HSOpts = make_shared_copy(X.getHeaderSearchOpts()); PPOpts = make_shared_copy(X.getPreprocessorOpts()); - AnalyzerOpts = makeIntrusiveRefCntCopy(X.getAnalyzerOpts()); + AnalyzerOpts = make_shared_copy(X.getAnalyzerOpts()); MigratorOpts = make_shared_copy(X.getMigratorOpts()); APINotesOpts = make_shared_copy(X.getAPINotesOpts()); CodeGenOpts = make_shared_copy(X.getCodeGenOpts()); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits