23#include "llvm/ADT/StringSet.h"
24#include "llvm/Support/FileSystem.h"
25#include "llvm/Support/Path.h"
26#include "llvm/Support/raw_ostream.h"
32struct DepCollectorPPCallbacks :
public PPCallbacks {
36 : DepCollector(L), PP(PP) {}
41 if (Reason != PPCallbacks::LexedFileChangeReason::EnterFile)
47 if (std::optional<StringRef>
Filename =
50 llvm::sys::path::remove_leading_dotslash(*
Filename),
59 llvm::sys::path::remove_leading_dotslash(SkippedFile.
getName());
69 StringRef FileName,
bool IsAngled,
72 StringRef RelativePath,
const Module *Imported,
90 llvm::sys::path::remove_leading_dotslash(
File->getName());
109 bool IsSystem)
override {
124 : DepCollector(L), FileMgr(FileMgr) {}
138 bool IsOverridden,
bool IsExplicitModule)
override {
139 if (IsOverridden || IsExplicitModule)
156 bool FromModule,
bool IsSystem,
170 StringRef SearchPath;
174 llvm::sys::path::native(TmpPath);
175 std::transform(TmpPath.begin(), TmpPath.end(), TmpPath.begin(), ::tolower);
176 SearchPath = TmpPath.str();
181 if (Seen.insert(SearchPath).second) {
182 Dependencies.push_back(std::string(
Filename));
193 bool IsSystem,
bool IsModuleFile,
201 PP.
addPPCallbacks(std::make_unique<DepCollectorPPCallbacks>(*
this, PP));
203 std::make_unique<DepCollectorMMCallbacks>(*
this));
207 std::make_unique<DepCollectorASTListener>(*
this, R.
getFileManager()));
212 : OutputFile(Opts.OutputFile), Targets(Opts.Targets),
213 IncludeSystemHeaders(Opts.IncludeSystemHeaders),
214 CanonicalSystemHeaders(Opts.CanonicalSystemHeaders),
215 PhonyTarget(Opts.UsePhonyTargets),
216 AddMissingHeaderDeps(Opts.AddMissingHeaderDeps), SeenMissingHeader(
false),
217 IncludeModuleFiles(Opts.IncludeModuleFiles),
218 OutputFormat(Opts.OutputFormat), InputFileIndex(0) {
219 for (
const auto &ExtraDep : Opts.
ExtraDeps) {
227 if (AddMissingHeaderDeps)
234 bool IsSystem,
bool IsModuleFile,
238 if (AddMissingHeaderDeps)
240 SeenMissingHeader =
true;
243 if (IsModuleFile && !IncludeModuleFiles)
249 if (IncludeSystemHeaders)
311 llvm::sys::path::native(
Filename.str(), NativePath);
317 if (NativePath.find_first_of(
" #${}^!") != StringRef::npos)
318 OS <<
'\"' << NativePath <<
'\"';
324 for (
unsigned i = 0, e = NativePath.size(); i != e; ++i) {
325 if (NativePath[i] ==
'#')
327 else if (NativePath[i] ==
' ') {
330 while (j > 0 && NativePath[--j] ==
'\\')
332 }
else if (NativePath[i] ==
'$')
339 if (SeenMissingHeader) {
340 llvm::sys::fs::remove(OutputFile);
345 llvm::raw_fd_ostream OS(OutputFile, EC, llvm::sys::fs::OF_TextWithCRLF);
347 Diags.
Report(diag::err_fe_error_opening) << OutputFile << EC.message();
359 const unsigned MaxColumns = 75;
360 unsigned Columns = 0;
362 for (StringRef
Target : Targets) {
363 unsigned N =
Target.size();
366 }
else if (Columns + N + 2 > MaxColumns) {
383 for (StringRef
File : Files) {
384 if (
File ==
"<stdin>")
389 unsigned N =
File.size();
390 if (Columns + (N + 1) + 2 > MaxColumns) {
401 if (PhonyTarget && !Files.empty()) {
403 for (
auto I = Files.begin(), E = Files.end(); I != E; ++I) {
404 if (Index++ == InputFileIndex)
static void PrintFilename(raw_ostream &OS, StringRef Filename, DependencyOutputFormat OutputFormat)
Print the filename, with escaping or quoting that accommodates the three most likely tools that use d...
static bool isSpecialFilename(StringRef Filename)
Defines the clang::FileManager interface and associated types.
Defines the PPCallbacks interface.
Defines the clang::Preprocessor interface.
Defines the SourceManager interface.
Abstract interface for callback invocations by the ASTReader.
virtual bool needsInputFileVisitation()
Returns true if this ASTReaderListener wants to receive the input files of the AST file via visitInpu...
virtual bool visitInputFile(StringRef Filename, bool isSystem, bool isOverridden, bool isExplicitModule)
if needsInputFileVisitation returns true, this is called for each non-system input file of the AST Fi...
virtual void visitModuleFile(StringRef Filename, serialization::ModuleKind Kind)
This is called for each AST file loaded.
virtual bool needsSystemInputFileVisitation()
Returns true if this ASTReaderListener wants to receive the system input files of the AST file via vi...
Reads an AST files chain containing the contents of a translation unit.
void addListener(std::unique_ptr< ASTReaderListener > L)
Add an AST callback listener.
FileManager & getFileManager() const
Represents a character-granular source range.
An interface for collecting the dependencies of a compilation.
bool addDependency(StringRef Filename)
Return true if the filename was added to the list of dependencies, false otherwise.
virtual void attachToPreprocessor(Preprocessor &PP)
ArrayRef< std::string > getDependencies() const
virtual void finishedMainFile(DiagnosticsEngine &Diags)
Called when the end of the main file is reached.
virtual void attachToASTReader(ASTReader &R)
virtual ~DependencyCollector()
virtual void maybeAddDependency(StringRef Filename, bool FromModule, bool IsSystem, bool IsModuleFile, FileManager *FileMgr, bool IsMissing)
Add a dependency Filename if it has not been seen before and sawDependency() returns true.
virtual bool shouldCanonicalizeSystemDependencies()
Return true if system files should be canonicalized.
virtual bool needSystemDependencies()
Return true if system files should be passed to sawDependency().
virtual bool sawDependency(StringRef Filename, bool FromModule, bool IsSystem, bool IsModuleFile, bool IsMissing)
Called when a new file is seen.
void outputDependencyFile(llvm::raw_ostream &OS)
void attachToPreprocessor(Preprocessor &PP) override
void finishedMainFile(DiagnosticsEngine &Diags) override
Called when the end of the main file is reached.
bool sawDependency(StringRef Filename, bool FromModule, bool IsSystem, bool IsModuleFile, bool IsMissing) final
Called when a new file is seen.
DependencyFileGenerator(const DependencyOutputOptions &Opts)
DependencyOutputOptions - Options for controlling the compiler dependency file generation.
std::vector< std::pair< std::string, ExtraDepKind > > ExtraDeps
A list of extra dependencies (filename and kind) to be used for every target.
Concrete class used by the front-end to report problems and issues.
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
A reference to a FileEntry that includes the name of the file as it was accessed by the FileManager's...
StringRef getName() const
The name of this FileEntry.
Cached information about one file (either on disk or in the virtual file system).
StringRef getName() const
An opaque identifier used by SourceManager which refers to a source file (MemoryBuffer) along with it...
Implements support for file system lookup, file system caching, and directory search management.
OptionalFileEntryRef getOptionalFileRef(StringRef Filename, bool OpenFile=false, bool CacheFailure=true)
Get a FileEntryRef if it exists, without doing anything on error.
llvm::ErrorOr< const FileEntry * > getFile(StringRef Filename, bool OpenFile=false, bool CacheFailure=true)
Lookup, cache, and verify the specified file (real or virtual).
StringRef getCanonicalName(const DirectoryEntry *Dir)
Retrieve the canonical name for a given directory.
Record the location of an inclusion directive, such as an #include or #import statement.
A mechanism to observe the actions of the module map parser as it reads module map files.
virtual void moduleMapFileRead(SourceLocation FileStart, const FileEntry &File, bool IsSystem)
Called when a module map file has been read.
void addModuleMapCallbacks(std::unique_ptr< ModuleMapCallbacks > Callback)
Add a module map callback.
Describes a module or submodule.
This interface provides a way to observe the actions of the preprocessor as it does its thing.
virtual void EndOfMainFile()
Callback invoked when the end of the main file is reached.
virtual void FileSkipped(const FileEntryRef &SkippedFile, const Token &FilenameTok, SrcMgr::CharacteristicKind FileType)
Callback invoked whenever a source file is skipped as the result of header guard optimization.
virtual void HasInclude(SourceLocation Loc, StringRef FileName, bool IsAngled, OptionalFileEntryRef File, SrcMgr::CharacteristicKind FileType)
Hook called when a '__has_include' or '__has_include_next' directive is read.
virtual void LexedFileChanged(FileID FID, LexedFileChangeReason Reason, SrcMgr::CharacteristicKind FileType, FileID PrevFID, SourceLocation Loc)
Callback invoked whenever the Lexer moves to a different file for lexing.
Engages in a tight little dance with the lexer to efficiently preprocess tokens.
void addPPCallbacks(std::unique_ptr< PPCallbacks > C)
SourceManager & getSourceManager() const
FileManager & getFileManager() const
HeaderSearch & getHeaderSearchInfo() const
void SetSuppressIncludeNotFoundError(bool Suppress)
DiagnosticsEngine & getDiagnostics() const
Encodes a location in the source.
std::optional< StringRef > getNonBuiltinFilenameForID(FileID FID) const
Returns the filename for the provided FileID, unless it's a built-in buffer that's not represented by...
Token - This structure provides full information about a lexed token.
CharacteristicKind
Indicates whether a file or directory holds normal user code, system code, or system code which is im...
bool isSystem(CharacteristicKind CK)
Determine whether a file / directory characteristic is for system code.
ModuleKind
Specifies the kind of module that has been loaded.
DependencyOutputFormat
DependencyOutputFormat - Format for the compiler dependency file.