Stabilize -Zdwarf-version
as -Cdwarf-version
by wesleywiser · Pull Request #136926 · rust-lang/rust (original) (raw)
I propose stabilizing -Zdwarf-version
as -Cdwarf-version
. This PR adds a new -Cdwarf-version
flag, leaving the unstable -Z
flag as is to ease the transition period. The -Z
flag will be removed in the future.
-Zdwarf-version
stabilization report
What is the RFC for this feature and what changes have occurred to the user-facing design since the RFC was finalized?
No RFC/MCP, this flag was added in #98350 and was not deemed large enough to require additional process.
The tracking issue for this feature is #103057.
What behavior are we committing to that has been controversial? Summarize the major arguments pro/con.
None that has been extensively debated but there are a few questions that could have been chosen differently:
- What should the flag name be?
The current flag name is very specific to DWARF. Other debuginfo formats exist (msvc's CodeView format or https://en.wikipedia.org/wiki/Stabs) so we could have chosen to generalize the flag name (-{C,Z} debuginfo-version=dwarf-5
for example). While this would extend cleanly to support formats other than DWARF, there are some downsides to this design. Neither CodeView nor Stabs have specification or format versions so it's not clear what values would be supported beyonddwarf-{2,3,4,5}
orcodeview
. We would also need to take care to ensure the name does not lead users to think they can pick a format other than one supported by the target. For instance, what would--target x86_64-pc-windows-msvc -Cdebuginfo-version=dwarf-5
do? - What is the behavior when flag is used on targets that do not support DWARF?
Currently, passing-{C,Z} dwarf-version
on targets like*-windows-msvc
does not do anything. It may be preferable to emit a warning alerting the user that the flag has no effect on the target platform. Alternatively, we could emit an error but this could be annoying since it would require the use of target specific RUSTFLAGS to use the flag correctly (and there isn't a way to target "any platform that uses DWARF" using cfgs). - Does the precompiled standard library potentially using a different version of DWARF a problem?
I don't believe this is an issue as debuggers (and other such tools) already must deal with the possibility that an application uses different DWARF versions across its statically or dynamically linked libraries.
Are there extensions to this feature that remain unstable? How do we know that we are not accidentally committing to those.
No extensions per se, although future DWARF versions could be considered as such. At present, we validate the requested DWARF version is between 2 and 5 (inclusive) so new DWARF versions will not automatically be supported until the validation logic is adjusted.
Summarize the major parts of the implementation and provide links into the code (or to PRs)
- Targets define their preferred or default DWARF version:
pub default_dwarf_version: u32, - We use the target default but this can be overriden by
-{C,Z} dwarf-version
pub fn dwarf_version(&self) -> u32 { - The flag is validated
if let Some(dwarf_version) = sess.opts.unstable_opts.dwarf_version { // DWARF 1 is not supported by LLVM and DWARF 6 is not yet finalized. if dwarf_version < 2 | sess.dcx().emit_err(errors::UnsupportedDwarfVersion { dwarf_version }); } } - When debuginfo is generated, we tell LLVM to use the requested value or the target default
Summarize existing test coverage of this feature
- Test that we actually generate the appropriate DWARF version
- Test that LTO with different DWARF versions picks the highest version
- Test DWARF versions 2-5 are valid while 0, 1 and 6 report an error
- Ensure LLVM does not report a warning when LTO'ing different DWARF versions together
Has a call-for-testing period been conducted? If so, what feedback was received?
No call-for-testing has been conducted but Rust for Linux has been using this flag without issue.
What outstanding bugs in the issue tracker involve this feature? Are they stabilization-blocking?
All reported bugs have been resolved.
Summarize contributors to the feature by name for recognition and assuredness that people involved in the feature agree with stabilization
- Initial implementation in Implement support for DWARF version 5. #98350 by @pcwalton
- Stop emitting
.debug_pubnames
and.debug_pubtypes
when using DWARF 5 in fix: stop emitting .debug_pubnames and .debug_pubtypes #117962 by @weihanglo. - Refactoring & cleanups (Clean up uses of the unstable dwarf_version option #135739), fix LLVM warning on LTO with different DWARF versions (Pick the max DWARF version when LTO'ing modules with different versions #136659) and argument validation (Emit an error if -Zdwarf-version=1 is requested #136746) by @wesleywiser
What FIXMEs are still in the code for that feature and why is it ok to leave them there?
No FIXMEs related to this feature.
What static checks are done that are needed to prevent undefined behavior?
This feature cannot cause undefined behavior.
We ensure the DWARF version is one of the supported values here.
In what way does this feature interact with the reference/specification, and are those edits prepared?
No changes to reference/spec, unstable rustc docs are moved to the stable book as part of the stabilization PR.
Does this feature introduce new expressions and can they produce temporaries? What are the lifetimes of those temporaries?
No.
What other unstable features may be exposed by this feature?
-Zembed-source
requires use of DWARF 5 extensions but has its own feature gate.
What is tooling support like for this feature, w.r.t rustdoc, clippy, rust-analzyer, rustfmt, etc.?
No support needed for rustdoc, clippy, rust-analyzer, rustfmt or rustup.
Cargo could expose this as an option in build profiles but I would expect the decision as to what version should be used would be made for the entire crate graph at build time rather than by individual package authors.
cc-rs has support for detecting the presence of -{C,Z} dwarf-version
in RUSTFLAGS
and providing the corresponding flag to Clang/gcc (rust-lang/cc-rs#1395).
Closes #103057