[VFS] Add 'ignore-non-existent-contents' field to YAML files
Add 'ignore-non-existent-contents' to tell the VFS 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. This adds the parsing and write test part, but use by VFS comes next. Differential Revision: https://reviews.llvm.org/D23422 rdar://problem/27531549 llvm-svn: 278456
This commit is contained in:
parent
89439a7939
commit
b40d8ad225
|
@ -340,6 +340,7 @@ class YAMLVFSWriter {
|
||||||
Optional<bool> IsCaseSensitive;
|
Optional<bool> IsCaseSensitive;
|
||||||
Optional<bool> IsOverlayRelative;
|
Optional<bool> IsOverlayRelative;
|
||||||
Optional<bool> UseExternalNames;
|
Optional<bool> UseExternalNames;
|
||||||
|
Optional<bool> IgnoreNonExistentContents;
|
||||||
std::string OverlayDir;
|
std::string OverlayDir;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -351,6 +352,9 @@ public:
|
||||||
void setUseExternalNames(bool UseExtNames) {
|
void setUseExternalNames(bool UseExtNames) {
|
||||||
UseExternalNames = UseExtNames;
|
UseExternalNames = UseExtNames;
|
||||||
}
|
}
|
||||||
|
void setIgnoreNonExistentContents(bool IgnoreContents) {
|
||||||
|
IgnoreNonExistentContents = IgnoreContents;
|
||||||
|
}
|
||||||
void setOverlayDir(StringRef OverlayDirectory) {
|
void setOverlayDir(StringRef OverlayDirectory) {
|
||||||
IsOverlayRelative = true;
|
IsOverlayRelative = true;
|
||||||
OverlayDir.assign(OverlayDirectory.str());
|
OverlayDir.assign(OverlayDirectory.str());
|
||||||
|
|
|
@ -801,6 +801,7 @@ public:
|
||||||
/// 'case-sensitive': <boolean, default=true>
|
/// 'case-sensitive': <boolean, default=true>
|
||||||
/// 'use-external-names': <boolean, default=true>
|
/// 'use-external-names': <boolean, default=true>
|
||||||
/// 'overlay-relative': <boolean, default=false>
|
/// 'overlay-relative': <boolean, default=false>
|
||||||
|
/// 'ignore-non-existent-contents': <boolean, default=true>
|
||||||
///
|
///
|
||||||
/// Virtual directories are represented as
|
/// Virtual directories are represented as
|
||||||
/// \verbatim
|
/// \verbatim
|
||||||
|
@ -860,6 +861,14 @@ class RedirectingFileSystem : public vfs::FileSystem {
|
||||||
/// \brief Whether to use to use the value of 'external-contents' for the
|
/// \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.
|
/// names of files. This global value is overridable on a per-file basis.
|
||||||
bool UseExternalNames = true;
|
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 "..",
|
/// Virtual file paths and external files could be canonicalized without "..",
|
||||||
|
@ -937,6 +946,10 @@ public:
|
||||||
return ExternalContentsPrefixDir;
|
return ExternalContentsPrefixDir;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ignoreNonExistentContents() const {
|
||||||
|
return IgnoreNonExistentContents;
|
||||||
|
}
|
||||||
|
|
||||||
#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
|
#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
|
||||||
LLVM_DUMP_METHOD void dump() const {
|
LLVM_DUMP_METHOD void dump() const {
|
||||||
for (const std::unique_ptr<Entry> &Root : Roots)
|
for (const std::unique_ptr<Entry> &Root : Roots)
|
||||||
|
@ -1301,6 +1314,7 @@ public:
|
||||||
KeyStatusPair("case-sensitive", false),
|
KeyStatusPair("case-sensitive", false),
|
||||||
KeyStatusPair("use-external-names", false),
|
KeyStatusPair("use-external-names", false),
|
||||||
KeyStatusPair("overlay-relative", false),
|
KeyStatusPair("overlay-relative", false),
|
||||||
|
KeyStatusPair("ignore-non-existent-contents", false),
|
||||||
KeyStatusPair("roots", true),
|
KeyStatusPair("roots", true),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1359,6 +1373,9 @@ public:
|
||||||
} else if (Key == "use-external-names") {
|
} else if (Key == "use-external-names") {
|
||||||
if (!parseScalarBool(I->getValue(), FS->UseExternalNames))
|
if (!parseScalarBool(I->getValue(), FS->UseExternalNames))
|
||||||
return false;
|
return false;
|
||||||
|
} else if (Key == "ignore-non-existent-contents") {
|
||||||
|
if (!parseScalarBool(I->getValue(), FS->IgnoreNonExistentContents))
|
||||||
|
return false;
|
||||||
} else {
|
} else {
|
||||||
llvm_unreachable("key missing from Keys");
|
llvm_unreachable("key missing from Keys");
|
||||||
}
|
}
|
||||||
|
@ -1619,7 +1636,7 @@ public:
|
||||||
JSONWriter(llvm::raw_ostream &OS) : OS(OS) {}
|
JSONWriter(llvm::raw_ostream &OS) : OS(OS) {}
|
||||||
void write(ArrayRef<YAMLVFSEntry> Entries, Optional<bool> UseExternalNames,
|
void write(ArrayRef<YAMLVFSEntry> Entries, Optional<bool> UseExternalNames,
|
||||||
Optional<bool> IsCaseSensitive, Optional<bool> IsOverlayRelative,
|
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> UseExternalNames,
|
||||||
Optional<bool> IsCaseSensitive,
|
Optional<bool> IsCaseSensitive,
|
||||||
Optional<bool> IsOverlayRelative,
|
Optional<bool> IsOverlayRelative,
|
||||||
|
Optional<bool> IgnoreNonExistentContents,
|
||||||
StringRef OverlayDir) {
|
StringRef OverlayDir) {
|
||||||
using namespace llvm::sys;
|
using namespace llvm::sys;
|
||||||
|
|
||||||
|
@ -1692,6 +1710,9 @@ void JSONWriter::write(ArrayRef<YAMLVFSEntry> Entries,
|
||||||
OS << " 'overlay-relative': '"
|
OS << " 'overlay-relative': '"
|
||||||
<< (UseOverlayRelative ? "true" : "false") << "',\n";
|
<< (UseOverlayRelative ? "true" : "false") << "',\n";
|
||||||
}
|
}
|
||||||
|
if (IgnoreNonExistentContents.hasValue())
|
||||||
|
OS << " 'ignore-non-existent-contents': '"
|
||||||
|
<< (IgnoreNonExistentContents.getValue() ? "true" : "false") << "',\n";
|
||||||
OS << " 'roots': [\n";
|
OS << " 'roots': [\n";
|
||||||
|
|
||||||
if (!Entries.empty()) {
|
if (!Entries.empty()) {
|
||||||
|
@ -1748,7 +1769,8 @@ void YAMLVFSWriter::write(llvm::raw_ostream &OS) {
|
||||||
});
|
});
|
||||||
|
|
||||||
JSONWriter(OS).write(Mappings, UseExternalNames, IsCaseSensitive,
|
JSONWriter(OS).write(Mappings, UseExternalNames, IsCaseSensitive,
|
||||||
IsOverlayRelative, OverlayDir);
|
IsOverlayRelative, IgnoreNonExistentContents,
|
||||||
|
OverlayDir);
|
||||||
}
|
}
|
||||||
|
|
||||||
VFSFromYamlDirIterImpl::VFSFromYamlDirIterImpl(
|
VFSFromYamlDirIterImpl::VFSFromYamlDirIterImpl(
|
||||||
|
|
|
@ -134,6 +134,10 @@ void ModuleDependencyCollector::writeFileMap() {
|
||||||
// allows crash reproducer scripts to work across machines.
|
// allows crash reproducer scripts to work across machines.
|
||||||
VFSWriter.setOverlayDir(VFSDir);
|
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
|
// Explicitly set case sensitivity for the YAML writer. For that, find out
|
||||||
// the sensitivity at the path where the headers all collected to.
|
// the sensitivity at the path where the headers all collected to.
|
||||||
VFSWriter.setCaseSensitivity(isCaseSensitivePath(VFSDir));
|
VFSWriter.setCaseSensitivity(isCaseSensitivePath(VFSDir));
|
||||||
|
|
|
@ -36,6 +36,7 @@
|
||||||
// CHECKYAML: 'case-sensitive':
|
// CHECKYAML: 'case-sensitive':
|
||||||
// CHECKYAML-NEXT: 'use-external-names': 'false',
|
// CHECKYAML-NEXT: 'use-external-names': 'false',
|
||||||
// CHECKYAML-NEXT: 'overlay-relative': 'true',
|
// CHECKYAML-NEXT: 'overlay-relative': 'true',
|
||||||
|
// CHECKYAML-NEXT: 'ignore-non-existent-contents': 'false'
|
||||||
// CHECKYAML: 'type': 'directory'
|
// CHECKYAML: 'type': 'directory'
|
||||||
// CHECKYAML: 'name': "/[[PATH:.*]]/Inputs/crash-recovery/usr/include",
|
// CHECKYAML: 'name': "/[[PATH:.*]]/Inputs/crash-recovery/usr/include",
|
||||||
// CHECKYAML-NEXT: 'contents': [
|
// CHECKYAML-NEXT: 'contents': [
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
{
|
{
|
||||||
'version': 0,
|
'version': 0,
|
||||||
|
'ignore-non-existent-contents': false,
|
||||||
'roots': [
|
'roots': [
|
||||||
{ 'name': 'OUT_DIR', 'type': 'directory',
|
{ 'name': 'OUT_DIR', 'type': 'directory',
|
||||||
'contents': [
|
'contents': [
|
||||||
|
|
Loading…
Reference in New Issue