Skip to content

Commit 0a7dfb2

Browse files
authored
Rollup merge of rust-lang#104105 - davidtwco:split-dwarf-lto, r=michaelwoerister
llvm: dwo only emitted when object code emitted Fixes rust-lang#103932. `CompiledModule` should not think a DWARF object was emitted when a bitcode-only compilation has happened, this can confuse archive file creation (which expects to create an archive containing non-existent dwo files). r? `@michaelwoerister`
2 parents a3c0a02 + 29dc083 commit 0a7dfb2

File tree

3 files changed

+210
-17
lines changed

3 files changed

+210
-17
lines changed

compiler/rustc_codegen_llvm/src/back/write.rs

+13-3
Original file line numberDiff line numberDiff line change
@@ -765,11 +765,21 @@ pub(crate) unsafe fn codegen(
765765
drop(handlers);
766766
}
767767

768+
// `.dwo` files are only emitted if:
769+
//
770+
// - Object files are being emitted (i.e. bitcode only or metadata only compilations will not
771+
// produce dwarf objects, even if otherwise enabled)
772+
// - Target supports Split DWARF
773+
// - Split debuginfo is enabled
774+
// - Split DWARF kind is `split` (i.e. debuginfo is split into `.dwo` files, not different
775+
// sections in the `.o` files).
776+
let dwarf_object_emitted = matches!(config.emit_obj, EmitObj::ObjectCode(_))
777+
&& cgcx.target_can_use_split_dwarf
778+
&& cgcx.split_debuginfo != SplitDebuginfo::Off
779+
&& cgcx.split_dwarf_kind == SplitDwarfKind::Split;
768780
Ok(module.into_compiled_module(
769781
config.emit_obj != EmitObj::None,
770-
cgcx.target_can_use_split_dwarf
771-
&& cgcx.split_debuginfo != SplitDebuginfo::Off
772-
&& cgcx.split_dwarf_kind == SplitDwarfKind::Split,
782+
dwarf_object_emitted,
773783
config.emit_bc,
774784
&cgcx.output_filenames,
775785
))

src/test/run-make-fulldeps/split-debuginfo/Makefile

+196-14
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ include ../tools.mk
33
all: off packed unpacked
44

55
ifeq ($(UNAME),Darwin)
6-
# If disabled, don't run dsymutil
6+
# If disabled, don't run `dsymutil`.
77
off:
88
rm -rf $(TMPDIR)/*.dSYM
99
$(RUSTC) foo.rs -g -C split-debuginfo=off
@@ -29,98 +29,280 @@ unpacked:
2929
[ ! -d $(TMPDIR)/foo.dSYM ]
3030
else
3131
ifdef IS_WINDOWS
32-
# Windows only supports =packed
32+
# Windows only supports packed debuginfo - nothing to test.
3333
off:
3434
packed:
3535
unpacked:
3636
else
37+
# Some non-Windows, non-Darwin platforms are not stable, and some are.
3738
ifeq ($(UNAME),Linux)
3839
UNSTABLEOPTS :=
3940
else
4041
UNSTABLEOPTS := -Zunstable-options
4142
endif
4243

44+
# - Debuginfo in `.o` files
45+
# - `.o` deleted
46+
# - `.dwo` never created
47+
# - `.dwp` never created
4348
off:
4449
$(RUSTC) foo.rs -g -C $(UNSTABLEOPTS) split-debuginfo=off
4550
[ ! -f $(TMPDIR)/*.dwp ]
4651
[ ! -f $(TMPDIR)/*.dwo ]
47-
4852
$(RUSTC) foo.rs -g
4953
[ ! -f $(TMPDIR)/*.dwp ]
5054
[ ! -f $(TMPDIR)/*.dwo ]
5155

52-
packed: packed-split packed-single
56+
packed: packed-split packed-single packed-lto packed-remapped packed-crosscrate
5357

58+
# - Debuginfo in `.dwo` files
59+
# - `.o` deleted
60+
# - `.dwo` deleted
61+
# - `.dwp` present
5462
packed-split:
5563
$(RUSTC) foo.rs -g $(UNSTABLEOPTS) -C split-debuginfo=packed -Zsplit-dwarf-kind=split
56-
ls $(TMPDIR)/*.dwp
57-
rm -rf $(TMPDIR)/*.dwp $(TMPDIR)/*.dwo
64+
ls $(TMPDIR)/*.o && exit 1 || exit 0
65+
ls $(TMPDIR)/*.dwo && exit 1 || exit 0
66+
rm $(TMPDIR)/foo.dwp
67+
rm $(TMPDIR)/$(call BIN,foo)
5868

69+
# - Debuginfo in `.o` files
70+
# - `.o` deleted
71+
# - `.dwo` never created
72+
# - `.dwp` present
5973
packed-single:
6074
$(RUSTC) foo.rs -g $(UNSTABLEOPTS) -C split-debuginfo=packed -Zsplit-dwarf-kind=single
61-
ls $(TMPDIR)/*.dwp
75+
ls $(TMPDIR)/*.o && exit 1 || exit 0
76+
ls $(TMPDIR)/*.dwo && exit 1 || exit 0
77+
rm $(TMPDIR)/foo.dwp
78+
rm $(TMPDIR)/$(call BIN,foo)
79+
80+
packed-lto: packed-lto-split packed-lto-single
81+
82+
# - rmeta file added to rlib, no object files are generated and thus no debuginfo is generated
83+
# - `.o` never created
84+
# - `.dwo` never created
85+
# - `.dwp` never created
86+
packed-lto-split:
87+
$(RUSTC) baz.rs -g $(UNSTABLEOPTS) -Csplit-debuginfo=packed -Zsplit-dwarf-kind=split \
88+
--crate-type=rlib -Clinker-plugin-lto
89+
ls $(TMPDIR)/*.o && exit 1 || exit 0
90+
ls $(TMPDIR)/*.dwo && exit 1 || exit 0
91+
ls $(TMPDIR)/*.dwp && exit 1 || exit 0
92+
rm $(TMPDIR)/libbaz.rlib
93+
94+
# - rmeta file added to rlib, no object files are generated and thus no debuginfo is generated
95+
# - `.o` never created
96+
# - `.dwo` never created
97+
# - `.dwp` never created
98+
packed-lto-single:
99+
$(RUSTC) baz.rs -g $(UNSTABLEOPTS) -Csplit-debuginfo=packed -Zsplit-dwarf-kind=single \
100+
--crate-type=rlib -Clinker-plugin-lto
101+
ls $(TMPDIR)/*.o && exit 1 || exit 0
62102
ls $(TMPDIR)/*.dwo && exit 1 || exit 0
63-
rm -rf $(TMPDIR)/*.dwp
103+
ls $(TMPDIR)/*.dwp && exit 1 || exit 0
104+
rm $(TMPDIR)/libbaz.rlib
64105

65106
packed-remapped: packed-remapped-split packed-remapped-single
66107

108+
# - Debuginfo in `.dwo` files
109+
# - `.o` and binary refer to remapped `.dwo` paths which do not exist
110+
# - `.o` deleted
111+
# - `.dwo` deleted
112+
# - `.dwp` present
67113
packed-remapped-split:
68114
$(RUSTC) $(UNSTABLEOPTS) -C split-debuginfo=packed -C debuginfo=2 \
69115
-Z split-dwarf-kind=split --remap-path-prefix $(TMPDIR)=/a foo.rs -g
70116
objdump -Wi $(TMPDIR)/foo | grep DW_AT_GNU_dwo_name | (! grep $(TMPDIR)) || exit 1
117+
ls $(TMPDIR)/*.o && exit 1 || exit 0
118+
ls $(TMPDIR)/*.dwo && exit 1 || exit 0
119+
rm $(TMPDIR)/foo.dwp
120+
rm $(TMPDIR)/$(call BIN,foo)
71121

122+
# - Debuginfo in `.o` files
123+
# - `.o` and binary refer to remapped `.o` paths which do not exist
124+
# - `.o` deleted
125+
# - `.dwo` never created
126+
# - `.dwp` present
72127
packed-remapped-single:
73128
$(RUSTC) $(UNSTABLEOPTS) -C split-debuginfo=packed -C debuginfo=2 \
74129
-Z split-dwarf-kind=single --remap-path-prefix $(TMPDIR)=/a foo.rs -g
75130
objdump -Wi $(TMPDIR)/foo | grep DW_AT_GNU_dwo_name | (! grep $(TMPDIR)) || exit 1
131+
ls $(TMPDIR)/*.o && exit 1 || exit 0
132+
ls $(TMPDIR)/*.dwo && exit 1 || exit 0
133+
rm $(TMPDIR)/foo.dwp
134+
rm $(TMPDIR)/$(call BIN,foo)
76135

77136
packed-crosscrate: packed-crosscrate-split packed-crosscrate-single
78137

138+
# - Debuginfo in `.dwo` files
139+
# - (bar) `.rlib` file created, contains `.dwo`
140+
# - (bar) `.o` deleted
141+
# - (bar) `.dwo` deleted
142+
# - (bar) `.dwp` never created
143+
# - (main) `.o` deleted
144+
# - (main) `.dwo` deleted
145+
# - (main) `.dwp` present
79146
packed-crosscrate-split:
80147
$(RUSTC) --crate-type lib $(UNSTABLEOPTS) -C split-debuginfo=packed \
81148
-Zsplit-dwarf-kind=split -C debuginfo=2 -g bar.rs
82149
ls $(TMPDIR)/*.rlib
150+
ls $(TMPDIR)/*.o && exit 1 || exit 0
83151
ls $(TMPDIR)/*.dwo && exit 1 || exit 0
84152
ls $(TMPDIR)/*.dwp && exit 1 || exit 0
85-
$(RUSTC) --extern bar=$(TMPDIR)/libbar.rlib -Z unstable-options $(UNSTABLEOPTS) \
153+
$(RUSTC) --extern bar=$(TMPDIR)/libbar.rlib $(UNSTABLEOPTS) \
86154
-C split-debuginfo=packed -Zsplit-dwarf-kind=split -C debuginfo=2 -g main.rs
87-
rm $(TMPDIR)/*.dwo
155+
ls $(TMPDIR)/*.o && exit 1 || exit 0
156+
ls $(TMPDIR)/*.dwo && exit 1 || exit 0
88157
rm $(TMPDIR)/main.dwp
89158
rm $(TMPDIR)/$(call BIN,main)
90159

160+
# - Debuginfo in `.o` files
161+
# - (bar) `.rlib` file created, contains `.o`
162+
# - (bar) `.o` deleted
163+
# - (bar) `.dwo` never created
164+
# - (bar) `.dwp` never created
165+
# - (main) `.o` deleted
166+
# - (main) `.dwo` never created
167+
# - (main) `.dwp` present
91168
packed-crosscrate-single:
92169
$(RUSTC) --crate-type lib $(UNSTABLEOPTS) -C split-debuginfo=packed \
93170
-Zsplit-dwarf-kind=single -C debuginfo=2 -g bar.rs
94171
ls $(TMPDIR)/*.rlib
172+
ls $(TMPDIR)/*.o && exit 1 || exit 0
95173
ls $(TMPDIR)/*.dwo && exit 1 || exit 0
96174
ls $(TMPDIR)/*.dwp && exit 1 || exit 0
97-
$(RUSTC) --extern bar=$(TMPDIR)/libbar.rlib -Z unstable-options $(UNSTABLEOPTS) \
175+
$(RUSTC) --extern bar=$(TMPDIR)/libbar.rlib $(UNSTABLEOPTS) \
98176
-C split-debuginfo=packed -Zsplit-dwarf-kind=single -C debuginfo=2 -g main.rs
177+
ls $(TMPDIR)/*.o && exit 1 || exit 0
99178
ls $(TMPDIR)/*.dwo && exit 1 || exit 0
100179
rm $(TMPDIR)/main.dwp
101180
rm $(TMPDIR)/$(call BIN,main)
102181

103-
unpacked: unpacked-split unpacked-single unpacked-remapped-split unpacked-remapped-single
182+
unpacked: unpacked-split unpacked-single unpacked-lto unpacked-remapped unpacked-crosscrate
104183

184+
# - Debuginfo in `.dwo` files
185+
# - `.o` deleted
186+
# - `.dwo` present
187+
# - `.dwp` never created
105188
unpacked-split:
106189
$(RUSTC) foo.rs -g $(UNSTABLEOPTS) -C split-debuginfo=unpacked -Zsplit-dwarf-kind=split
190+
ls $(TMPDIR)/*.o && exit 1 || exit 0
191+
rm $(TMPDIR)/*.dwo
107192
ls $(TMPDIR)/*.dwp && exit 1 || exit 0
108-
ls $(TMPDIR)/*.dwo
109-
rm -rf $(TMPDIR)/*.dwp $(TMPDIR)/*.dwo
193+
rm $(TMPDIR)/$(call BIN,foo)
110194

195+
# - Debuginfo in `.o` files
196+
# - `.o` present
197+
# - `.dwo` never created
198+
# - `.dwp` never created
111199
unpacked-single:
112200
$(RUSTC) foo.rs -g $(UNSTABLEOPTS) -C split-debuginfo=unpacked -Zsplit-dwarf-kind=single
201+
ls $(TMPDIR)/*.o
202+
ls $(TMPDIR)/*.dwo && exit 1 || exit 0
203+
ls $(TMPDIR)/*.dwp && exit 1 || exit 0
204+
rm $(TMPDIR)/$(call BIN,foo)
205+
206+
unpacked-lto: packed-lto-split packed-lto-single
207+
208+
# - rmeta file added to rlib, no object files are generated and thus no debuginfo is generated
209+
# - `.o` never created
210+
# - `.dwo` never created
211+
# - `.dwp` never created
212+
unpacked-lto-split:
213+
$(RUSTC) baz.rs -g $(UNSTABLEOPTS) -Csplit-debuginfo=unpacked -Zsplit-dwarf-kind=split \
214+
--crate-type=rlib -Clinker-plugin-lto
215+
ls $(TMPDIR)/*.o && exit 1 || exit 0
216+
ls $(TMPDIR)/*.dwo && exit 1 || exit 0
113217
ls $(TMPDIR)/*.dwp && exit 1 || exit 0
218+
rm $(TMPDIR)/libbaz.rlib
219+
220+
# - rmeta file added to rlib, no object files are generated and thus no debuginfo is generated
221+
# - `.o` never created
222+
# - `.dwo` never created
223+
# - `.dwp` never created
224+
unpacked-lto-single:
225+
$(RUSTC) baz.rs -g $(UNSTABLEOPTS) -Csplit-debuginfo=unpacked -Zsplit-dwarf-kind=single \
226+
--crate-type=rlib -Clinker-plugin-lto
227+
ls $(TMPDIR)/*.o && exit 1 || exit 0
114228
ls $(TMPDIR)/*.dwo && exit 1 || exit 0
229+
ls $(TMPDIR)/*.dwp && exit 1 || exit 0
230+
rm $(TMPDIR)/libbaz.rlib
231+
232+
unpacked-remapped: unpacked-remapped-split unpacked-remapped-single
115233

234+
# - Debuginfo in `.dwo` files
235+
# - `.o` and binary refer to remapped `.dwo` paths which do not exist
236+
# - `.o` deleted
237+
# - `.dwo` present
238+
# - `.dwp` never created
116239
unpacked-remapped-split:
117240
$(RUSTC) $(UNSTABLEOPTS) -C split-debuginfo=unpacked -C debuginfo=2 \
118241
-Z split-dwarf-kind=split --remap-path-prefix $(TMPDIR)=/a foo.rs -g
119242
objdump -Wi $(TMPDIR)/foo | grep DW_AT_GNU_dwo_name | (! grep $(TMPDIR)) || exit 1
243+
ls $(TMPDIR)/*.o && exit 1 || exit 0
244+
rm $(TMPDIR)/*.dwo
245+
ls $(TMPDIR)/*.dwp && exit 1 || exit 0
246+
rm $(TMPDIR)/$(call BIN,foo)
120247

248+
# - Debuginfo in `.o` files
249+
# - `.o` and binary refer to remapped `.o` paths which do not exist
250+
# - `.o` present
251+
# - `.dwo` never created
252+
# - `.dwp` never created
121253
unpacked-remapped-single:
122254
$(RUSTC) $(UNSTABLEOPTS) -C split-debuginfo=unpacked -C debuginfo=2 \
123255
-Z split-dwarf-kind=single --remap-path-prefix $(TMPDIR)=/a foo.rs -g
124256
objdump -Wi $(TMPDIR)/foo | grep DW_AT_GNU_dwo_name | (! grep $(TMPDIR)) || exit 1
257+
ls $(TMPDIR)/*.o
258+
ls $(TMPDIR)/*.dwo && exit 1 || exit 0
259+
ls $(TMPDIR)/*.dwp && exit 1 || exit 0
260+
rm $(TMPDIR)/$(call BIN,foo)
261+
262+
unpacked-crosscrate: packed-crosscrate-split packed-crosscrate-single
263+
264+
# - Debuginfo in `.dwo` files
265+
# - (bar) `.rlib` file created, contains `.dwo`
266+
# - (bar) `.o` deleted
267+
# - (bar) `.dwo` present
268+
# - (bar) `.dwp` never created
269+
# - (main) `.o` deleted
270+
# - (main) `.dwo` present
271+
# - (main) `.dwp` never created
272+
unpacked-crosscrate-split:
273+
$(RUSTC) --crate-type lib $(UNSTABLEOPTS) -C split-debuginfo=unpacked \
274+
-Zsplit-dwarf-kind=split -C debuginfo=2 -g bar.rs
275+
ls $(TMPDIR)/*.rlib
276+
ls $(TMPDIR)/*.o && exit 1 || exit 0
277+
ls $(TMPDIR)/*.dwo
278+
ls $(TMPDIR)/*.dwp && exit 1 || exit 0
279+
$(RUSTC) --extern bar=$(TMPDIR)/libbar.rlib $(UNSTABLEOPTS) \
280+
-C split-debuginfo=unpacked -Zsplit-dwarf-kind=split -C debuginfo=2 -g main.rs
281+
ls $(TMPDIR)/*.o && exit 1 || exit 0
282+
rm $(TMPDIR)/*.dwo
283+
ls $(TMPDIR)/*.dwp && exit 1 || exit 0
284+
rm $(TMPDIR)/$(call BIN,main)
285+
286+
# - Debuginfo in `.o` files
287+
# - (bar) `.rlib` file created, contains `.o`
288+
# - (bar) `.o` present
289+
# - (bar) `.dwo` never created
290+
# - (bar) `.dwp` never created
291+
# - (main) `.o` present
292+
# - (main) `.dwo` never created
293+
# - (main) `.dwp` never created
294+
unpacked-crosscrate-single:
295+
$(RUSTC) --crate-type lib $(UNSTABLEOPTS) -C split-debuginfo=unpacked \
296+
-Zsplit-dwarf-kind=single -C debuginfo=2 -g bar.rs
297+
ls $(TMPDIR)/*.rlib
298+
ls $(TMPDIR)/*.o
299+
ls $(TMPDIR)/*.dwo && exit 1 || exit 0
300+
ls $(TMPDIR)/*.dwp && exit 1 || exit 0
301+
$(RUSTC) --extern bar=$(TMPDIR)/libbar.rlib $(UNSTABLEOPTS) \
302+
-C split-debuginfo=unpacked -Zsplit-dwarf-kind=single -C debuginfo=2 -g main.rs
303+
ls $(TMPDIR)/*.o
304+
ls $(TMPDIR)/*.dwo && exit 1 || exit 0
305+
ls $(TMPDIR)/*.dwp && exit 1 || exit 0
306+
rm $(TMPDIR)/$(call BIN,main)
125307
endif
126308
endif
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
// empty

0 commit comments

Comments
 (0)