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 A \c StringError with the diagnostic output if clang errors
49 /// occurred, dependency file contents otherwise.
51 getDependencyFile(ArrayRef<std::string> CommandLine, StringRef CWD);
52
53 /// Collect the module dependency in P1689 format for C++20 named modules.
54 ///
55 /// \param MakeformatOutput The output parameter for dependency information
56 /// in make format if the command line requires to generate make-format
57 /// dependency information by `-MD -MF <dep_file>`.
58 ///
59 /// \param MakeformatOutputPath The output parameter for the path to
60 /// \param MakeformatOutput.
61 ///
62 /// \returns A \c StringError with the diagnostic output if clang errors
63 /// occurred, P1689 dependency format rules otherwise.
65 getP1689ModuleDependencyFile(const CompileCommand &Command, StringRef CWD,
66 std::string &MakeformatOutput,
67 std::string &MakeformatOutputPath);
69 getP1689ModuleDependencyFile(const CompileCommand &Command, StringRef CWD) {
70 std::string MakeformatOutput;
71 std::string MakeformatOutputPath;
72
73 return getP1689ModuleDependencyFile(Command, CWD, MakeformatOutput,
74 MakeformatOutputPath);
75 }
76
77 /// Given a Clang driver command-line for a translation unit, gather the
78 /// modular dependencies and return the information needed for explicit build.
79 ///
80 /// \param AlreadySeen This stores modules which have previously been
81 /// reported. Use the same instance for all calls to this
82 /// function for a single \c DependencyScanningTool in a
83 /// single build. Use a different one for different tools,
84 /// and clear it between builds.
85 /// \param LookupModuleOutput This function is called to fill in
86 /// "-fmodule-file=", "-o" and other output
87 /// arguments for dependencies.
88 /// \param TUBuffer Optional memory buffer for translation unit input. If
89 /// TUBuffer is nullopt, the input should be included in the
90 /// Commandline already.
91 ///
92 /// \returns a \c StringError with the diagnostic output if clang errors
93 /// occurred, \c TranslationUnitDeps otherwise.
96 ArrayRef<std::string> CommandLine, StringRef CWD,
97 const llvm::DenseSet<dependencies::ModuleID> &AlreadySeen,
99 std::optional<llvm::MemoryBufferRef> TUBuffer = std::nullopt);
100
101 /// Given a compilation context specified via the Clang driver command-line,
102 /// gather modular dependencies of module with the given name, and return the
103 /// information needed for explicit build.
104 /// TODO: this method should be removed as soon as Swift and our C-APIs adopt
105 /// CompilerInstanceWithContext. We are keeping it here so that it is easier
106 /// to coordinate with Swift and C-API changes.
108 StringRef ModuleName, ArrayRef<std::string> CommandLine, StringRef CWD,
109 const llvm::DenseSet<dependencies::ModuleID> &AlreadySeen,
111
112 /// The following three methods provide a new interface to perform
113 /// by name dependency scan. The new interface's intention is to improve
114 /// dependency scanning performance when a sequence of name is looked up
115 /// with the same current working directory and the command line.
116
117 /// @brief Initializing the context and the compiler instance.
118 /// This method must be called before calling
119 /// computeDependenciesByNameWithContext.
120 /// @param CWD The current working directory used during the scan.
121 /// @param CommandLine The commandline used for the scan.
122 /// @return Error if the initializaiton fails.
124 StringRef CWD, ArrayRef<std::string> CommandLine);
125
126 /// @brief Computes the dependeny for the module named ModuleName.
127 /// @param ModuleName The name of the module for which this method computes
128 ///. dependencies.
129 /// @param AlreadySeen This stores modules which have previously been
130 /// reported. Use the same instance for all calls to this
131 /// function for a single \c DependencyScanningTool in a
132 /// single build. Note that this parameter is not part of
133 /// the context because it can be shared across different
134 /// worker threads and each worker thread may update it.
135 /// @param LookupModuleOutput This function is called to fill in
136 /// "-fmodule-file=", "-o" and other output
137 /// arguments for dependencies.
138 /// @return An instance of \c TranslationUnitDeps if the scan is successful.
139 /// Otherwise it returns an error.
142 StringRef ModuleName,
143 const llvm::DenseSet<dependencies::ModuleID> &AlreadySeen,
145
146 /// @brief This method finializes the compiler instance. It finalizes the
147 /// diagnostics and deletes the compiler instance. Call this method
148 /// once all names for a same commandline are scanned.
149 /// @return Error if an error occured during finalization.
151
152 llvm::vfs::FileSystem &getWorkerVFS() const { return Worker.getVFS(); }
153
154private:
156 std::unique_ptr<dependencies::TextDiagnosticsPrinterWithOutput>
157 DiagPrinterWithOS;
158};
159
160} // end namespace tooling
161} // end namespace clang
162
163#endif // LLVM_CLANG_TOOLING_DEPENDENCYSCANNINGTOOL_H
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.
DependencyScanningTool(dependencies::DependencyScanningService &Service, llvm::IntrusiveRefCntPtr< llvm::vfs::FileSystem > FS=llvm::vfs::createPhysicalFileSystem())
Construct a dependency scanning tool.
llvm::Expected< dependencies::TranslationUnitDeps > getTranslationUnitDependencies(ArrayRef< std::string > CommandLine, StringRef CWD, 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 ...
llvm::Error initializeCompilerInstanceWithContextOrError(StringRef CWD, ArrayRef< std::string > CommandLine)
The following three methods provide a new interface to perform by name dependency scan.
llvm::Expected< P1689Rule > getP1689ModuleDependencyFile(const CompileCommand &Command, StringRef CWD)
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.
llvm::vfs::FileSystem & getWorkerVFS() const
llvm::Expected< P1689Rule > getP1689ModuleDependencyFile(const CompileCommand &Command, StringRef CWD, std::string &MakeformatOutput, std::string &MakeformatOutputPath)
Collect the module dependency in P1689 format for C++20 named modules.
llvm::Expected< std::string > getDependencyFile(ArrayRef< std::string > CommandLine, StringRef CWD)
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