diff --git a/clang/include/clang/Basic/CodeGenOptions.def b/clang/include/clang/Basic/CodeGenOptions.def --- a/clang/include/clang/Basic/CodeGenOptions.def +++ b/clang/include/clang/Basic/CodeGenOptions.def @@ -401,6 +401,9 @@ /// Whether to emit the .debug$H section containing hashes of CodeView types. CODEGENOPT(CodeViewGHash, 1, 0) +/// Whether to emit the compiler path and command line into the CodeView debug information. +CODEGENOPT(CodeViewCommandLine, 1, 0) + /// The kind of inlining to perform. ENUM_CODEGENOPT(Inlining, InliningMethod, 2, NormalInlining) diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -3186,6 +3186,11 @@ CodeGenOpts<"CodeViewGHash">, DefaultFalse, PosFlag, NegFlag, BothFlags<[CoreOption]>>; +defm codeview_command_line : BoolOption<"g", "codeview-command-line", + CodeGenOpts<"CodeViewCommandLine">, DefaultTrue, + PosFlag, + NegFlag, + BothFlags<[CoreOption, CC1Option]>>; defm inline_line_tables : BoolGOption<"inline-line-tables", CodeGenOpts<"NoInlineLineTables">, DefaultFalse, NegFlag, diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -4315,9 +4315,14 @@ if (EmitCodeView) { CmdArgs.push_back("-gcodeview"); + Args.addOptInFlag(CmdArgs, options::OPT_gcodeview_ghash, options::OPT_gno_codeview_ghash); + + Args.addOptOutFlag(CmdArgs, options::OPT_gcodeview_command_line, + options::OPT_gno_codeview_command_line); } + Args.addOptOutFlag(CmdArgs, options::OPT_ginline_line_tables, options::OPT_gno_inline_line_tables); diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -4546,8 +4546,10 @@ } // Store the command-line for using in the CodeView backend. - Res.getCodeGenOpts().Argv0 = Argv0; - append_range(Res.getCodeGenOpts().CommandLineArgs, CommandLineArgs); + if (Res.getCodeGenOpts().CodeViewCommandLine) { + Res.getCodeGenOpts().Argv0 = Argv0; + append_range(Res.getCodeGenOpts().CommandLineArgs, CommandLineArgs); + } FixupInvocation(Res, Diags, Args, DashX); diff --git a/clang/test/CodeGen/debug-info-codeview-buildinfo.c b/clang/test/CodeGen/debug-info-codeview-buildinfo.c --- a/clang/test/CodeGen/debug-info-codeview-buildinfo.c +++ b/clang/test/CodeGen/debug-info-codeview-buildinfo.c @@ -1,8 +1,12 @@ // REQUIRES: x86-registered-target // RUN: %clang_cl --target=i686-windows-msvc /c /Z7 /Fo%t.obj -- %s // RUN: llvm-pdbutil dump --types %t.obj | FileCheck %s +// RUN: %clang_cl -gcodeview-command-line --target=i686-windows-msvc /c /Z7 /Fo%t.obj -- %s +// RUN: llvm-pdbutil dump --types %t.obj | FileCheck %s // RUN: %clang_cl --target=i686-windows-msvc /c /Z7 /Fo%t.obj -fdebug-compilation-dir=. -- %s // RUN: llvm-pdbutil dump --types %t.obj | FileCheck %s --check-prefix RELATIVE +// RUN: %clang_cl -gno-codeview-command-line --target=i686-windows-msvc /c /Z7 /Fo%t.obj -- %s +// RUN: llvm-pdbutil dump --types %t.obj | FileCheck %s --check-prefix DISABLE int main(void) { return 42; } @@ -14,13 +18,21 @@ // CHECK: 0x[[TOOL:.+]] | LF_STRING_ID [size = {{.+}}] ID: , String: [[TOOLVAL:.+[\\/]clang.*]] // CHECK: 0x[[CMDLINE:.+]] | LF_STRING_ID [size = {{.+}}] ID: , String: "-cc1 // CHECK: 0x{{.+}} | LF_BUILDINFO [size = {{.+}}] -// CHECK: 0x[[PWD]]: `[[PWDVAL]]` -// CHECK: 0x[[TOOL]]: `[[TOOLVAL]]` -// CHECK: 0x[[FILEPATH]]: `[[FILEPATHVAL]]` -// CHECK: 0x[[ZIPDB]]: `` -// CHECK: 0x[[CMDLINE]]: `"-cc1 +// CHECK-NEXT: 0x[[PWD]]: `[[PWDVAL]]` +// CHECK-NEXT: 0x[[TOOL]]: `[[TOOLVAL]]` +// CHECK-NEXT: 0x[[FILEPATH]]: `[[FILEPATHVAL]]` +// CHECK-NEXT: 0x[[ZIPDB]]: `` +// CHECK-NEXT: 0x[[CMDLINE]]: `"-cc1 // RELATIVE: Types (.debug$T) // RELATIVE: ============================================================ // RELATIVE: 0x{{.+}} | LF_BUILDINFO [size = {{.+}}] // RELATIVE: 0x{{.+}}: `.` + +// DISABLE-NOT: cc1 +// DISABLE: 0x{{.+}} | LF_BUILDINFO [size = {{.+}}] +// DISABLE-NEXT: 0x{{.+}}: `{{.*}}` +// DISABLE-NEXT: : `` +// DISABLE-NEXT: 0x{{.+}}: `{{.*}}` +// DISABLE-NEXT: 0x{{.+}}: `` +// DISABLE-NEXT: : `` diff --git a/clang/test/Driver/gcodeview-command-line.c b/clang/test/Driver/gcodeview-command-line.c new file mode 100644 --- /dev/null +++ b/clang/test/Driver/gcodeview-command-line.c @@ -0,0 +1,19 @@ +// Note: %s must be preceded by --, otherwise it may be interpreted as a +// command-line option, e.g. on Mac where %s is commonly under /Users. + +// ON-NOT: "-gno-codview-commandline" +// OFF: "-gno-codeview-command-line" + +// default +// RUN: %clang_cl /Z7 -### -- %s 2>&1 | FileCheck -check-prefix=ON %s +// enabled +// RUN: %clang_cl /Z7 -gno-codeview-command-line -gcodeview-command-line -### -- %s 2>&1 | FileCheck -check-prefix=ON %s +// disabled +// RUN: %clang_cl /Z7 -gcodeview-command-line -gno-codeview-command-line -### -- %s 2>&1 | FileCheck -check-prefix=OFF %s + +// enabled, no /Z7 +// RUN: %clang_cl -gcodeview-command-line -### -- %s 2>&1 | FileCheck -check-prefix=ON %s + +// GCC-style driver +// RUN: %clang -g -gcodeview -gno-codeview-command-line -gcodeview-command-line -### -- %s 2>&1 | FileCheck -check-prefix=ON %s +// RUN: %clang -g -gcodeview -gcodeview-command-line -gno-codeview-command-line -### -- %s 2>&1 | FileCheck -check-prefix=OFF %s