[all-commits] [llvm/llvm-project] 9e306a: [clang] Remove intrusive reference count from `Dia...

Jan Svoboda via All-commits all-commits at lists.llvm.org
Thu May 22 12:34:13 PDT 2025


  Branch: refs/heads/main
  Home:   https://github.com/llvm/llvm-project
  Commit: 9e306ad4600c4d3392c194a8be88919ee758425c
      https://github.com/llvm/llvm-project/commit/9e306ad4600c4d3392c194a8be88919ee758425c
  Author: Jan Svoboda <jan_svoboda at apple.com>
  Date:   2025-05-22 (Thu, 22 May 2025)

  Changed paths:
    M clang-tools-extra/clang-apply-replacements/tool/ClangApplyReplacementsMain.cpp
    M clang-tools-extra/clang-change-namespace/tool/ClangChangeNamespace.cpp
    M clang-tools-extra/clang-include-fixer/tool/ClangIncludeFixer.cpp
    M clang-tools-extra/clang-move/tool/ClangMove.cpp
    M clang-tools-extra/clang-query/Query.cpp
    M clang-tools-extra/clang-reorder-fields/tool/ClangReorderFields.cpp
    M clang-tools-extra/clang-tidy/ClangTidy.cpp
    M clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp
    M clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.h
    M clang-tools-extra/clang-tidy/ExpandModularHeadersPPCallbacks.cpp
    M clang-tools-extra/clang-tidy/ExpandModularHeadersPPCallbacks.h
    M clang-tools-extra/clangd/Compiler.cpp
    M clang-tools-extra/clangd/ModulesBuilder.cpp
    M clang-tools-extra/clangd/ParsedAST.cpp
    M clang-tools-extra/clangd/Preamble.cpp
    M clang-tools-extra/clangd/SystemIncludeExtractor.cpp
    M clang-tools-extra/clangd/unittests/ConfigCompileTests.cpp
    M clang-tools-extra/clangd/unittests/tweaks/TweakTests.cpp
    M clang-tools-extra/include-cleaner/unittests/RecordTest.cpp
    M clang-tools-extra/include-cleaner/unittests/WalkASTTest.cpp
    M clang-tools-extra/modularize/ModularizeUtilities.cpp
    M clang-tools-extra/modularize/ModularizeUtilities.h
    M clang-tools-extra/unittests/clang-apply-replacements/ApplyReplacementsTest.cpp
    M clang-tools-extra/unittests/clang-tidy/ClangTidyOptionsTest.cpp
    M clang-tools-extra/unittests/clang-tidy/ClangTidyTest.h
    M clang/include/clang/Basic/Diagnostic.h
    M clang/include/clang/Basic/DiagnosticOptions.h
    M clang/include/clang/Basic/SourceManager.h
    M clang/include/clang/Frontend/ASTUnit.h
    M clang/include/clang/Frontend/CompilerInstance.h
    M clang/include/clang/Frontend/CompilerInvocation.h
    M clang/include/clang/Frontend/DiagnosticRenderer.h
    M clang/include/clang/Frontend/LogDiagnosticPrinter.h
    M clang/include/clang/Frontend/SARIFDiagnostic.h
    M clang/include/clang/Frontend/SARIFDiagnosticPrinter.h
    M clang/include/clang/Frontend/SerializedDiagnosticPrinter.h
    M clang/include/clang/Frontend/TextDiagnostic.h
    M clang/include/clang/Frontend/TextDiagnosticPrinter.h
    M clang/include/clang/Serialization/ASTReader.h
    M clang/lib/Basic/Diagnostic.cpp
    M clang/lib/Basic/SourceManager.cpp
    M clang/lib/CrossTU/CrossTranslationUnit.cpp
    M clang/lib/Frontend/ASTMerge.cpp
    M clang/lib/Frontend/ASTUnit.cpp
    M clang/lib/Frontend/ChainedIncludesSource.cpp
    M clang/lib/Frontend/CompilerInstance.cpp
    M clang/lib/Frontend/CompilerInvocation.cpp
    M clang/lib/Frontend/CreateInvocationFromCommandLine.cpp
    M clang/lib/Frontend/DiagnosticRenderer.cpp
    M clang/lib/Frontend/FrontendAction.cpp
    M clang/lib/Frontend/FrontendActions.cpp
    M clang/lib/Frontend/LogDiagnosticPrinter.cpp
    M clang/lib/Frontend/SARIFDiagnostic.cpp
    M clang/lib/Frontend/SARIFDiagnosticPrinter.cpp
    M clang/lib/Frontend/SerializedDiagnosticPrinter.cpp
    M clang/lib/Frontend/TextDiagnostic.cpp
    M clang/lib/Frontend/TextDiagnosticPrinter.cpp
    M clang/lib/Interpreter/CodeCompletion.cpp
    M clang/lib/Interpreter/Interpreter.cpp
    M clang/lib/Rewrite/HTMLRewrite.cpp
    M clang/lib/Serialization/ASTReader.cpp
    M clang/lib/Testing/TestAST.cpp
    M clang/lib/Tooling/CompilationDatabase.cpp
    M clang/lib/Tooling/Core/Replacement.cpp
    M clang/lib/Tooling/DependencyScanning/DependencyScanningWorker.cpp
    M clang/lib/Tooling/Refactoring.cpp
    M clang/lib/Tooling/Tooling.cpp
    M clang/tools/c-index-test/core_main.cpp
    M clang/tools/clang-extdef-mapping/ClangExtDefMapGen.cpp
    M clang/tools/clang-format/ClangFormat.cpp
    M clang/tools/clang-import-test/clang-import-test.cpp
    M clang/tools/clang-installapi/ClangInstallAPI.cpp
    M clang/tools/clang-scan-deps/ClangScanDeps.cpp
    M clang/tools/diagtool/ShowEnabledWarnings.cpp
    M clang/tools/diagtool/TreeView.cpp
    M clang/tools/driver/cc1_main.cpp
    M clang/tools/driver/cc1as_main.cpp
    M clang/tools/driver/cc1gen_reproducer_main.cpp
    M clang/tools/driver/driver.cpp
    M clang/tools/libclang/CIndex.cpp
    M clang/tools/libclang/CIndexCodeCompletion.cpp
    M clang/tools/libclang/CIndexDiagnostic.cpp
    M clang/tools/libclang/Indexing.cpp
    M clang/unittests/AST/ASTVectorTest.cpp
    M clang/unittests/AST/CommentLexer.cpp
    M clang/unittests/AST/CommentParser.cpp
    M clang/unittests/AST/CommentTextTest.cpp
    M clang/unittests/AST/ExternalASTSourceTest.cpp
    M clang/unittests/Analysis/FlowSensitive/UncheckedOptionalAccessModelTest.cpp
    M clang/unittests/Analysis/MacroExpansionContextTest.cpp
    M clang/unittests/Analysis/UnsafeBufferUsageTest.cpp
    M clang/unittests/Basic/DiagnosticTest.cpp
    M clang/unittests/Basic/SarifTest.cpp
    M clang/unittests/Basic/SourceManagerTest.cpp
    M clang/unittests/Driver/DXCModeTest.cpp
    M clang/unittests/Driver/SanitizerArgsTest.cpp
    M clang/unittests/Driver/SimpleDiagnosticConsumer.h
    M clang/unittests/Driver/ToolChainTest.cpp
    M clang/unittests/Frontend/ASTUnitTest.cpp
    M clang/unittests/Frontend/CompilerInstanceTest.cpp
    M clang/unittests/Frontend/CompilerInvocationTest.cpp
    M clang/unittests/Frontend/OutputStreamTest.cpp
    M clang/unittests/Frontend/PCHPreambleTest.cpp
    M clang/unittests/Frontend/ReparseWorkingDirTest.cpp
    M clang/unittests/Frontend/SearchPathTest.cpp
    M clang/unittests/Frontend/TextDiagnosticTest.cpp
    M clang/unittests/Frontend/UtilsTest.cpp
    M clang/unittests/Interpreter/InterpreterTest.cpp
    M clang/unittests/Lex/HeaderSearchTest.cpp
    M clang/unittests/Lex/LexerTest.cpp
    M clang/unittests/Lex/ModuleDeclStateTest.cpp
    M clang/unittests/Lex/PPCallbacksTest.cpp
    M clang/unittests/Lex/PPConditionalDirectiveRecordTest.cpp
    M clang/unittests/Lex/PPDependencyDirectivesTest.cpp
    M clang/unittests/Lex/PPMemoryAllocationsTest.cpp
    M clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp
    M clang/unittests/Sema/SemaNoloadLookupTest.cpp
    M clang/unittests/Serialization/ForceCheckFileInputTest.cpp
    M clang/unittests/Serialization/LoadSpecLazilyTest.cpp
    M clang/unittests/Serialization/ModuleCacheTest.cpp
    M clang/unittests/Serialization/NoCommentsTest.cpp
    M clang/unittests/Serialization/PreambleInNamedModulesTest.cpp
    M clang/unittests/Serialization/VarDeclConstantInitTest.cpp
    M clang/unittests/Support/TimeProfilerTest.cpp
    M clang/unittests/Tooling/RewriterTestContext.h
    M clang/unittests/Tooling/Syntax/TokensTest.cpp
    M clang/unittests/Tooling/Syntax/TreeTestBase.cpp
    M clang/unittests/Tooling/Syntax/TreeTestBase.h
    M clang/unittests/Tooling/ToolingTest.cpp
    M lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp
    M lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionSourceCode.cpp
    M lldb/source/Plugins/ExpressionParser/Clang/ClangModulesDeclVendor.cpp
    M lldb/source/Plugins/Language/ClangCommon/ClangHighlighter.cpp
    M lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
    M lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h

  Log Message:
  -----------
  [clang] Remove intrusive reference count from `DiagnosticOptions` (#139584)

The `DiagnosticOptions` class is currently intrusively
reference-counted, which makes reasoning about its lifetime very
difficult in some cases. For example, `CompilerInvocation` owns the
`DiagnosticOptions` instance (wrapped in `llvm::IntrusiveRefCntPtr`) and
only exposes an accessor returning `DiagnosticOptions &`. One would
think this gives `CompilerInvocation` exclusive ownership of the object,
but that's not the case:

```c++
void shareOwnership(CompilerInvocation &CI) {
  llvm::IntrusiveRefCntPtr<DiagnosticOptions> CoOwner = &CI.getDiagnosticOptions();
  // ...
}
```

This is a perfectly valid pattern that is being actually used in the
codebase.

I would like to ensure the ownership of `DiagnosticOptions` by
`CompilerInvocation` is guaranteed to be exclusive. This can be
leveraged for a copy-on-write optimization later on. This PR changes
usages of `DiagnosticOptions` across `clang`, `clang-tools-extra` and
`lldb` to not be intrusively reference-counted.



To unsubscribe from these emails, change your notification settings at https://github.com/llvm/llvm-project/settings/notifications


More information about the All-commits mailing list