Skip to content

Commit

Permalink
[clang] Don't add DWARF debug info when assembling .s with clang-cl /…
Browse files Browse the repository at this point in the history
…Z7 (#106686)

This fixes a regression from f58330c.

That commit changed the clang-cl options /Zi and /Z7 to be implemented
as aliases of -g rather than having separate handling.

This had the unintended effect, that when assembling .s files with
clang-cl, the /Z7 option (which implies using CodeView debug info) was
treated as a -g option, which causes `ClangAs::ConstructJob` to pick up
the option as part of `Args.getLastArg(options::OPT_g_Group)`, which
sets the `WantDebug` variable.

Within `Clang::ConstructJob`, we check for whether explicit `-gdwarf` or
`-gcodeview` options have been set, and if not, we pick the default
debug format for the current toolchain. However, in `ClangAs`, if debug
info has been enabled, it always adds DWARF debug info.

Add similar logic in `ClangAs` - check if the user has explicitly
requested either DWARF or CodeView, otherwise look up the toolchain
default. If we (either implicitly or explicitly) should be producing
CodeView, don't enable the default `ClangAs` DWARF generation.

This fixes the issue, where assembling a single `.s` file with clang-cl,
with the /Z7 option, causes the file to contain some DWARF sections.
This causes the output executable to contain DWARF, in addition to the
separate intended main PDB file.

By having the output executable contain DWARF sections, LLDB only looks
at the (very little) DWARF info in the executable, rather than looking
for a separate standalone PDB file. This caused an issue with LLDB's
tests, #101710.

(cherry picked from commit fcb7b39)
  • Loading branch information
mstorsjo authored and tru committed Sep 18, 2024
1 parent a4bf6cd commit 6407583
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 1 deletion.
26 changes: 26 additions & 0 deletions clang/lib/Driver/ToolChains/Clang.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8561,6 +8561,32 @@ void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
WantDebug = !A->getOption().matches(options::OPT_g0) &&
!A->getOption().matches(options::OPT_ggdb0);

// If a -gdwarf argument appeared, remember it.
bool EmitDwarf = false;
if (const Arg *A = getDwarfNArg(Args))
EmitDwarf = checkDebugInfoOption(A, Args, D, getToolChain());

bool EmitCodeView = false;
if (const Arg *A = Args.getLastArg(options::OPT_gcodeview))
EmitCodeView = checkDebugInfoOption(A, Args, D, getToolChain());

// If the user asked for debug info but did not explicitly specify -gcodeview
// or -gdwarf, ask the toolchain for the default format.
if (!EmitCodeView && !EmitDwarf && WantDebug) {
switch (getToolChain().getDefaultDebugFormat()) {
case llvm::codegenoptions::DIF_CodeView:
EmitCodeView = true;
break;
case llvm::codegenoptions::DIF_DWARF:
EmitDwarf = true;
break;
}
}

// If the arguments don't imply DWARF, don't emit any debug info here.
if (!EmitDwarf)
WantDebug = false;

llvm::codegenoptions::DebugInfoKind DebugInfoKind =
llvm::codegenoptions::NoDebugInfo;

Expand Down
17 changes: 16 additions & 1 deletion clang/test/Driver/debug-options-as.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,27 @@
// GGDB0-NOT: -debug-info-kind=

// Check to make sure clang with -g on a .s file gets passed.
// RUN: %clang -### -c -integrated-as -g -x assembler %s 2>&1 \
// This requires a target that defaults to DWARF.
// RUN: %clang -### --target=x86_64-linux-gnu -c -integrated-as -g -x assembler %s 2>&1 \
// RUN: | FileCheck %s
//
// CHECK: "-cc1as"
// CHECK: "-debug-info-kind=constructor"

// Check that a plain -g, without any -gdwarf, for a MSVC target, doesn't
// trigger producing DWARF output.
// RUN: %clang -### --target=x86_64-windows-msvc -c -integrated-as -g -x assembler %s 2>&1 \
// RUN: | FileCheck -check-prefix=MSVC %s
//
// MSVC: "-cc1as"
// MSVC-NOT: "-debug-info-kind=constructor"

// Check that clang-cl with the -Z7 option works the same, not triggering
// any DWARF output.
//
// RUN: %clang_cl -### --target=x86_64-pc-windows-msvc -c -Z7 -x assembler -- %s 2>&1 \
// RUN: | FileCheck -check-prefix=MSVC %s

// Check to make sure clang with -g on a .s file gets passed -dwarf-debug-producer.
// RUN: %clang -### -c -integrated-as -g -x assembler %s 2>&1 \
// RUN: | FileCheck -check-prefix=P %s
Expand Down

0 comments on commit 6407583

Please sign in to comment.