Driver: Move crash report command mangling into Command::Print
This pushes the logic for generating a crash reproduction script
entirely into Command::Print, instead of Command doing half of the
work and then relying on textual substitution for the rest. This makes
this logic much easier to read and will simplify fixing a couple of
issues in this area.
llvm-svn: 220305
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index 2e9fcfe..baf154f 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -424,10 +424,7 @@
CCGenDiagnostics = true;
// Save the original job command(s).
- std::string Cmd;
- llvm::raw_string_ostream OS(Cmd);
- FailingCommand.Print(OS, "\n", /*Quote*/ false, /*CrashReport*/ true);
- OS.flush();
+ Command Cmd = FailingCommand;
// Keep track of whether we produce any errors while trying to produce
// preprocessed sources.
@@ -541,36 +538,16 @@
}
// Assume associated files are based off of the first temporary file.
- const char *MainFile = TempFiles[0];
+ CrashReportInfo CrashInfo(TempFiles[0], VFS);
- std::string Script = StringRef(MainFile).rsplit('.').first.str() + ".sh";
+ std::string Script = CrashInfo.Filename.rsplit('.').first.str() + ".sh";
std::error_code EC;
llvm::raw_fd_ostream ScriptOS(Script, EC, llvm::sys::fs::F_Excl);
if (EC) {
Diag(clang::diag::note_drv_command_failed_diag_msg)
<< "Error generating run script: " + Script + " " + EC.message();
} else {
- // Replace the original filename with the preprocessed one.
- size_t I, E;
- I = Cmd.find("-main-file-name ");
- assert(I != std::string::npos && "Expected to find -main-file-name");
- I += 16;
- E = Cmd.find(" ", I);
- assert(E != std::string::npos && "-main-file-name missing argument?");
- StringRef OldFilename = StringRef(Cmd).slice(I, E);
- StringRef NewFilename = llvm::sys::path::filename(MainFile);
- I = StringRef(Cmd).rfind(OldFilename);
- E = I + OldFilename.size();
- if (E + 1 < Cmd.size() && Cmd[E] == '"')
- ++E; // Replace a trailing quote if present.
- I = Cmd.rfind(" ", I) + 1;
- Cmd.replace(I, E - I, NewFilename.data(), NewFilename.size());
- if (!VFS.empty()) {
- // Add the VFS overlay to the reproduction script.
- I += NewFilename.size();
- Cmd.insert(I, std::string(" -ivfsoverlay ") + VFS.c_str());
- }
- ScriptOS << Cmd;
+ Cmd.Print(ScriptOS, "\n", /*Quote=*/false, &CrashInfo);
Diag(clang::diag::note_drv_command_failed_diag_msg) << Script;
}
Diag(clang::diag::note_drv_command_failed_diag_msg)