https://github.com/jansvoboda11 created https://github.com/llvm/llvm-project/pull/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 >From 675b0d44ab9b5ea3dbdbb33cb2ce8287410b5493 Mon Sep 17 00:00:00 2001 From: Jan Svoboda <jan_svob...@apple.com> Date: Mon, 28 Apr 2025 11:01:24 -0700 Subject: [PATCH] [clang] Make the `AnalyzerOptions` reference count non-intrusive 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(); } ``` --- clang/include/clang/Frontend/CompilerInvocation.h | 2 +- clang/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h | 4 +--- clang/lib/Frontend/CompilerInvocation.cpp | 4 ++-- 3 files changed, 4 insertions(+), 6 deletions(-) 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