From 659ecc3120eb7797ce8ec85d2748e3b2f5065a5a Mon Sep 17 00:00:00 2001 From: Justin Bogner Date: Mon, 20 Oct 2014 22:47:23 +0000 Subject: [PATCH] Driver: Consolidate the logic for naming the module crashdump cache List the module cache we use for crashdumps as a tempfile. This simplifies how we pick up this directory when generating the actual crash diagnostic and removes some duplicate logic. llvm-svn: 220241 --- clang/lib/Driver/Driver.cpp | 25 ++++++++++--------------- clang/lib/Driver/Tools.cpp | 3 +++ 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 30ae6ff..2e9fcfe 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -529,27 +529,22 @@ void Driver::generateCompilationDiagnostics(Compilation &C, "PLEASE ATTACH THE FOLLOWING FILES TO THE BUG REPORT:\n" "Preprocessed source(s) and associated run script(s) are located at:"; - for (const char *TempFile : TempFiles) + SmallString<128> VFS; + for (const char *TempFile : TempFiles) { Diag(clang::diag::note_drv_command_failed_diag_msg) << TempFile; + if (StringRef(TempFile).endswith(".cache")) { + // In some cases (modules) we'll dump extra data to help with reproducing + // the crash into a directory next to the output. + VFS = llvm::sys::path::filename(TempFile); + llvm::sys::path::append(VFS, "vfs", "vfs.yaml"); + } + } // Assume associated files are based off of the first temporary file. const char *MainFile = TempFiles[0]; - std::string Script = StringRef(MainFile).rsplit('.').first; - - // In some cases (modules) we'll dump extra data to help with reproducing - // the crash into a directory next to the output. - // FIXME: We should be able to generate these as extra temp files now that it - // won't mess up the run script. - SmallString<128> VFS; - if (llvm::sys::fs::exists(Script + ".cache")) { - Diag(clang::diag::note_drv_command_failed_diag_msg) << Script + ".cache"; - VFS = llvm::sys::path::filename(Script + ".cache"); - llvm::sys::path::append(VFS, "vfs", "vfs.yaml"); - } - + std::string Script = StringRef(MainFile).rsplit('.').first.str() + ".sh"; std::error_code EC; - Script += ".sh"; llvm::raw_fd_ostream ScriptOS(Script, EC, llvm::sys::fs::F_Excl); if (EC) { Diag(clang::diag::note_drv_command_failed_diag_msg) diff --git a/clang/lib/Driver/Tools.cpp b/clang/lib/Driver/Tools.cpp index f5b6bd8..ea5c3ab 100644 --- a/clang/lib/Driver/Tools.cpp +++ b/clang/lib/Driver/Tools.cpp @@ -3860,6 +3860,9 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, if (HaveModules && C.isForDiagnostics()) { SmallString<128> VFSDir(Output.getFilename()); llvm::sys::path::replace_extension(VFSDir, ".cache"); + // Add the cache directory as a temp so the crash diagnostics pick it up. + C.addTempFile(Args.MakeArgString(VFSDir)); + llvm::sys::path::append(VFSDir, "vfs"); CmdArgs.push_back("-module-dependency-dir"); CmdArgs.push_back(Args.MakeArgString(VFSDir)); -- 2.7.4