[PATCH] D94647: [Driver] -gsplit-dwarf: Produce .dwo regardless of -gN if -fthinlto-index= is specified

Fangrui Song via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed Jan 13 19:34:37 PST 2021


MaskRay created this revision.
MaskRay added reviewers: dblaikie, inglorion, thakis.
Herald added a subscriber: arphaman.
MaskRay requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

-g is an IR generation option while -gsplit-dwarf is an object file generation option.
-gsplit-dwarf should not be needed for ThinLTO backend compile, which does object file generation.

`-fthinlto-index= -gsplit-dwarf` emits .dwo even in the absence of -g.
This should fix https://crbug.com/1158215

  // Distributed ThinLTO usage
  clang -g -O2 -c -flto=thin -fthin-link-bitcode=a.indexing.o a.c
  clang -g -O2 -c -flto=thin -fthin-link-bitcode=b.indexing.o b.c
  clang -fuse-ld=lld -Wl,--thinlto-index-only=a.rsp -Wl,--thinlto-prefix-replace=';lto/' -Wl,--thinlto-object-suffix-replace='.indexing.o;.o' a.indexing.o b.indexing.o
  clang -gsplit-dwarf -O2 -c -fthinlto-index=lto/a.o.thinlto.bc a.o -o lto/a.o
  clang -gsplit-dwarf -O2 -c -fthinlto-index=lto/b.o.thinlto.bc b.o -o lto/b.o
  clang -fuse-ld=lld @a.rsp -o exe


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D94647

Files:
  clang/lib/Driver/ToolChains/Clang.cpp
  clang/test/Driver/split-debug.c


Index: clang/test/Driver/split-debug.c
===================================================================
--- clang/test/Driver/split-debug.c
+++ clang/test/Driver/split-debug.c
@@ -24,6 +24,14 @@
 /// -gsplit-dwarf is a no-op if no -g is specified.
 // RUN: %clang -### -c -target x86_64 -gsplit-dwarf %s 2>&1 | FileCheck %s --check-prefix=G0
 
+/// ... unless -fthinlto-index= is specified.
+// RUN: echo > %t.bc
+// RUN: %clang -### -c -target x86_64 -fthinlto-index=dummy -gsplit-dwarf %t.bc 2>&1 | FileCheck %s --check-prefix=THINLTO
+
+// THINLTO-NOT:  "-debug-info-kind=
+// THINLTO:      "-ggnu-pubnames"
+// THINLTO-SAME: "-split-dwarf-file" "{{.*}}.dwo" "-split-dwarf-output" "{{.*}}.dwo"
+
 /// -gno-split-dwarf disables debug fission.
 // RUN: %clang -### -c -target x86_64 -gsplit-dwarf -g -gno-split-dwarf %s 2>&1 | FileCheck %s --check-prefix=NOSPLIT
 // RUN: %clang -### -c -target x86_64 -gsplit-dwarf=single -g -gno-split-dwarf %s 2>&1 | FileCheck %s --check-prefix=NOSPLIT
Index: clang/lib/Driver/ToolChains/Clang.cpp
===================================================================
--- clang/lib/Driver/ToolChains/Clang.cpp
+++ clang/lib/Driver/ToolChains/Clang.cpp
@@ -3754,7 +3754,11 @@
       Args.hasFlag(options::OPT_fsplit_dwarf_inlining,
                    options::OPT_fno_split_dwarf_inlining, false);
 
-  if (const Arg *A = Args.getLastArg(options::OPT_g_Group)) {
+  // Normally -gsplit-dwarf is only useful with -g. -fthinlto-index= reads in
+  // bitcode files (which may be compiled with -g) and emits an object file.
+  // Allow -gsplit-dwarf with -fthinlto-index= as well.
+  if (Args.hasArg(options::OPT_g_Group) ||
+      Args.hasArg(options::OPT_fthinlto_index_EQ)) {
     Arg *SplitDWARFArg;
     DwarfFission = getDebugFissionKind(D, Args, SplitDWARFArg);
     if (DwarfFission != DwarfFissionKind::None &&
@@ -3762,7 +3766,8 @@
       DwarfFission = DwarfFissionKind::None;
       SplitDWARFInlining = false;
     }
-
+  }
+  if (const Arg *A = Args.getLastArg(options::OPT_g_Group)) {
     DebugInfoKind = codegenoptions::LimitedDebugInfo;
 
     // If the last option explicitly specified a debug-info level, use it.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D94647.316555.patch
Type: text/x-patch
Size: 2167 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20210114/76d01e4b/attachment.bin>


More information about the cfe-commits mailing list