From: Chad Rosier Date: Wed, 25 Jul 2012 17:52:16 +0000 (+0000) Subject: [driver crash diagnostics] A few enhancements: X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=37302ead1c067ec984a75e847cd83c6881637e72;p=clang [driver crash diagnostics] A few enhancements: -Strip -iquote and -M options. -Quote -D options to avoid problems with command line macros that include parens. rdar://11949066 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@160743 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Driver/Driver.cpp b/lib/Driver/Driver.cpp index 7f6fcb1a5e..c7819b1fce 100644 --- a/lib/Driver/Driver.cpp +++ b/lib/Driver/Driver.cpp @@ -504,8 +504,18 @@ void Driver::generateCompilationDiagnostics(Compilation &C, // Strip away options not necessary to reproduce the crash. // FIXME: This doesn't work with quotes (e.g., -D "foo bar"). SmallVector Flag; + Flag.push_back("-D "); Flag.push_back("-F"); Flag.push_back("-I "); + Flag.push_back("-M "); + Flag.push_back("-MD "); + Flag.push_back("-MF "); + Flag.push_back("-MG "); + Flag.push_back("-MM "); + Flag.push_back("-MMD "); + Flag.push_back("-MP "); + Flag.push_back("-MQ "); + Flag.push_back("-MT "); Flag.push_back("-o "); Flag.push_back("-coverage-file "); Flag.push_back("-dependency-file "); @@ -514,6 +524,7 @@ void Driver::generateCompilationDiagnostics(Compilation &C, Flag.push_back("-include "); Flag.push_back("-include-pch "); Flag.push_back("-isysroot "); + Flag.push_back("-iquote "); Flag.push_back("-resource-dir "); Flag.push_back("-serialize-diagnostic-file "); for (unsigned i = 0, e = Flag.size(); i < e; ++i) { @@ -524,7 +535,14 @@ void Driver::generateCompilationDiagnostics(Compilation &C, E = Cmd.find(" ", I + Flag[i].length()); if (E == std::string::npos) break; - Cmd.erase(I, E - I + 1); + // The -D option is not removed. Instead, the argument is quoted. + if (Flag[i] != "-D ") { + Cmd.erase(I, E - I + 1); + } else { + Cmd.insert(I+3, "\""); + Cmd.insert(++E, "\""); + I = E; + } } while(1); } // Append the new filename with correct preprocessed suffix. diff --git a/test/Driver/crash-report.c b/test/Driver/crash-report.c index 9476adadac..fd45f48ccd 100644 --- a/test/Driver/crash-report.c +++ b/test/Driver/crash-report.c @@ -1,6 +1,7 @@ // RUN: rm -rf %t // RUN: mkdir %t -// RUN: env TMPDIR=%t TEMP=%t TMP=%t %clang -fsyntax-only %s -DFOO=BAR 2>&1 | FileCheck %s +// RUN: env TMPDIR=%t TEMP=%t TMP=%t %clang -fsyntax-only %s \ +// RUN: -F/tmp/ -I /tmp/ -iquote /tmp/ -DFOO=BAR 2>&1 | FileCheck %s // RUN: cat %t/crash-report-*.c | FileCheck --check-prefix=CHECKSRC %s // RUN: cat %t/crash-report-*.sh | FileCheck --check-prefix=CHECKSH %s // REQUIRES: crash-recovery @@ -10,4 +11,7 @@ // CHECK-NEXT: note: diagnostic msg: {{.*}}.c FOO // CHECKSRC: FOO -// CHECKSH: -D FOO=BAR +// CHECKSH: -D "FOO=BAR" +// CHECKSH-NOT: -F/tmp/ +// CHECKSH-NOT: -I /tmp/ +// CHECKSH-NOT: -iquote /tmp/