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 @@ -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. diff --git a/clang/test/Driver/split-debug.c b/clang/test/Driver/split-debug.c --- a/clang/test/Driver/split-debug.c +++ b/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