-g is an IR generation option while -gsplit-dwarf is an object file generation option.
For -gsplit-dwarf in the backend phase of a distributed ThinLTO (-fthinlto-index=) which does object file generation and no IR generation, -g should not be needed.
This patch makes -fthinlto-index= -gsplit-dwarf emit .dwo even in the absence of -g.
This should fix https://crbug.com/1158215 after D80391.
// 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
Note: for implicit regular/Thin LTO, .dwo emission works without this patch:
clang -flto=thin -gsplit-dwarf a.o b.o passes -plugin-opt=dwo_dir= to the linker.
The linker forwards the option to LTO. LTOBackend.cpp emits $dwo_dir/[0123...].dwo.
Better to simply check if the input type is IR/BC via types::isLLVMIR(Input.getType()). Technically you don't need ThinLTO to do a clang compile with bitcode input. Looks like Input can be passed down from the caller.