Author: vsapsai Date: Tue May 1 16:59:33 2018 New Revision: 331319 URL: http://llvm.org/viewvc/llvm-project?rev=331319&view=rev Log: Track skipped files in dependency scanning.
It's possible for a header to be a symlink to another header. In this case both will be represented by clang::FileEntry with the same UID and they'll use the same clang::HeaderFileInfo. If you include both headers and use some single-inclusion mechanism like a header guard or #import, one header will get a FileChanged callback, and another FileSkipped. So that we get an accurate dependency file, we therefore need to also implement the FileSkipped callback in dependency scanning. Patch by Pete Cooper. Reviewers: bruno, pete Reviewed By: bruno Subscribers: cfe-commits, jkorous, vsapsai Differential Revision: https://reviews.llvm.org/D30881 Added: cfe/trunk/test/Frontend/Inputs/SystemHeaderPrefix/with-header-guard.h cfe/trunk/test/Frontend/dependency-gen-symlink.c Modified: cfe/trunk/lib/Frontend/DependencyFile.cpp Modified: cfe/trunk/lib/Frontend/DependencyFile.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/DependencyFile.cpp?rev=331319&r1=331318&r2=331319&view=diff ============================================================================== --- cfe/trunk/lib/Frontend/DependencyFile.cpp (original) +++ cfe/trunk/lib/Frontend/DependencyFile.cpp Tue May 1 16:59:33 2018 @@ -185,6 +185,10 @@ public: void FileChanged(SourceLocation Loc, FileChangeReason Reason, SrcMgr::CharacteristicKind FileType, FileID PrevFID) override; + + void FileSkipped(const FileEntry &SkippedFile, const Token &FilenameTok, + SrcMgr::CharacteristicKind FileType) override; + void InclusionDirective(SourceLocation HashLoc, const Token &IncludeTok, StringRef FileName, bool IsAngled, CharSourceRange FilenameRange, const FileEntry *File, @@ -288,6 +292,16 @@ void DFGImpl::FileChanged(SourceLocation if (!FileMatchesDepCriteria(Filename.data(), FileType)) return; + AddFilename(llvm::sys::path::remove_leading_dotslash(Filename)); +} + +void DFGImpl::FileSkipped(const FileEntry &SkippedFile, + const Token &FilenameTok, + SrcMgr::CharacteristicKind FileType) { + StringRef Filename = SkippedFile.getName(); + if (!FileMatchesDepCriteria(Filename.data(), FileType)) + return; + AddFilename(llvm::sys::path::remove_leading_dotslash(Filename)); } Added: cfe/trunk/test/Frontend/Inputs/SystemHeaderPrefix/with-header-guard.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Frontend/Inputs/SystemHeaderPrefix/with-header-guard.h?rev=331319&view=auto ============================================================================== --- cfe/trunk/test/Frontend/Inputs/SystemHeaderPrefix/with-header-guard.h (added) +++ cfe/trunk/test/Frontend/Inputs/SystemHeaderPrefix/with-header-guard.h Tue May 1 16:59:33 2018 @@ -0,0 +1,3 @@ +#ifndef HEADER_GUARD +#define HEADER_GUARD +#endif Added: cfe/trunk/test/Frontend/dependency-gen-symlink.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Frontend/dependency-gen-symlink.c?rev=331319&view=auto ============================================================================== --- cfe/trunk/test/Frontend/dependency-gen-symlink.c (added) +++ cfe/trunk/test/Frontend/dependency-gen-symlink.c Tue May 1 16:59:33 2018 @@ -0,0 +1,24 @@ +// REQUIRES: shell + +// Basic test +// RUN: rm -rf %t.dir +// RUN: mkdir %t.dir +// RUN: mkdir %t.dir/a +// RUN: mkdir %t.dir/b +// RUN: echo "#ifndef HEADER_A" > %t.dir/a/header.h +// RUN: echo "#define HEADER_A" >> %t.dir/a/header.h +// RUN: echo "#endif" >> %t.dir/a/header.h +// RUN: ln -s %t.dir/a/header.h %t.dir/b/header.h + +// RUN: %clang_cc1 -dependency-file %t.dir/file.deps -MT %s.o %s -fsyntax-only -I %t.dir -isystem %S/Inputs/SystemHeaderPrefix +// RUN: FileCheck -input-file=%t.dir/file.deps %s +// CHECK: dependency-gen-symlink.c.o +// CHECK: dependency-gen-symlink.c +// CHECK: a/header.h +// CHECK: b/header.h +// CHECK-NOT: with-header-guard.h +#include "a/header.h" +#include "b/header.h" +// System header shouldn't be included in dependencies. +#include <with-header-guard.h> +#include <with-header-guard.h> _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits