Re: [PATCH 04/13] Kbuild: Rust support

From: Matthew Wilcox
Date: Mon Apr 19 2021 - 16:18:37 EST


On Mon, Apr 19, 2021 at 09:58:51PM +0200, David Sterba wrote:
> On Fri, Apr 16, 2021 at 07:34:51PM +0200, Miguel Ojeda wrote:
> > something like:
> >
> > [ 0.903456] rust_begin_unwind+0x9/0x10
> > [ 0.903456] ? _RNvNtCsbDqzXfLQacH_4core9panicking9panic_fmt+0x29/0x30
> > [ 0.903456] ? _RNvNtCsbDqzXfLQacH_4core9panicking5panic+0x44/0x50
> > [ 0.903456] ? _RNvCsbDqzXfLQacH_12rust_minimal1h+0x1c/0x20
> > [ 0.903456] ? _RNvCsbDqzXfLQacH_12rust_minimal1g+0x9/0x10
> > [ 0.903456] ? _RNvCsbDqzXfLQacH_12rust_minimal1f+0x9/0x10
> > [ 0.903456] ?
> > _RNvXCsbDqzXfLQacH_12rust_minimalNtB2_11RustMinimalNtCsbDqzXfLQacH_6kernel12KernelModule4init+0x73/0x80
> > [ 0.903456] ? _RNvXsa_NtCsbDqzXfLQacH_4core3fmtbNtB5_5Debug3fmt+0x30/0x30
> > [ 0.903456] ? __rust_minimal_init+0x11/0x20
>
> Are there plans to unmangle the symbols when printing stacks? c++filt
> says:
>
> rust_begin_unwind+0x9/0x10
> ? core[8787f43e282added]::panicking::panic_fmt+0x29/0x30
> ? core[8787f43e282added]::panicking::panic+0x44/0x50
> ? rust_minimal[8787f43e282added]::h+0x1c/0x20
> ? rust_minimal[8787f43e282added]::g+0x9/0x10
> ? rust_minimal[8787f43e282added]::f+0x9/0x10
> ? <rust_minimal[8787f43e282added]::RustMinimal as kernel[8787f43e282added]::KernelModule>::init+0x73/0x80
> ? <bool as core[8787f43e282added]::fmt::Debug>::fmt+0x30/0x30
> ? __rust_minimal_init+0x11/0x20
>
> for simple functions it's barely parseable but the following is hardly
> readable
>
> > _RNvXs5_NtCsbDqzXfLQacH_11rust_binder11range_allocNtB5_15DescriptorStateNtNtCsbDqzXfLQacH_4core3fmt5Debug3fmt+0x60/0x60
>
> translates to
>
> <rust_binder[8787f43e282added]::range_alloc::DescriptorState as core[8787f43e282added]::fmt::Debug>::fmt

Yes, I agree, we need a better story for name mangling.
My proposal is that we store a pretty name which matches the source
(eg rust_binder::range_alloc) and a sha1 of the mangled symbol
(40 bytes of uninteresting hex). Symbol resolution is performed against
the sha1. Printing is of the pretty name. It should be obvious from
the stack trace which variant of a function is being called, no?