From 5c4bbc16f64751afb41b1f2ac30ac23ec520cecb Mon Sep 17 00:00:00 2001 From: Artem Chikin Date: Wed, 21 Feb 2024 12:37:04 -0800 Subject: [PATCH] [Dependency Scanning] Guard access to shared state of the `DependencyScannerDiagnosticCollectingConsumer` Resolves rdar://123344065 --- include/swift/DependencyScan/DependencyScanningTool.h | 9 +++++---- lib/DependencyScan/DependencyScanningTool.cpp | 8 ++++++++ tools/libSwiftScan/libSwiftScan.cpp | 7 ++++--- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/include/swift/DependencyScan/DependencyScanningTool.h b/include/swift/DependencyScan/DependencyScanningTool.h index 28cdf14c51611..af8744b56044a 100644 --- a/include/swift/DependencyScan/DependencyScanningTool.h +++ b/include/swift/DependencyScan/DependencyScanningTool.h @@ -39,10 +39,11 @@ class DependencyScannerDiagnosticCollectingConsumer : public DiagnosticConsumer void handleDiagnostic(SourceManager &SM, const DiagnosticInfo &Info) override; - ScannerDiagnosticInfo convertDiagnosticInfo(SourceManager &SM, - const DiagnosticInfo &Info); void addDiagnostic(SourceManager &SM, const DiagnosticInfo &Info); std::vector Diagnostics; + // FIXME: For now, we isolate access to shared state of this object + // but we really should make sure that it doesn't get shared. + llvm::sys::SmartMutex ScanningDiagnosticConsumerStateLock; }; @@ -91,8 +92,8 @@ class DependencyScanningTool { bool loadCache(llvm::StringRef path); /// Discard the tool's current `SharedCache` and start anew. void resetCache(); - - const std::vector& getDiagnostics() const { return CDC.Diagnostics; } + /// Query diagnostics consumed so far. + std::vector getDiagnostics(); /// Discared the collection of diagnostics encountered so far. void resetDiagnostics(); diff --git a/lib/DependencyScan/DependencyScanningTool.cpp b/lib/DependencyScan/DependencyScanningTool.cpp index 3fced77da23b7..363966b7a05aa 100644 --- a/lib/DependencyScan/DependencyScanningTool.cpp +++ b/lib/DependencyScan/DependencyScanningTool.cpp @@ -77,6 +77,7 @@ void DependencyScannerDiagnosticCollectingConsumer::handleDiagnostic(SourceManag } void DependencyScannerDiagnosticCollectingConsumer::addDiagnostic(SourceManager &SM, const DiagnosticInfo &Info) { + llvm::sys::SmartScopedLock Lock(ScanningDiagnosticConsumerStateLock); // Determine what kind of diagnostic we're emitting. llvm::SourceMgr::DiagKind SMKind; switch (Info.Kind) { @@ -219,6 +220,13 @@ void DependencyScanningTool::resetCache() { ScanningService.reset(new SwiftDependencyScanningService()); } +std::vector< + DependencyScannerDiagnosticCollectingConsumer::ScannerDiagnosticInfo> +DependencyScanningTool::getDiagnostics() { + llvm::sys::SmartScopedLock Lock(DependencyScanningToolStateLock); + return CDC.Diagnostics; +} + void DependencyScanningTool::resetDiagnostics() { llvm::sys::SmartScopedLock Lock(DependencyScanningToolStateLock); CDC.reset(); diff --git a/tools/libSwiftScan/libSwiftScan.cpp b/tools/libSwiftScan/libSwiftScan.cpp index d1377cbcca3ae..04f492f4f81d2 100644 --- a/tools/libSwiftScan/libSwiftScan.cpp +++ b/tools/libSwiftScan/libSwiftScan.cpp @@ -613,14 +613,15 @@ swiftscan_compiler_supported_features_query() { swiftscan_diagnostic_set_t* swiftscan_scanner_diagnostics_query(swiftscan_scanner_t scanner) { DependencyScanningTool *ScanningTool = unwrap(scanner); - auto NumDiagnostics = ScanningTool->getDiagnostics().size(); - + auto Diagnostics = ScanningTool->getDiagnostics(); + auto NumDiagnostics = Diagnostics.size(); + swiftscan_diagnostic_set_t *Result = new swiftscan_diagnostic_set_t; Result->count = NumDiagnostics; Result->diagnostics = new swiftscan_diagnostic_info_t[NumDiagnostics]; for (size_t i = 0; i < NumDiagnostics; ++i) { - const auto &Diagnostic = ScanningTool->getDiagnostics()[i]; + const auto &Diagnostic = Diagnostics[i]; swiftscan_diagnostic_info_s *DiagnosticInfo = new swiftscan_diagnostic_info_s; DiagnosticInfo->message = swift::c_string_utils::create_clone(Diagnostic.Message.c_str()); switch (Diagnostic.Severity) {