From 29a500b346bdd998cac237f8570c6957730e086a Mon Sep 17 00:00:00 2001 From: Arthur Eubanks Date: Fri, 21 Oct 2022 11:05:04 -0700 Subject: [PATCH] [CodeView][clang] Add flag to disable emitting command line into CodeView In https://reviews.llvm.org/D80833, there were concerns about determinism emitting the commandline into CodeView. We're actually hitting these when running clang-cl on Linux (cross compiling) versus on Windows (e.g. -fmessage-length being inferred on terminals). Add -g[no-]codeview-command-line to enable/disable this feature. It's still on by default to preserve the current state of clang. Reviewed By: thakis, rnk Differential Revision: https://reviews.llvm.org/D136474 --- clang/include/clang/Basic/CodeGenOptions.def | 3 +++ clang/include/clang/Driver/Options.td | 5 +++++ clang/lib/Driver/ToolChains/Clang.cpp | 5 +++++ clang/lib/Frontend/CompilerInvocation.cpp | 6 ++++-- clang/test/CodeGen/debug-info-codeview-buildinfo.c | 22 +++++++++++++++++----- clang/test/Driver/gcodeview-command-line.c | 19 +++++++++++++++++++ 6 files changed, 53 insertions(+), 7 deletions(-) create mode 100644 clang/test/Driver/gcodeview-command-line.c diff --git a/clang/include/clang/Basic/CodeGenOptions.def b/clang/include/clang/Basic/CodeGenOptions.def index 62d0c93..258ba12 100644 --- a/clang/include/clang/Basic/CodeGenOptions.def +++ b/clang/include/clang/Basic/CodeGenOptions.def @@ -401,6 +401,9 @@ CODEGENOPT(EmitCodeView, 1, 0) /// 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 index 679c565..d660a2b 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -3186,6 +3186,11 @@ defm codeview_ghash : BoolOption<"g", "codeview-ghash", 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 index 1abe8fe..160eb1f 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -4315,9 +4315,14 @@ static void renderDebugOptions(const ToolChain &TC, const Driver &D, 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 index 9cd6d86..6b88080 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -4546,8 +4546,10 @@ bool CompilerInvocation::CreateFromArgsImpl( } // 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 index 2c82ee8..71c0e7b 100644 --- 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 @@ int main(void) { return 42; } // 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 index 0000000..da8708a --- /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 -- 2.7.4