r261552 - [VFS] Add 'overlay-relative' field to YAML files
Bruno Cardoso Lopes via cfe-commits
cfe-commits at lists.llvm.org
Mon Feb 22 23:12:17 PST 2016
Reverted r261552 & r261556 in r261613. Waiting for next win bot
results to see if it's necessary to revert r261551 as well.
On Mon, Feb 22, 2016 at 7:16 PM, Bruno Cardoso Lopes
<bruno.cardoso at gmail.com> wrote:
> Yes, but because of a related but different issue. The same as here:
> http://lab.llvm.org:8011/builders/clang-x64-ninja-win7/builds/10026
>
> I've been trying to figure it out but it's been hard without a Unix
> system available. I'll keep investigating and revert later tonight in
> case I can't guess it.
>
> On Mon, Feb 22, 2016 at 7:08 PM, Sean Silva <chisophugis at gmail.com> wrote:
>> The bot is still red:
>> http://lab.llvm.org:8011/builders/llvm-clang-lld-x86_64-scei-ps4-windows10pro-fast
>>
>> On Mon, Feb 22, 2016 at 6:48 PM, Bruno Cardoso Lopes
>> <bruno.cardoso at gmail.com> wrote:
>>>
>>> Hi Sean,
>>>
>>> This is hopefully fixed in r261556.
>>>
>>> On Mon, Feb 22, 2016 at 5:45 PM, Sean Silva <chisophugis at gmail.com> wrote:
>>> > This or r261551 seem to be causing a build failure:
>>> >
>>> > http://lab.llvm.org:8011/builders/llvm-clang-lld-x86_64-scei-ps4-windows10pro-fast/builds/527
>>> >
>>> > -- Sean SIlva
>>> >
>>> > On Mon, Feb 22, 2016 at 10:41 AM, Bruno Cardoso Lopes via cfe-commits
>>> > <cfe-commits at lists.llvm.org> wrote:
>>> >>
>>> >> Author: bruno
>>> >> Date: Mon Feb 22 12:41:09 2016
>>> >> New Revision: 261552
>>> >>
>>> >> URL: http://llvm.org/viewvc/llvm-project?rev=261552&view=rev
>>> >> Log:
>>> >> [VFS] Add 'overlay-relative' field to YAML files
>>> >>
>>> >> The VFS overlay mapping between virtual paths and real paths is done
>>> >> through
>>> >> the 'external-contents' entries in YAML files, which contains hardcoded
>>> >> paths
>>> >> to the real files.
>>> >>
>>> >> When a module compilation crashes, headers are dumped into
>>> >> <name>.cache/vfs
>>> >> directory and are mapped via the <name>.cache/vfs/vfs.yaml. The script
>>> >> generated for reproduction uses -ivfsoverlay pointing to file to gather
>>> >> the
>>> >> mapping between virtual paths and files inside <name>.cache/vfs.
>>> >> Currently, we
>>> >> are only capable of reproducing such crashes in the same machine as
>>> >> they
>>> >> happen, because of the hardcoded paths in 'external-contents'.
>>> >>
>>> >> To be able to reproduce a crash in another machine, this patch
>>> >> introduces
>>> >> a new
>>> >> option in the VFS yaml file called 'overlay-relative'. When it's equal
>>> >> to
>>> >> 'true' it means that the provided path to the YAML file through the
>>> >> -ivfsoverlay option should also be used to prefix the final path for
>>> >> every
>>> >> 'external-contents'.
>>> >>
>>> >> Example, given the invocation snippet "... -ivfsoverlay
>>> >> <name>.cache/vfs/vfs.yaml" and the following entry in the yaml file:
>>> >>
>>> >> "overlay-relative": "true",
>>> >> "roots": [
>>> >> ...
>>> >> "type": "directory",
>>> >> "name": "/usr/include",
>>> >> "contents": [
>>> >> {
>>> >> "type": "file",
>>> >> "name": "stdio.h",
>>> >> "external-contents": "/usr/include/stdio.h"
>>> >> },
>>> >> ...
>>> >>
>>> >> Here, a file manager request for virtual "/usr/include/stdio.h", that
>>> >> will
>>> >> map
>>> >> into real path
>>> >> "/<absolute_path_to>/<name>.cache/vfs/usr/include/stdio.h.
>>> >>
>>> >> This is a useful feature for debugging module crashes in machines other
>>> >> than
>>> >> the one where the error happened.
>>> >>
>>> >> Differential Revision: http://reviews.llvm.org/D17457
>>> >>
>>> >> rdar://problem/24499339
>>> >>
>>> >> Added:
>>> >> cfe/trunk/test/Modules/crash-vfs-relative-overlay.m
>>> >> - copied, changed from r261551,
>>> >> cfe/trunk/test/Modules/crash-vfs-path-traversal.m
>>> >> Modified:
>>> >> cfe/trunk/include/clang/Basic/VirtualFileSystem.h
>>> >> cfe/trunk/lib/Basic/VirtualFileSystem.cpp
>>> >> cfe/trunk/lib/Frontend/CompilerInvocation.cpp
>>> >> cfe/trunk/lib/Frontend/ModuleDependencyCollector.cpp
>>> >> cfe/trunk/test/Modules/crash-vfs-path-symlink-component.m
>>> >> cfe/trunk/test/Modules/crash-vfs-path-traversal.m
>>> >>
>>> >> Modified: cfe/trunk/include/clang/Basic/VirtualFileSystem.h
>>> >> URL:
>>> >>
>>> >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/VirtualFileSystem.h?rev=261552&r1=261551&r2=261552&view=diff
>>> >>
>>> >>
>>> >> ==============================================================================
>>> >> --- cfe/trunk/include/clang/Basic/VirtualFileSystem.h (original)
>>> >> +++ cfe/trunk/include/clang/Basic/VirtualFileSystem.h Mon Feb 22
>>> >> 12:41:09
>>> >> 2016
>>> >> @@ -310,6 +310,7 @@ llvm::sys::fs::UniqueID getNextVirtualUn
>>> >> IntrusiveRefCntPtr<FileSystem>
>>> >> getVFSFromYAML(std::unique_ptr<llvm::MemoryBuffer> Buffer,
>>> >> llvm::SourceMgr::DiagHandlerTy DiagHandler,
>>> >> + StringRef YAMLFilePath,
>>> >> void *DiagContext = nullptr,
>>> >> IntrusiveRefCntPtr<FileSystem> ExternalFS =
>>> >> getRealFileSystem());
>>> >>
>>> >> @@ -323,6 +324,8 @@ struct YAMLVFSEntry {
>>> >> class YAMLVFSWriter {
>>> >> std::vector<YAMLVFSEntry> Mappings;
>>> >> Optional<bool> IsCaseSensitive;
>>> >> + Optional<bool> IsOverlayRelative;
>>> >> + std::string OverlayDir;
>>> >>
>>> >> public:
>>> >> YAMLVFSWriter() {}
>>> >> @@ -330,6 +333,11 @@ public:
>>> >> void setCaseSensitivity(bool CaseSensitive) {
>>> >> IsCaseSensitive = CaseSensitive;
>>> >> }
>>> >> + void setOverlayDir(StringRef OverlayDirectory) {
>>> >> + IsOverlayRelative = true;
>>> >> + OverlayDir.assign(OverlayDirectory.str());
>>> >> + }
>>> >> +
>>> >> void write(llvm::raw_ostream &OS);
>>> >> };
>>> >>
>>> >>
>>> >> Modified: cfe/trunk/lib/Basic/VirtualFileSystem.cpp
>>> >> URL:
>>> >>
>>> >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/VirtualFileSystem.cpp?rev=261552&r1=261551&r2=261552&view=diff
>>> >>
>>> >>
>>> >> ==============================================================================
>>> >> --- cfe/trunk/lib/Basic/VirtualFileSystem.cpp (original)
>>> >> +++ cfe/trunk/lib/Basic/VirtualFileSystem.cpp Mon Feb 22 12:41:09 2016
>>> >> @@ -790,6 +790,7 @@ public:
>>> >> /// All configuration options are optional.
>>> >> /// 'case-sensitive': <boolean, default=true>
>>> >> /// 'use-external-names': <boolean, default=true>
>>> >> +/// 'overlay-relative': <boolean, default=false>
>>> >> ///
>>> >> /// Virtual directories are represented as
>>> >> /// \verbatim
>>> >> @@ -832,6 +833,10 @@ class RedirectingFileSystem : public vfs
>>> >> std::vector<std::unique_ptr<Entry>> Roots;
>>> >> /// \brief The file system to use for external references.
>>> >> IntrusiveRefCntPtr<FileSystem> ExternalFS;
>>> >> + /// If IsRelativeOverlay is set, this represents the directory
>>> >> + /// path that should be prefixed to each 'external-contents' entry
>>> >> + /// when reading from YAML files.
>>> >> + std::string ExternalContentsPrefixDir;
>>> >>
>>> >> /// @name Configuration
>>> >> /// @{
>>> >> @@ -841,6 +846,10 @@ class RedirectingFileSystem : public vfs
>>> >> /// Currently, case-insensitive matching only works correctly with
>>> >> ASCII.
>>> >> bool CaseSensitive;
>>> >>
>>> >> + /// IsRelativeOverlay marks whether a IsExternalContentsPrefixDir
>>> >> path
>>> >> must
>>> >> + /// be prefixed in every 'external-contents' when reading from YAML
>>> >> files.
>>> >> + bool IsRelativeOverlay = false;
>>> >> +
>>> >> /// \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;
>>> >> @@ -868,8 +877,8 @@ public:
>>> >> /// returns a virtual file system representing its contents.
>>> >> static RedirectingFileSystem *
>>> >> create(std::unique_ptr<MemoryBuffer> Buffer,
>>> >> - SourceMgr::DiagHandlerTy DiagHandler, void *DiagContext,
>>> >> - IntrusiveRefCntPtr<FileSystem> ExternalFS);
>>> >> + SourceMgr::DiagHandlerTy DiagHandler, StringRef YAMLFilePath,
>>> >> + void *DiagContext, IntrusiveRefCntPtr<FileSystem>
>>> >> ExternalFS);
>>> >>
>>> >> ErrorOr<Status> status(const Twine &Path) override;
>>> >> ErrorOr<std::unique_ptr<File>> openFileForRead(const Twine &Path)
>>> >> override;
>>> >> @@ -902,6 +911,15 @@ public:
>>> >> return
>>> >> directory_iterator(std::make_shared<VFSFromYamlDirIterImpl>(Dir,
>>> >> *this, D->contents_begin(), D->contents_end(), EC));
>>> >> }
>>> >> +
>>> >> + void setExternalContentsPrefixDir(StringRef PrefixDir) {
>>> >> + ExternalContentsPrefixDir = PrefixDir.str();
>>> >> + }
>>> >> +
>>> >> + StringRef getExternalContentsPrefixDir() const {
>>> >> + return ExternalContentsPrefixDir;
>>> >> + }
>>> >> +
>>> >> };
>>> >>
>>> >> /// \brief A helper class to hold the common YAML parsing state.
>>> >> @@ -981,7 +999,7 @@ class RedirectingFileSystemParser {
>>> >> return true;
>>> >> }
>>> >>
>>> >> - std::unique_ptr<Entry> parseEntry(yaml::Node *N) {
>>> >> + std::unique_ptr<Entry> parseEntry(yaml::Node *N,
>>> >> RedirectingFileSystem
>>> >> *FS) {
>>> >> yaml::MappingNode *M = dyn_cast<yaml::MappingNode>(N);
>>> >> if (!M) {
>>> >> error(N, "expected mapping node for file or directory entry");
>>> >> @@ -1057,7 +1075,7 @@ class RedirectingFileSystemParser {
>>> >> for (yaml::SequenceNode::iterator I = Contents->begin(),
>>> >> E = Contents->end();
>>> >> I != E; ++I) {
>>> >> - if (std::unique_ptr<Entry> E = parseEntry(&*I))
>>> >> + if (std::unique_ptr<Entry> E = parseEntry(&*I, FS))
>>> >> EntryArrayContents.push_back(std::move(E));
>>> >> else
>>> >> return nullptr;
>>> >> @@ -1071,12 +1089,22 @@ class RedirectingFileSystemParser {
>>> >> HasContents = true;
>>> >> if (!parseScalarString(I->getValue(), Value, Buffer))
>>> >> return nullptr;
>>> >> - SmallString<256> Path(Value);
>>> >> +
>>> >> + SmallString<128> FullPath;
>>> >> + if (FS->IsRelativeOverlay) {
>>> >> + FullPath = FS->getExternalContentsPrefixDir();
>>> >> + assert(!FullPath.empty() &&
>>> >> + "External contents prefix directory must exist");
>>> >> + llvm::sys::path::append(FullPath, Value);
>>> >> + } else {
>>> >> + FullPath = Value;
>>> >> + }
>>> >> +
>>> >> // Guarantee that old YAML files containing paths with ".."
>>> >> and
>>> >> "." are
>>> >> // properly canonicalized before read into the VFS.
>>> >> - Path = sys::path::remove_leading_dotslash(Path);
>>> >> - sys::path::remove_dots(Path, /*remove_dot_dot=*/true);
>>> >> - ExternalContentsPath = Path.str();
>>> >> + FullPath = sys::path::remove_leading_dotslash(FullPath);
>>> >> + sys::path::remove_dots(FullPath, /*remove_dot_dot=*/true);
>>> >> + ExternalContentsPath = FullPath.str();
>>> >> } else if (Key == "use-external-name") {
>>> >> bool Val;
>>> >> if (!parseScalarBool(I->getValue(), Val))
>>> >> @@ -1162,6 +1190,7 @@ public:
>>> >> KeyStatusPair("version", true),
>>> >> KeyStatusPair("case-sensitive", false),
>>> >> KeyStatusPair("use-external-names", false),
>>> >> + KeyStatusPair("overlay-relative", false),
>>> >> KeyStatusPair("roots", true),
>>> >> };
>>> >>
>>> >> @@ -1187,7 +1216,7 @@ public:
>>> >>
>>> >> for (yaml::SequenceNode::iterator I = Roots->begin(), E =
>>> >> Roots->end();
>>> >> I != E; ++I) {
>>> >> - if (std::unique_ptr<Entry> E = parseEntry(&*I))
>>> >> + if (std::unique_ptr<Entry> E = parseEntry(&*I, FS))
>>> >> FS->Roots.push_back(std::move(E));
>>> >> else
>>> >> return false;
>>> >> @@ -1213,6 +1242,9 @@ public:
>>> >> } else if (Key == "case-sensitive") {
>>> >> if (!parseScalarBool(I->getValue(), FS->CaseSensitive))
>>> >> return false;
>>> >> + } else if (Key == "overlay-relative") {
>>> >> + if (!parseScalarBool(I->getValue(), FS->IsRelativeOverlay))
>>> >> + return false;
>>> >> } else if (Key == "use-external-names") {
>>> >> if (!parseScalarBool(I->getValue(), FS->UseExternalNames))
>>> >> return false;
>>> >> @@ -1233,9 +1265,11 @@ public:
>>> >>
>>> >> Entry::~Entry() = default;
>>> >>
>>> >> -RedirectingFileSystem *RedirectingFileSystem::create(
>>> >> - std::unique_ptr<MemoryBuffer> Buffer, SourceMgr::DiagHandlerTy
>>> >> DiagHandler,
>>> >> - void *DiagContext, IntrusiveRefCntPtr<FileSystem> ExternalFS) {
>>> >> +RedirectingFileSystem *
>>> >> +RedirectingFileSystem::create(std::unique_ptr<MemoryBuffer> Buffer,
>>> >> + SourceMgr::DiagHandlerTy DiagHandler,
>>> >> + StringRef YAMLFilePath, void
>>> >> *DiagContext,
>>> >> + IntrusiveRefCntPtr<FileSystem>
>>> >> ExternalFS)
>>> >> {
>>> >>
>>> >> SourceMgr SM;
>>> >> yaml::Stream Stream(Buffer->getMemBufferRef(), SM);
>>> >> @@ -1252,6 +1286,23 @@ RedirectingFileSystem *RedirectingFileSy
>>> >>
>>> >> std::unique_ptr<RedirectingFileSystem> FS(
>>> >> new RedirectingFileSystem(ExternalFS));
>>> >> +
>>> >> + if (!YAMLFilePath.empty()) {
>>> >> + // Use the YAML path from -ivfsoverlay to compute the dir to be
>>> >> prefixed
>>> >> + // to each 'external-contents' path.
>>> >> + //
>>> >> + // Example:
>>> >> + // -ivfsoverlay dummy.cache/vfs/vfs.yaml
>>> >> + // yields:
>>> >> + // FS->ExternalContentsPrefixDir =>
>>> >> /<absolute_path_to>/dummy.cache/vfs
>>> >> + //
>>> >> + SmallString<256> OverlayAbsDir =
>>> >> sys::path::parent_path(YAMLFilePath);
>>> >> + std::error_code EC = llvm::sys::fs::make_absolute(OverlayAbsDir);
>>> >> + assert(!EC && "Overlay dir final path must be absolute");
>>> >> + (void)EC;
>>> >> + FS->setExternalContentsPrefixDir(OverlayAbsDir);
>>> >> + }
>>> >> +
>>> >> if (!P.parse(Root, FS.get()))
>>> >> return nullptr;
>>> >>
>>> >> @@ -1396,10 +1447,12 @@ RedirectingFileSystem::openFileForRead(c
>>> >>
>>> >> IntrusiveRefCntPtr<FileSystem>
>>> >> vfs::getVFSFromYAML(std::unique_ptr<MemoryBuffer> Buffer,
>>> >> - SourceMgr::DiagHandlerTy DiagHandler, void
>>> >> *DiagContext,
>>> >> + SourceMgr::DiagHandlerTy DiagHandler,
>>> >> + StringRef YAMLFilePath,
>>> >> + void *DiagContext,
>>> >> IntrusiveRefCntPtr<FileSystem> ExternalFS) {
>>> >> return RedirectingFileSystem::create(std::move(Buffer), DiagHandler,
>>> >> - DiagContext, ExternalFS);
>>> >> + YAMLFilePath, DiagContext,
>>> >> ExternalFS);
>>> >> }
>>> >>
>>> >> UniqueID vfs::getNextVirtualUniqueID() {
>>> >> @@ -1431,7 +1484,8 @@ class JSONWriter {
>>> >>
>>> >> public:
>>> >> JSONWriter(llvm::raw_ostream &OS) : OS(OS) {}
>>> >> - void write(ArrayRef<YAMLVFSEntry> Entries, Optional<bool>
>>> >> IsCaseSensitive);
>>> >> + void write(ArrayRef<YAMLVFSEntry> Entries, Optional<bool>
>>> >> IsCaseSensitive,
>>> >> + Optional<bool> IsOverlayRelative, StringRef OverlayDir);
>>> >> };
>>> >> }
>>> >>
>>> >> @@ -1484,7 +1538,9 @@ void JSONWriter::writeEntry(StringRef VP
>>> >> }
>>> >>
>>> >> void JSONWriter::write(ArrayRef<YAMLVFSEntry> Entries,
>>> >> - Optional<bool> IsCaseSensitive) {
>>> >> + Optional<bool> IsCaseSensitive,
>>> >> + Optional<bool> IsOverlayRelative,
>>> >> + StringRef OverlayDir) {
>>> >> using namespace llvm::sys;
>>> >>
>>> >> OS << "{\n"
>>> >> @@ -1492,12 +1548,27 @@ void JSONWriter::write(ArrayRef<YAMLVFSE
>>> >> if (IsCaseSensitive.hasValue())
>>> >> OS << " 'case-sensitive': '"
>>> >> << (IsCaseSensitive.getValue() ? "true" : "false") << "',\n";
>>> >> + bool UseOverlayRelative = false;
>>> >> + if (IsOverlayRelative.hasValue()) {
>>> >> + UseOverlayRelative = IsOverlayRelative.getValue();
>>> >> + OS << " 'overlay-relative': '"
>>> >> + << (UseOverlayRelative ? "true" : "false") << "',\n";
>>> >> + }
>>> >> OS << " 'roots': [\n";
>>> >>
>>> >> if (!Entries.empty()) {
>>> >> const YAMLVFSEntry &Entry = Entries.front();
>>> >> startDirectory(path::parent_path(Entry.VPath));
>>> >> - writeEntry(path::filename(Entry.VPath), Entry.RPath);
>>> >> +
>>> >> + StringRef RPath = Entry.RPath;
>>> >> + if (UseOverlayRelative) {
>>> >> + unsigned OverlayDirLen = OverlayDir.size();
>>> >> + assert(RPath.substr(0, OverlayDirLen) == OverlayDir &&
>>> >> + "Overlay dir must be contained in RPath");
>>> >> + RPath = RPath.slice(OverlayDirLen, RPath.size());
>>> >> + }
>>> >> +
>>> >> + writeEntry(path::filename(Entry.VPath), RPath);
>>> >>
>>> >> for (const auto &Entry : Entries.slice(1)) {
>>> >> StringRef Dir = path::parent_path(Entry.VPath);
>>> >> @@ -1511,7 +1582,14 @@ void JSONWriter::write(ArrayRef<YAMLVFSE
>>> >> OS << ",\n";
>>> >> startDirectory(Dir);
>>> >> }
>>> >> - writeEntry(path::filename(Entry.VPath), Entry.RPath);
>>> >> + StringRef RPath = Entry.RPath;
>>> >> + if (UseOverlayRelative) {
>>> >> + unsigned OverlayDirLen = OverlayDir.size();
>>> >> + assert(RPath.substr(0, OverlayDirLen) == OverlayDir &&
>>> >> + "Overlay dir must be contained in RPath");
>>> >> + RPath = RPath.slice(OverlayDirLen, RPath.size());
>>> >> + }
>>> >> + writeEntry(path::filename(Entry.VPath), RPath);
>>> >> }
>>> >>
>>> >> while (!DirStack.empty()) {
>>> >> @@ -1531,7 +1609,8 @@ void YAMLVFSWriter::write(llvm::raw_ostr
>>> >> return LHS.VPath < RHS.VPath;
>>> >> });
>>> >>
>>> >> - JSONWriter(OS).write(Mappings, IsCaseSensitive);
>>> >> + JSONWriter(OS).write(Mappings, IsCaseSensitive, IsOverlayRelative,
>>> >> + OverlayDir);
>>> >> }
>>> >>
>>> >> VFSFromYamlDirIterImpl::VFSFromYamlDirIterImpl(
>>> >>
>>> >> Modified: cfe/trunk/lib/Frontend/CompilerInvocation.cpp
>>> >> URL:
>>> >>
>>> >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=261552&r1=261551&r2=261552&view=diff
>>> >>
>>> >>
>>> >> ==============================================================================
>>> >> --- cfe/trunk/lib/Frontend/CompilerInvocation.cpp (original)
>>> >> +++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp Mon Feb 22 12:41:09
>>> >> 2016
>>> >> @@ -2344,8 +2344,8 @@ createVFSFromCompilerInvocation(const Co
>>> >> return IntrusiveRefCntPtr<vfs::FileSystem>();
>>> >> }
>>> >>
>>> >> - IntrusiveRefCntPtr<vfs::FileSystem> FS =
>>> >> - vfs::getVFSFromYAML(std::move(Buffer.get()), /*DiagHandler*/
>>> >> nullptr);
>>> >> + IntrusiveRefCntPtr<vfs::FileSystem> FS = vfs::getVFSFromYAML(
>>> >> + std::move(Buffer.get()), /*DiagHandler*/ nullptr, File);
>>> >> if (!FS.get()) {
>>> >> Diags.Report(diag::err_invalid_vfs_overlay) << File;
>>> >> return IntrusiveRefCntPtr<vfs::FileSystem>();
>>> >>
>>> >> Modified: cfe/trunk/lib/Frontend/ModuleDependencyCollector.cpp
>>> >> URL:
>>> >>
>>> >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/ModuleDependencyCollector.cpp?rev=261552&r1=261551&r2=261552&view=diff
>>> >>
>>> >>
>>> >> ==============================================================================
>>> >> --- cfe/trunk/lib/Frontend/ModuleDependencyCollector.cpp (original)
>>> >> +++ cfe/trunk/lib/Frontend/ModuleDependencyCollector.cpp Mon Feb 22
>>> >> 12:41:09 2016
>>> >> @@ -51,6 +51,10 @@ void ModuleDependencyCollector::writeFil
>>> >> SmallString<256> Dest = getDest();
>>> >> llvm::sys::path::append(Dest, "vfs.yaml");
>>> >>
>>> >> + // Default to use relative overlay directories in the VFS yaml file.
>>> >> This
>>> >> + // allows crash reproducer scripts to work across machines.
>>> >> + VFSWriter.setOverlayDir(getDest());
>>> >> +
>>> >> std::error_code EC;
>>> >> llvm::raw_fd_ostream OS(Dest, EC, llvm::sys::fs::F_Text);
>>> >> if (EC) {
>>> >>
>>> >> Modified: cfe/trunk/test/Modules/crash-vfs-path-symlink-component.m
>>> >> URL:
>>> >>
>>> >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/crash-vfs-path-symlink-component.m?rev=261552&r1=261551&r2=261552&view=diff
>>> >>
>>> >>
>>> >> ==============================================================================
>>> >> --- cfe/trunk/test/Modules/crash-vfs-path-symlink-component.m
>>> >> (original)
>>> >> +++ cfe/trunk/test/Modules/crash-vfs-path-symlink-component.m Mon Feb
>>> >> 22
>>> >> 12:41:09 2016
>>> >> @@ -40,21 +40,21 @@
>>> >> // CHECKSH: "-ivfsoverlay" "crash-vfs-{{[^ ]*}}.cache/vfs/vfs.yaml"
>>> >>
>>> >> // CHECKYAML: 'type': 'directory'
>>> >> -// CHECKYAML: 'name': "{{[^ ]*}}/i/usr/include",
>>> >> +// CHECKYAML: 'name': "/[[PATH:.*]]/i/usr/include",
>>> >> // CHECKYAML-NEXT: 'contents': [
>>> >> // CHECKYAML-NEXT: {
>>> >> // CHECKYAML-NEXT: 'type': 'file',
>>> >> // CHECKYAML-NEXT: 'name': "module.map",
>>> >> -// CHECKYAML-NEXT: 'external-contents': "{{[^ ]*}}.cache/vfs/{{[^
>>> >> ]*}}/i/usr/include/module.map"
>>> >> +// CHECKYAML-NEXT: 'external-contents':
>>> >> "/[[PATH]]/i/usr/include/module.map"
>>> >> // CHECKYAML-NEXT: },
>>> >>
>>> >> // CHECKYAML: 'type': 'directory'
>>> >> -// CHECKYAML: 'name': "{{[^ ]*}}/i/usr",
>>> >> +// CHECKYAML: 'name': "/[[PATH]]/i/usr",
>>> >> // CHECKYAML-NEXT: 'contents': [
>>> >> // CHECKYAML-NEXT: {
>>> >> // CHECKYAML-NEXT: 'type': 'file',
>>> >> // CHECKYAML-NEXT: 'name': "module.map",
>>> >> -// CHECKYAML-NEXT: 'external-contents': "{{[^ ]*}}.cache/vfs/{{[^
>>> >> ]*}}/i/usr/include/module.map"
>>> >> +// CHECKYAML-NEXT: 'external-contents':
>>> >> "/[[PATH]]/i/usr/include/module.map"
>>> >> // CHECKYAML-NEXT: },
>>> >>
>>> >> // Test that by using the previous generated YAML file clang is able
>>> >> to
>>> >> find the
>>> >>
>>> >> Modified: cfe/trunk/test/Modules/crash-vfs-path-traversal.m
>>> >> URL:
>>> >>
>>> >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/crash-vfs-path-traversal.m?rev=261552&r1=261551&r2=261552&view=diff
>>> >>
>>> >>
>>> >> ==============================================================================
>>> >> --- cfe/trunk/test/Modules/crash-vfs-path-traversal.m (original)
>>> >> +++ cfe/trunk/test/Modules/crash-vfs-path-traversal.m Mon Feb 22
>>> >> 12:41:09
>>> >> 2016
>>> >> @@ -35,12 +35,12 @@
>>> >> // CHECKSH: "-ivfsoverlay" "crash-vfs-{{[^ ]*}}.cache/vfs/vfs.yaml"
>>> >>
>>> >> // CHECKYAML: 'type': 'directory'
>>> >> -// CHECKYAML: 'name': "{{[^ ]*}}/Inputs/System/usr/include",
>>> >> +// CHECKYAML: 'name': "/[[PATH:.*]]/Inputs/System/usr/include",
>>> >> // CHECKYAML-NEXT: 'contents': [
>>> >> // CHECKYAML-NEXT: {
>>> >> // CHECKYAML-NEXT: 'type': 'file',
>>> >> // CHECKYAML-NEXT: 'name': "module.map",
>>> >> -// CHECKYAML-NEXT: 'external-contents': "{{[^
>>> >> ]*}}/Inputs/System/usr/include/module.map"
>>> >> +// CHECKYAML-NEXT: 'external-contents':
>>> >> "/[[PATH]]/Inputs/System/usr/include/module.map"
>>> >> // CHECKYAML-NEXT: },
>>> >>
>>> >> // Replace the paths in the YAML files with relative ".." traversals
>>> >> @@ -49,9 +49,10 @@
>>> >>
>>> >> // RUN: sed -e "s at usr/include at usr/include/../include at g" \
>>> >> // RUN: %t/crash-vfs-*.cache/vfs/vfs.yaml > %t/vfs.yaml
>>> >> +// RUN: cp %t/vfs.yaml %t/crash-vfs-*.cache/vfs/vfs.yaml
>>> >> // RUN: unset FORCE_CLANG_DIAGNOSTICS_CRASH
>>> >> // RUN: %clang -E %s -I %S/Inputs/System -isysroot %/t/i/ \
>>> >> -// RUN: -ivfsoverlay %t/vfs.yaml -fmodules \
>>> >> +// RUN: -ivfsoverlay %t/crash-vfs-*.cache/vfs/vfs.yaml -fmodules \
>>> >> // RUN: -fmodules-cache-path=%t/m/ 2>&1 \
>>> >> // RUN: | FileCheck %s --check-prefix=CHECKOVERLAY
>>> >>
>>> >>
>>> >> Copied: cfe/trunk/test/Modules/crash-vfs-relative-overlay.m (from
>>> >> r261551,
>>> >> cfe/trunk/test/Modules/crash-vfs-path-traversal.m)
>>> >> URL:
>>> >>
>>> >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/crash-vfs-relative-overlay.m?p2=cfe/trunk/test/Modules/crash-vfs-relative-overlay.m&p1=cfe/trunk/test/Modules/crash-vfs-path-traversal.m&r1=261551&r2=261552&rev=261552&view=diff
>>> >>
>>> >>
>>> >> ==============================================================================
>>> >> --- cfe/trunk/test/Modules/crash-vfs-path-traversal.m (original)
>>> >> +++ cfe/trunk/test/Modules/crash-vfs-relative-overlay.m Mon Feb 22
>>> >> 12:41:09 2016
>>> >> @@ -17,7 +17,7 @@
>>> >> // RUN: find %t/crash-vfs-*.cache/vfs | \
>>> >> // RUN: grep "Inputs/System/usr/include/stdio.h" | count 1
>>> >>
>>> >> -#include "usr/././//////include/../include/./././../include/stdio.h"
>>> >> +#include "usr/include/stdio.h"
>>> >>
>>> >> // CHECK: Preprocessed source(s) and associated run script(s) are
>>> >> located
>>> >> at:
>>> >> // CHECK-NEXT: note: diagnostic msg: {{.*}}.m
>>> >> @@ -35,23 +35,21 @@
>>> >> // CHECKSH: "-ivfsoverlay" "crash-vfs-{{[^ ]*}}.cache/vfs/vfs.yaml"
>>> >>
>>> >> // CHECKYAML: 'type': 'directory'
>>> >> -// CHECKYAML: 'name': "{{[^ ]*}}/Inputs/System/usr/include",
>>> >> +// CHECKYAML: 'name': "/[[PATH:.*]]/Inputs/System/usr/include",
>>> >> // CHECKYAML-NEXT: 'contents': [
>>> >> // CHECKYAML-NEXT: {
>>> >> // CHECKYAML-NEXT: 'type': 'file',
>>> >> // CHECKYAML-NEXT: 'name': "module.map",
>>> >> -// CHECKYAML-NEXT: 'external-contents': "{{[^
>>> >> ]*}}/Inputs/System/usr/include/module.map"
>>> >> +// CHECKYAML-NOT: 'external-contents': "{{[^ ]*}}.cache
>>> >> +// CHECKYAML-NEXT: 'external-contents':
>>> >> "/[[PATH]]/Inputs/System/usr/include/module.map"
>>> >> // CHECKYAML-NEXT: },
>>> >>
>>> >> -// Replace the paths in the YAML files with relative ".." traversals
>>> >> -// and fed into clang to test whether we're correctly representing
>>> >> them
>>> >> -// in the VFS overlay.
>>> >> +// Test that reading the YAML file will yield the correct path after
>>> >> +// the overlay dir is prefixed to access headers in .cache/vfs
>>> >> directory.
>>> >>
>>> >> -// RUN: sed -e "s at usr/include at usr/include/../include at g" \
>>> >> -// RUN: %t/crash-vfs-*.cache/vfs/vfs.yaml > %t/vfs.yaml
>>> >> // RUN: unset FORCE_CLANG_DIAGNOSTICS_CRASH
>>> >> // RUN: %clang -E %s -I %S/Inputs/System -isysroot %/t/i/ \
>>> >> -// RUN: -ivfsoverlay %t/vfs.yaml -fmodules \
>>> >> +// RUN: -ivfsoverlay %t/crash-vfs-*.cache/vfs/vfs.yaml -fmodules \
>>> >> // RUN: -fmodules-cache-path=%t/m/ 2>&1 \
>>> >> // RUN: | FileCheck %s --check-prefix=CHECKOVERLAY
>>> >>
>>> >>
>>> >>
>>> >> _______________________________________________
>>> >> cfe-commits mailing list
>>> >> cfe-commits at lists.llvm.org
>>> >> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>> >
>>> >
>>>
>>>
>>>
>>> --
>>> Bruno Cardoso Lopes
>>> http://www.brunocardoso.cc
>>
>>
>
>
>
> --
> Bruno Cardoso Lopes
> http://www.brunocardoso.cc
--
Bruno Cardoso Lopes
http://www.brunocardoso.cc
More information about the cfe-commits
mailing list