]> granicus.if.org Git - clang/commitdiff
[CrashReproducer] Setup 'case-sensitive' in YAML files.
authorBruno Cardoso Lopes <bruno.cardoso@gmail.com>
Thu, 7 Apr 2016 00:00:57 +0000 (00:00 +0000)
committerBruno Cardoso Lopes <bruno.cardoso@gmail.com>
Thu, 7 Apr 2016 00:00:57 +0000 (00:00 +0000)
The crash reproducer was not setting up case sensitivity in the
VFS yaml files, which defaults to true. Make the crash reproducer
explicitly set that flag based on the case sensitivity of the .cache
path where vfs and modules are dumped.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@265622 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Frontend/ModuleDependencyCollector.cpp
test/Modules/crash-vfs-relative-overlay.m

index d9cf40af0f699d4b3a68d939c611c4b2ecca579d..1678d1801d2d2aea3d9fd9200f316802ea34f60a 100644 (file)
@@ -79,19 +79,42 @@ void ModuleDependencyCollector::attachToPreprocessor(Preprocessor &PP) {
       llvm::make_unique<ModuleDependencyMMCallbacks>(*this));
 }
 
+static bool isCaseSensitivePath(StringRef Path) {
+  SmallString<PATH_MAX> TmpDest = Path, UpperDest, RealDest;
+  // Remove component traversals, links, etc.
+  if (!real_path(Path, TmpDest))
+    return true; // Current default value in vfs.yaml
+  Path = TmpDest;
+
+  // Change path to all upper case and ask for its real path, if the latter
+  // exists and is equal to Path, it's not case sensitive. Default to case
+  // sensitive in the absense of realpath, since this is what the VFSWriter
+  // already expects when sensitivity isn't setup.
+  for (auto &C : Path)
+    UpperDest.push_back(std::toupper(C));
+  if (real_path(UpperDest, RealDest) && Path.equals(RealDest))
+    return false;
+  return true;
+}
+
 void ModuleDependencyCollector::writeFileMap() {
   if (Seen.empty())
     return;
 
-  SmallString<256> Dest = getDest();
-  llvm::sys::path::append(Dest, "vfs.yaml");
+  StringRef VFSDir = getDest();
 
   // Default to use relative overlay directories in the VFS yaml file. This
   // allows crash reproducer scripts to work across machines.
-  VFSWriter.setOverlayDir(getDest());
+  VFSWriter.setOverlayDir(VFSDir);
+
+  // 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));
 
   std::error_code EC;
-  llvm::raw_fd_ostream OS(Dest, EC, llvm::sys::fs::F_Text);
+  SmallString<256> YAMLPath = VFSDir;
+  llvm::sys::path::append(YAMLPath, "vfs.yaml");
+  llvm::raw_fd_ostream OS(YAMLPath, EC, llvm::sys::fs::F_Text);
   if (EC) {
     HasErrors = true;
     return;
index 29552d0bb3466dad6e028531410718ecdf9fb312..d785d09bd827d864be9f4e192aa1f2b838dc9123 100644 (file)
@@ -36,6 +36,8 @@
 // CHECKSH: "-ivfsoverlay" "crash-vfs-{{[^ ]*}}.cache/vfs/vfs.yaml"
 // CHECKSH: "-fmodules-cache-path=crash-vfs-{{[^ ]*}}.cache/modules"
 
+// CHECKYAML: 'case-sensitive':
+// CHECKYAML-NEXT: 'overlay-relative': 'true',
 // CHECKYAML: 'type': 'directory'
 // CHECKYAML: 'name': "/[[PATH:.*]]/Inputs/crash-recovery/usr/include",
 // CHECKYAML-NEXT: 'contents': [