]> granicus.if.org Git - clang/commit
Reapply [VFS] Add 'overlay-relative' field to YAML files
authorBruno Cardoso Lopes <bruno.cardoso@gmail.com>
Thu, 17 Mar 2016 21:11:23 +0000 (21:11 +0000)
committerBruno Cardoso Lopes <bruno.cardoso@gmail.com>
Thu, 17 Mar 2016 21:11:23 +0000 (21:11 +0000)
commit0b61e8b1ecd80cfeaa6481b9a99aaa5b6e4316e5
treea716d083aa882cc61a8d1c9bf5e8b4bef6f90a6a
parente493c761bf21c80a63f1be10e1ccae519235441e
Reapply [VFS] Add 'overlay-relative' field to YAML files

This reapplies r261552.

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

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@263748 91177308-0d34-0410-b5e6-96231b3b80d8
include/clang/Basic/VirtualFileSystem.h
lib/Basic/VirtualFileSystem.cpp
lib/Frontend/CompilerInvocation.cpp
lib/Frontend/ModuleDependencyCollector.cpp
test/Modules/crash-vfs-path-symlink-component.m
test/Modules/crash-vfs-path-traversal.m
test/Modules/crash-vfs-relative-overlay.m [new file with mode: 0644]
unittests/Basic/VirtualFileSystemTest.cpp