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.
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.
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits