diff --git a/clang/include/clang/Tooling/DependencyScanning/DependencyScanningFilesystem.h b/clang/include/clang/Tooling/DependencyScanning/DependencyScanningFilesystem.h --- a/clang/include/clang/Tooling/DependencyScanning/DependencyScanningFilesystem.h +++ b/clang/include/clang/Tooling/DependencyScanning/DependencyScanningFilesystem.h @@ -11,8 +11,8 @@ #include "clang/Basic/LLVM.h" #include "clang/Lex/PreprocessorExcludedConditionalDirectiveSkipMapping.h" +#include "llvm/ADT/DenseSet.h" #include "llvm/ADT/StringMap.h" -#include "llvm/ADT/StringSet.h" #include "llvm/Support/Allocator.h" #include "llvm/Support/ErrorOr.h" #include "llvm/Support/VirtualFileSystem.h" @@ -305,7 +305,7 @@ private: /// Check whether the file should be minimized. - bool shouldMinimize(StringRef Filename); + bool shouldMinimize(const CachedFileSystemEntry &Entry); /// Returns entry for the given filename. /// @@ -397,7 +397,7 @@ /// currently active preprocessor. ExcludedPreprocessorDirectiveSkipMapping *PPSkipMappings; /// The set of files that should not be minimized. - llvm::StringSet<> NotToBeMinimized; + llvm::DenseSet NotToBeMinimized; }; } // end namespace dependencies diff --git a/clang/lib/Tooling/DependencyScanning/DependencyScanningFilesystem.cpp b/clang/lib/Tooling/DependencyScanning/DependencyScanningFilesystem.cpp --- a/clang/lib/Tooling/DependencyScanning/DependencyScanningFilesystem.cpp +++ b/clang/lib/Tooling/DependencyScanning/DependencyScanningFilesystem.cpp @@ -43,8 +43,7 @@ EntryRef DependencyScanningWorkerFilesystem::minimizeIfNecessary( const CachedFileSystemEntry &Entry) { - if (Entry.isError() || Entry.isDirectory() || - !shouldMinimize(Entry.getName())) + if (Entry.isError() || Entry.isDirectory() || !shouldMinimize(Entry)) return EntryRef(false, Entry); CachedFileContents *Contents = Entry.getContents(); @@ -210,19 +209,15 @@ } void DependencyScanningWorkerFilesystem::disableMinimization( - StringRef RawFilename) { - llvm::SmallString<256> Filename; - llvm::sys::path::native(RawFilename, Filename); - NotToBeMinimized.insert(Filename); + StringRef Filename) { + if (llvm::ErrorOr Result = getOrCreateFileSystemEntry(Filename)) + NotToBeMinimized.insert(Result->getStatus().getUniqueID()); } -bool DependencyScanningWorkerFilesystem::shouldMinimize(StringRef RawFilename) { - if (!shouldMinimizeBasedOnExtension(RawFilename)) - return false; - - llvm::SmallString<256> Filename; - llvm::sys::path::native(RawFilename, Filename); - return !NotToBeMinimized.contains(Filename); +bool DependencyScanningWorkerFilesystem::shouldMinimize( + const CachedFileSystemEntry &Entry) { + return shouldMinimizeBasedOnExtension(Entry.getName()) && + !NotToBeMinimized.contains(Entry.getUniqueID()); } const CachedFileSystemEntry & diff --git a/clang/test/ClangScanDeps/modules-symlink.c b/clang/test/ClangScanDeps/modules-symlink.c new file mode 100644 --- /dev/null +++ b/clang/test/ClangScanDeps/modules-symlink.c @@ -0,0 +1,54 @@ +// RUN: rm -rf %t +// RUN: split-file %s %t + +//--- cdb_pch.json +[ + { + "directory": "DIR", + "command": "clang -x c-header DIR/pch.h -fmodules -gmodules -fimplicit-module-maps -fmodules-cache-path=DIR/cache -o DIR/pch.h.gch", + "file": "DIR/pch.h" + } +] + +//--- cdb_tu.json +[ + { + "directory": "DIR", + "command": "clang -c DIR/tu.c -fmodules -gmodules -fimplicit-module-maps -fmodules-cache-path=DIR/cache -include DIR/pch.h -o DIR/tu.o", + "file": "DIR/tu.c" + } +] + +//--- module.modulemap +module mod { header "symlink.h" } + +//--- pch.h +#include "symlink.h" + +//--- original.h +// Comment that will be stripped by the minimizer. +#define MACRO 1 + +//--- tu.c +#include "original.h" +static int foo = MACRO; // Macro usage that will trigger + // input file consistency checks. + +// RUN: ln -s %t/original.h %t/symlink.h + +// RUN: sed -e "s|DIR|%/t|g" %t/cdb_pch.json > %t/cdb.json +// RUN: clang-scan-deps -compilation-database %t/cdb.json -format experimental-full \ +// RUN: -generate-modules-path-args -module-files-dir %t/build > %t/result_pch.json +// +// RUN: %python %S/../../utils/module-deps-to-rsp.py %t/result_pch.json \ +// RUN: --module-name=mod > %t/mod.cc1.rsp +// RUN: %python %S/../../utils/module-deps-to-rsp.py %t/result_pch.json \ +// RUN: --tu-index=0 > %t/pch.rsp +// +// RUN: %clang @%t/mod.cc1.rsp +// RUN: %clang -x c-header %t/pch.h -fmodules -gmodules -fimplicit-module-maps \ +// RUN: -fmodules-cache-path=%t/cache -o %t/pch.h.gch -I %t @%t/pch.rsp + +// RUN: sed -e "s|DIR|%/t|g" %t/cdb_tu.json > %t/cdb.json +// RUN: clang-scan-deps -compilation-database %t/cdb.json -format experimental-full \ +// RUN: -generate-modules-path-args -module-files-dir %t/build > %t/result_tu.json