[clang] 29a500b - [CodeView][clang] Add flag to disable emitting command line into CodeView
Arthur Eubanks via cfe-commits
cfe-commits at lists.llvm.org
Tue Nov 1 13:08:11 PDT 2022
Author: Arthur Eubanks
Date: 2022-11-01T13:04:37-07:00
New Revision: 29a500b346bdd998cac237f8570c6957730e086a
URL: https://github.com/llvm/llvm-project/commit/29a500b346bdd998cac237f8570c6957730e086a
DIFF: https://github.com/llvm/llvm-project/commit/29a500b346bdd998cac237f8570c6957730e086a.diff
LOG: [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
Added:
clang/test/Driver/gcodeview-command-line.c
Modified:
clang/include/clang/Basic/CodeGenOptions.def
clang/include/clang/Driver/Options.td
clang/lib/Driver/ToolChains/Clang.cpp
clang/lib/Frontend/CompilerInvocation.cpp
clang/test/CodeGen/debug-info-codeview-buildinfo.c
Removed:
################################################################################
diff --git a/clang/include/clang/Basic/CodeGenOptions.def b/clang/include/clang/Basic/CodeGenOptions.def
index 62d0c936c60a5..258ba1298f90c 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 679c565126fca..d660a2b886033 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<SetTrue, [CC1Option], "Emit type record hashes in a .debug$H section">,
NegFlag<SetFalse>, BothFlags<[CoreOption]>>;
+defm codeview_command_line : BoolOption<"g", "codeview-command-line",
+ CodeGenOpts<"CodeViewCommandLine">, DefaultTrue,
+ PosFlag<SetTrue, [], "Emit compiler path and command line into CodeView debug information">,
+ NegFlag<SetFalse, [], "Don't emit compiler path and command line into CodeView debug information">,
+ BothFlags<[CoreOption, CC1Option]>>;
defm inline_line_tables : BoolGOption<"inline-line-tables",
CodeGenOpts<"NoInlineLineTables">, DefaultFalse,
NegFlag<SetTrue, [CC1Option], "Don't emit inline line tables.">,
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp
index 1abe8fe077727..160eb1f23fba2 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 9cd6d86b40163..6b8808078cd6c 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 2c82ee83d12bf..71c0e7b6f6ac2 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: <no type>, String: [[TOOLVAL:.+[\\/]clang.*]]
// CHECK: 0x[[CMDLINE:.+]] | LF_STRING_ID [size = {{.+}}] ID: <no type>, 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: <no type>: ``
+// DISABLE-NEXT: 0x{{.+}}: `{{.*}}`
+// DISABLE-NEXT: 0x{{.+}}: ``
+// DISABLE-NEXT: <no type>: ``
diff --git a/clang/test/Driver/gcodeview-command-line.c b/clang/test/Driver/gcodeview-command-line.c
new file mode 100644
index 0000000000000..da8708af32248
--- /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
More information about the cfe-commits
mailing list