clang 22.0.0git
DependencyScanningTool.h
Go to the documentation of this file.
1//===----------------------------------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef LLVM_CLANG_TOOLING_DEPENDENCYSCANNINGTOOL_H
10#define LLVM_CLANG_TOOLING_DEPENDENCYSCANNINGTOOL_H
11
18#include "llvm/ADT/DenseSet.h"
19#include <optional>
20#include <string>
21#include <vector>
22
23namespace clang {
24namespace tooling {
25
26struct P1689Rule {
27 std::string PrimaryOutput;
28 std::optional<dependencies::P1689ModuleInfo> Provides;
29 std::vector<dependencies::P1689ModuleInfo> Requires;
30};
31
32/// The high-level implementation of the dependency discovery tool that runs on
33/// an individual worker thread.
35public:
36 /// Construct a dependency scanning tool.
37 ///
38 /// @param Service The parent service. Must outlive the tool.
39 /// @param FS The filesystem for the tool to use. Defaults to the physical FS.
42 llvm::vfs::createPhysicalFileSystem());
43
44 /// Print out the dependency information into a string using the dependency
45 /// file format that is specified in the options (-MD is the default) and
46 /// return it.
47 ///
48 /// \returns std::nullopt if errors occurred (reported to the DiagConsumer),
49 /// dependency file contents otherwise.
50 std::optional<std::string>
51 getDependencyFile(ArrayRef<std::string> CommandLine, StringRef CWD,
52 DiagnosticConsumer &DiagConsumer);
53
54 /// Collect the module dependency in P1689 format for C++20 named modules.
55 ///
56 /// \param MakeformatOutput The output parameter for dependency information
57 /// in make format if the command line requires to generate make-format
58 /// dependency information by `-MD -MF <dep_file>`.
59 ///
60 /// \param MakeformatOutputPath The output parameter for the path to
61 /// \param MakeformatOutput.
62 ///
63 /// \returns std::nullopt if errors occurred (reported to the DiagConsumer),
64 /// P1689 dependency format rules otherwise.
65 std::optional<P1689Rule>
66 getP1689ModuleDependencyFile(const CompileCommand &Command, StringRef CWD,
67 std::string &MakeformatOutput,
68 std::string &MakeformatOutputPath,
69 DiagnosticConsumer &DiagConsumer);
70 std::optional<P1689Rule>
71 getP1689ModuleDependencyFile(const CompileCommand &Command, StringRef CWD,
72 DiagnosticConsumer &DiagConsumer) {
73 std::string MakeformatOutput;
74 std::string MakeformatOutputPath;
75
76 return getP1689ModuleDependencyFile(Command, CWD, MakeformatOutput,
77 MakeformatOutputPath, DiagConsumer);
78 }
79
80 /// Given a Clang driver command-line for a translation unit, gather the
81 /// modular dependencies and return the information needed for explicit build.
82 ///
83 /// \param AlreadySeen This stores modules which have previously been
84 /// reported. Use the same instance for all calls to this
85 /// function for a single \c DependencyScanningTool in a
86 /// single build. Use a different one for different tools,
87 /// and clear it between builds.
88 /// \param LookupModuleOutput This function is called to fill in
89 /// "-fmodule-file=", "-o" and other output
90 /// arguments for dependencies.
91 /// \param TUBuffer Optional memory buffer for translation unit input. If
92 /// TUBuffer is nullopt, the input should be included in the
93 /// Commandline already.
94 ///
95 /// \returns std::nullopt if errors occurred (reported to the DiagConsumer),
96 /// translation unit dependencies otherwise.
97 std::optional<dependencies::TranslationUnitDeps>
99 ArrayRef<std::string> CommandLine, StringRef CWD,
100 DiagnosticConsumer &DiagConsumer,
101 const llvm::DenseSet<dependencies::ModuleID> &AlreadySeen,
103 std::optional<llvm::MemoryBufferRef> TUBuffer = std::nullopt);
104
105 /// Given a compilation context specified via the Clang driver command-line,
106 /// gather modular dependencies of module with the given name, and return the
107 /// information needed for explicit build.
108 /// TODO: this method should be removed as soon as Swift and our C-APIs adopt
109 /// CompilerInstanceWithContext. We are keeping it here so that it is easier
110 /// to coordinate with Swift and C-API changes.
112 StringRef ModuleName, ArrayRef<std::string> CommandLine, StringRef CWD,
113 const llvm::DenseSet<dependencies::ModuleID> &AlreadySeen,
115
116 /// The following three methods provide a new interface to perform
117 /// by name dependency scan. The new interface's intention is to improve
118 /// dependency scanning performance when a sequence of name is looked up
119 /// with the same current working directory and the command line.
120
121 /// @brief Initializing the context and the compiler instance.
122 /// This method must be called before calling
123 /// computeDependenciesByNameWithContext.
124 /// @param CWD The current working directory used during the scan.
125 /// @param CommandLine The commandline used for the scan.
126 /// @return Error if the initializaiton fails.
128 StringRef CWD, ArrayRef<std::string> CommandLine);
129
130 /// @brief Computes the dependeny for the module named ModuleName.
131 /// @param ModuleName The name of the module for which this method computes
132 ///. dependencies.
133 /// @param AlreadySeen This stores modules which have previously been
134 /// reported. Use the same instance for all calls to this
135 /// function for a single \c DependencyScanningTool in a
136 /// single build. Note that this parameter is not part of
137 /// the context because it can be shared across different
138 /// worker threads and each worker thread may update it.
139 /// @param LookupModuleOutput This function is called to fill in
140 /// "-fmodule-file=", "-o" and other output
141 /// arguments for dependencies.
142 /// @return An instance of \c TranslationUnitDeps if the scan is successful.
143 /// Otherwise it returns an error.
146 StringRef ModuleName,
147 const llvm::DenseSet<dependencies::ModuleID> &AlreadySeen,
149
150 /// @brief This method finializes the compiler instance. It finalizes the
151 /// diagnostics and deletes the compiler instance. Call this method
152 /// once all names for a same commandline are scanned.
153 /// @return Error if an error occured during finalization.
155
156 llvm::vfs::FileSystem &getWorkerVFS() const { return Worker.getVFS(); }
157
158 /// @brief Initialize the worker's compiler instance from the commandline.
159 /// The compiler instance only takes a `-cc1` job, so this method
160 /// builds the `-cc1` job from the CommandLine input.
161 /// @param Worker The dependency scanning worker whose compiler instance
162 /// with context is initialized.
163 /// @param CWD The current working directory.
164 /// @param CommandLine This command line may be a driver command or a cc1
165 /// command.
166 /// @param DC A diagnostics consumer to report error if the initialization
167 /// fails.
171
172private:
174 std::unique_ptr<dependencies::TextDiagnosticsPrinterWithOutput>
175 DiagPrinterWithOS;
176};
177
178} // end namespace tooling
179} // end namespace clang
180
181#endif // LLVM_CLANG_TOOLING_DEPENDENCYSCANNINGTOOL_H
Abstract interface, implemented by clients of the front-end, which formats and prints fully processed...
The dependency scanning service contains shared configuration and state that is used by the individua...
An individual dependency scanning worker that is able to run on its own thread.
static bool initializeWorkerCIWithContextFromCommandline(clang::dependencies::DependencyScanningWorker &Worker, StringRef CWD, ArrayRef< std::string > CommandLine, DiagnosticConsumer &DC)
Initialize the worker's compiler instance from the commandline.
DependencyScanningTool(dependencies::DependencyScanningService &Service, llvm::IntrusiveRefCntPtr< llvm::vfs::FileSystem > FS=llvm::vfs::createPhysicalFileSystem())
Construct a dependency scanning tool.
llvm::Error initializeCompilerInstanceWithContextOrError(StringRef CWD, ArrayRef< std::string > CommandLine)
The following three methods provide a new interface to perform by name dependency scan.
std::optional< dependencies::TranslationUnitDeps > getTranslationUnitDependencies(ArrayRef< std::string > CommandLine, StringRef CWD, DiagnosticConsumer &DiagConsumer, const llvm::DenseSet< dependencies::ModuleID > &AlreadySeen, dependencies::LookupModuleOutputCallback LookupModuleOutput, std::optional< llvm::MemoryBufferRef > TUBuffer=std::nullopt)
Given a Clang driver command-line for a translation unit, gather the modular dependencies and return ...
std::optional< P1689Rule > getP1689ModuleDependencyFile(const CompileCommand &Command, StringRef CWD, DiagnosticConsumer &DiagConsumer)
llvm::Expected< dependencies::TranslationUnitDeps > getModuleDependencies(StringRef ModuleName, ArrayRef< std::string > CommandLine, StringRef CWD, const llvm::DenseSet< dependencies::ModuleID > &AlreadySeen, dependencies::LookupModuleOutputCallback LookupModuleOutput)
Given a compilation context specified via the Clang driver command-line, gather modular dependencies ...
llvm::Error finalizeCompilerInstanceWithContextOrError()
This method finializes the compiler instance.
llvm::Expected< dependencies::TranslationUnitDeps > computeDependenciesByNameWithContextOrError(StringRef ModuleName, const llvm::DenseSet< dependencies::ModuleID > &AlreadySeen, dependencies::LookupModuleOutputCallback LookupModuleOutput)
Computes the dependeny for the module named ModuleName.
std::optional< P1689Rule > getP1689ModuleDependencyFile(const CompileCommand &Command, StringRef CWD, std::string &MakeformatOutput, std::string &MakeformatOutputPath, DiagnosticConsumer &DiagConsumer)
Collect the module dependency in P1689 format for C++20 named modules.
llvm::vfs::FileSystem & getWorkerVFS() const
std::optional< std::string > getDependencyFile(ArrayRef< std::string > CommandLine, StringRef CWD, DiagnosticConsumer &DiagConsumer)
Print out the dependency information into a string using the dependency file format that is specified...
llvm::function_ref< std::string(const ModuleDeps &, ModuleOutputKind)> LookupModuleOutputCallback
A callback to lookup module outputs for "-fmodule-file=", "-o" etc.
The JSON file list parser is used to communicate input to InstallAPI.
@ Worker
'worker' clause, allowed on 'loop', Combined, and 'routine' directives.
Specifies the working directory and command of a compilation.
std::vector< dependencies::P1689ModuleInfo > Requires
std::optional< dependencies::P1689ModuleInfo > Provides