diff options
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/include/clang/Basic/VirtualFileSystem.h | 4 | ||||
| -rw-r--r-- | clang/lib/Basic/VirtualFileSystem.cpp | 26 | ||||
| -rw-r--r-- | clang/lib/Frontend/ModuleDependencyCollector.cpp | 4 | ||||
| -rw-r--r-- | clang/test/Modules/crash-vfs-run-reproducer.m | 1 | ||||
| -rw-r--r-- | clang/test/VFS/Inputs/vfsoverlay2.yaml | 1 |
5 files changed, 34 insertions, 2 deletions
diff --git a/clang/include/clang/Basic/VirtualFileSystem.h b/clang/include/clang/Basic/VirtualFileSystem.h index 6ac0812dbb1..e977aa606e6 100644 --- a/clang/include/clang/Basic/VirtualFileSystem.h +++ b/clang/include/clang/Basic/VirtualFileSystem.h @@ -340,6 +340,7 @@ class YAMLVFSWriter { Optional<bool> IsCaseSensitive; Optional<bool> IsOverlayRelative; Optional<bool> UseExternalNames; + Optional<bool> IgnoreNonExistentContents; std::string OverlayDir; public: @@ -351,6 +352,9 @@ public: void setUseExternalNames(bool UseExtNames) { UseExternalNames = UseExtNames; } + void setIgnoreNonExistentContents(bool IgnoreContents) { + IgnoreNonExistentContents = IgnoreContents; + } void setOverlayDir(StringRef OverlayDirectory) { IsOverlayRelative = true; OverlayDir.assign(OverlayDirectory.str()); diff --git a/clang/lib/Basic/VirtualFileSystem.cpp b/clang/lib/Basic/VirtualFileSystem.cpp index 8ace2b3dc83..62a386b7352 100644 --- a/clang/lib/Basic/VirtualFileSystem.cpp +++ b/clang/lib/Basic/VirtualFileSystem.cpp @@ -801,6 +801,7 @@ public: /// 'case-sensitive': <boolean, default=true> /// 'use-external-names': <boolean, default=true> /// 'overlay-relative': <boolean, default=false> +/// 'ignore-non-existent-contents': <boolean, default=true> /// /// Virtual directories are represented as /// \verbatim @@ -860,6 +861,14 @@ class RedirectingFileSystem : public vfs::FileSystem { /// \brief Whether to use to use the value of 'external-contents' for the /// names of files. This global value is overridable on a per-file basis. bool UseExternalNames = true; + + /// \brief Whether an invalid path obtained via 'external-contents' should + /// cause iteration on the VFS to stop. If 'true', the VFS should ignore + /// the entry and continue with the next. Allows YAML files to be shared + /// across multiple compiler invocations regardless of prior existent + /// paths in 'external-contents'. This global value is overridable on a + /// per-file basis. + bool IgnoreNonExistentContents = true; /// @} /// Virtual file paths and external files could be canonicalized without "..", @@ -937,6 +946,10 @@ public: return ExternalContentsPrefixDir; } + bool ignoreNonExistentContents() const { + return IgnoreNonExistentContents; + } + #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) LLVM_DUMP_METHOD void dump() const { for (const std::unique_ptr<Entry> &Root : Roots) @@ -1301,6 +1314,7 @@ public: KeyStatusPair("case-sensitive", false), KeyStatusPair("use-external-names", false), KeyStatusPair("overlay-relative", false), + KeyStatusPair("ignore-non-existent-contents", false), KeyStatusPair("roots", true), }; @@ -1359,6 +1373,9 @@ public: } else if (Key == "use-external-names") { if (!parseScalarBool(I->getValue(), FS->UseExternalNames)) return false; + } else if (Key == "ignore-non-existent-contents") { + if (!parseScalarBool(I->getValue(), FS->IgnoreNonExistentContents)) + return false; } else { llvm_unreachable("key missing from Keys"); } @@ -1619,7 +1636,7 @@ public: JSONWriter(llvm::raw_ostream &OS) : OS(OS) {} void write(ArrayRef<YAMLVFSEntry> Entries, Optional<bool> UseExternalNames, Optional<bool> IsCaseSensitive, Optional<bool> IsOverlayRelative, - StringRef OverlayDir); + Optional<bool> IgnoreNonExistentContents, StringRef OverlayDir); }; } @@ -1675,6 +1692,7 @@ void JSONWriter::write(ArrayRef<YAMLVFSEntry> Entries, Optional<bool> UseExternalNames, Optional<bool> IsCaseSensitive, Optional<bool> IsOverlayRelative, + Optional<bool> IgnoreNonExistentContents, StringRef OverlayDir) { using namespace llvm::sys; @@ -1692,6 +1710,9 @@ void JSONWriter::write(ArrayRef<YAMLVFSEntry> Entries, OS << " 'overlay-relative': '" << (UseOverlayRelative ? "true" : "false") << "',\n"; } + if (IgnoreNonExistentContents.hasValue()) + OS << " 'ignore-non-existent-contents': '" + << (IgnoreNonExistentContents.getValue() ? "true" : "false") << "',\n"; OS << " 'roots': [\n"; if (!Entries.empty()) { @@ -1748,7 +1769,8 @@ void YAMLVFSWriter::write(llvm::raw_ostream &OS) { }); JSONWriter(OS).write(Mappings, UseExternalNames, IsCaseSensitive, - IsOverlayRelative, OverlayDir); + IsOverlayRelative, IgnoreNonExistentContents, + OverlayDir); } VFSFromYamlDirIterImpl::VFSFromYamlDirIterImpl( diff --git a/clang/lib/Frontend/ModuleDependencyCollector.cpp b/clang/lib/Frontend/ModuleDependencyCollector.cpp index 11d36e55486..cc655f6eb00 100644 --- a/clang/lib/Frontend/ModuleDependencyCollector.cpp +++ b/clang/lib/Frontend/ModuleDependencyCollector.cpp @@ -134,6 +134,10 @@ void ModuleDependencyCollector::writeFileMap() { // allows crash reproducer scripts to work across machines. VFSWriter.setOverlayDir(VFSDir); + // Do not ignore non existent contents otherwise we might skip something + // that should have been collected here. + VFSWriter.setIgnoreNonExistentContents(false); + // Explicitly set case sensitivity for the YAML writer. For that, find out // the sensitivity at the path where the headers all collected to. VFSWriter.setCaseSensitivity(isCaseSensitivePath(VFSDir)); diff --git a/clang/test/Modules/crash-vfs-run-reproducer.m b/clang/test/Modules/crash-vfs-run-reproducer.m index d0eaa931c97..e9ecb479a89 100644 --- a/clang/test/Modules/crash-vfs-run-reproducer.m +++ b/clang/test/Modules/crash-vfs-run-reproducer.m @@ -36,6 +36,7 @@ // CHECKYAML: 'case-sensitive': // CHECKYAML-NEXT: 'use-external-names': 'false', // CHECKYAML-NEXT: 'overlay-relative': 'true', +// CHECKYAML-NEXT: 'ignore-non-existent-contents': 'false' // CHECKYAML: 'type': 'directory' // CHECKYAML: 'name': "/[[PATH:.*]]/Inputs/crash-recovery/usr/include", // CHECKYAML-NEXT: 'contents': [ diff --git a/clang/test/VFS/Inputs/vfsoverlay2.yaml b/clang/test/VFS/Inputs/vfsoverlay2.yaml index ae2a0ce4ec9..688ae643df0 100644 --- a/clang/test/VFS/Inputs/vfsoverlay2.yaml +++ b/clang/test/VFS/Inputs/vfsoverlay2.yaml @@ -1,5 +1,6 @@ { 'version': 0, + 'ignore-non-existent-contents': false, 'roots': [ { 'name': 'OUT_DIR', 'type': 'directory', 'contents': [ |

