4916e2b9e6
debuginfo: Generalize C++-like encoding for enums. The updated encoding should be able to handle niche layouts where more than one variant has fields (as introduced in https://github.com/rust-lang/rust/pull/94075). The new encoding is more uniform as there is no structural difference between direct-tag, niche-tag, and no-tag layouts anymore. The only difference between those cases is that the "dataful" variant in a niche-tag enum will have a `(start, end)` pair denoting the tag range instead of a single value. The new encoding now also supports 128-bit tags, which occur in at least some standard library types. These tags are represented as `u64` pairs so that debuggers (which don't always have support for 128-bit integers) can reliably deal with them. The downside is that this adds quite a bit of complexity to the encoding and especially to the corresponding NatVis. The new encoding seems to increase the size of (x86_64-pc-windows-msvc) debuginfo by 10-15%. The size of binaries is not affected (release builds were built with `-Cdebuginfo=2`, numbers are in kilobytes): EXE | before | after | relative -- | -- | -- | -- cargo (debug) | 40453 | 40450 | +0% ripgrep (debug) | 10275 | 10273 | +0% cargo (release) | 16186 | 16185 | +0% ripgrep (release) | 4727 | 4726 | +0% PDB | before | after | relative -- | -- | -- | -- cargo (debug) | 236524 | 261412 | +11% ripgrep (debug) | 53140 | 59060 | +11% cargo (release) | 148516 | 169620 | +14% ripgrep (release) | 10676 | 11804 | +11% Given that the new encoding is more general, this is to be expected. Only platforms using C++-like debuginfo are affected -- which currently is only `*-pc-windows-msvc`. *TODO* - [x] Properly update documentation - [x] Add regression tests for new optimized enum layouts as introduced by #94075. r? `@wesleywiser` |
||
---|---|---|
.. | ||
installer | ||
natvis | ||
test-float-parse | ||
third-party | ||
cat-and-grep.sh | ||
check_missing_items.py | ||
CONFIGS.md | ||
cpu-usage-over-time-plot.sh | ||
ctags.rust | ||
dec2flt_table.py | ||
gdb_load_rust_pretty_printers.py | ||
gdb_lookup.py | ||
gdb_providers.py | ||
generate-deriving-span-tests.py | ||
generate-keyword-tests.py | ||
htmldocck.py | ||
indenter | ||
lldb_batchmode.py | ||
lldb_commands | ||
lldb_lookup.py | ||
lldb_providers.py | ||
pre-push.sh | ||
rust_types.py | ||
rust-gdb | ||
rust-gdbgui | ||
rust-lldb | ||
rust-windbg.cmd | ||
wasm32-shim.js |