[clang] 1e760b5 - [clang][deps] Use correct DiagnosticOptions for command-line handling
Jan Svoboda via cfe-commits
cfe-commits at lists.llvm.org
Fri Sep 10 04:44:48 PDT 2021
Author: Jan Svoboda
Date: 2021-09-10T13:44:35+02:00
New Revision: 1e760b5902615c38079948f31a96724a88a75dd8
URL: https://github.com/llvm/llvm-project/commit/1e760b5902615c38079948f31a96724a88a75dd8
DIFF: https://github.com/llvm/llvm-project/commit/1e760b5902615c38079948f31a96724a88a75dd8.diff
LOG: [clang][deps] Use correct DiagnosticOptions for command-line handling
In this patch the dependency scanner starts using proper `DiagnosticOptions` parsed from the actual TU command-line in order to mimic what the actual compiler would do. The actual functionality will be enabled and tested in follow-up patches. (This split is necessary to avoid temporary regression.)
Depends on D108976.
Reviewed By: dexonsmith, arphaman
Differential Revision: https://reviews.llvm.org/D108982
Added:
Modified:
clang/include/clang/Tooling/DependencyScanning/DependencyScanningWorker.h
clang/lib/Tooling/DependencyScanning/DependencyScanningWorker.cpp
Removed:
################################################################################
diff --git a/clang/include/clang/Tooling/DependencyScanning/DependencyScanningWorker.h b/clang/include/clang/Tooling/DependencyScanning/DependencyScanningWorker.h
index 88029e7f76ad..824013fd6081 100644
--- a/clang/include/clang/Tooling/DependencyScanning/DependencyScanningWorker.h
+++ b/clang/include/clang/Tooling/DependencyScanning/DependencyScanningWorker.h
@@ -68,7 +68,6 @@ class DependencyScanningWorker {
llvm::Optional<StringRef> ModuleName = None);
private:
- IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts;
std::shared_ptr<PCHContainerOperations> PCHContainerOps;
std::unique_ptr<ExcludedPreprocessorDirectiveSkipMapping> PPSkipMappings;
diff --git a/clang/lib/Tooling/DependencyScanning/DependencyScanningWorker.cpp b/clang/lib/Tooling/DependencyScanning/DependencyScanningWorker.cpp
index c8aa801ed5d6..faf7d36bf87b 100644
--- a/clang/lib/Tooling/DependencyScanning/DependencyScanningWorker.cpp
+++ b/clang/lib/Tooling/DependencyScanning/DependencyScanningWorker.cpp
@@ -276,8 +276,6 @@ class DependencyScanningAction : public tooling::ToolAction {
DependencyScanningWorker::DependencyScanningWorker(
DependencyScanningService &Service)
: Format(Service.getFormat()) {
- DiagOpts = new DiagnosticOptions();
-
PCHContainerOps = std::make_shared<PCHContainerOperations>();
PCHContainerOps->registerReader(
std::make_unique<ObjectFilePCHContainerReader>());
@@ -302,16 +300,20 @@ DependencyScanningWorker::DependencyScanningWorker(
Files = new FileManager(FileSystemOptions(), RealFS);
}
-static llvm::Error runWithDiags(
- DiagnosticOptions *DiagOpts,
- llvm::function_ref<bool(DiagnosticConsumer &DC)> BodyShouldSucceed) {
+static llvm::Error
+runWithDiags(DiagnosticOptions *DiagOpts,
+ llvm::function_ref<bool(DiagnosticConsumer &, DiagnosticOptions &)>
+ BodyShouldSucceed) {
+ // Avoid serializing diagnostics.
+ DiagOpts->DiagnosticSerializationFile.clear();
+
// Capture the emitted diagnostics and report them to the client
// in the case of a failure.
std::string DiagnosticOutput;
llvm::raw_string_ostream DiagnosticsOS(DiagnosticOutput);
TextDiagnosticPrinter DiagPrinter(DiagnosticsOS, DiagOpts);
- if (BodyShouldSucceed(DiagPrinter))
+ if (BodyShouldSucceed(DiagPrinter, *DiagOpts))
return llvm::Error::success();
return llvm::make_error<llvm::StringError>(DiagnosticsOS.str(),
llvm::inconvertibleErrorCode());
@@ -338,15 +340,24 @@ llvm::Error DependencyScanningWorker::computeDependencies(
const std::vector<std::string> &FinalCommandLine =
ModifiedCommandLine ? *ModifiedCommandLine : CommandLine;
- return runWithDiags(DiagOpts.get(), [&](DiagnosticConsumer &DC) {
- DependencyScanningAction Action(WorkingDirectory, Consumer, DepFS,
- PPSkipMappings.get(), Format, ModuleName);
- // Create an invocation that uses the underlying file system to ensure that
- // any file system requests that are made by the driver do not go through
- // the dependency scanning filesystem.
- ToolInvocation Invocation(FinalCommandLine, &Action, CurrentFiles.get(),
- PCHContainerOps);
- Invocation.setDiagnosticConsumer(&DC);
- return Invocation.run();
- });
+ std::vector<const char *> FinalCCommandLine(CommandLine.size(), nullptr);
+ llvm::transform(CommandLine, FinalCCommandLine.begin(),
+ [](const std::string &Str) { return Str.c_str(); });
+
+ return runWithDiags(CreateAndPopulateDiagOpts(FinalCCommandLine).release(),
+ [&](DiagnosticConsumer &DC, DiagnosticOptions &DiagOpts) {
+ DependencyScanningAction Action(
+ WorkingDirectory, Consumer, DepFS,
+ PPSkipMappings.get(), Format, ModuleName);
+ // Create an invocation that uses the underlying file
+ // system to ensure that any file system requests that
+ // are made by the driver do not go through the
+ // dependency scanning filesystem.
+ ToolInvocation Invocation(FinalCommandLine, &Action,
+ CurrentFiles.get(),
+ PCHContainerOps);
+ Invocation.setDiagnosticConsumer(&DC);
+ Invocation.setDiagnosticOptions(&DiagOpts);
+ return Invocation.run();
+ });
}
More information about the cfe-commits
mailing list