Repository navigation
Conversation
|
r? @davidtwco rustbot has assigned @davidtwco. Use Why was this reviewer chosen?The reviewer was selected based on:
|
8152bab to
0e44447
Compare
|
I thought about something like this for Clang too. But using typedefs instead of static fields. So in LLDB you'd use struct Something<A, B> {
using __rustc_g0 = A;
using __rustc_g1 = B;
} |
|
Oh that's a much more elegant solution. I'll give it a try and see how it goes. I'd probably still need to fall back to statics for generic value params, but Rust doesn't output those atm anyway so I'll kick that can down the road. |
4a11deb to
8279d05
Compare
|
Yeah that's way cleaner ^^ thanks @Nerixyz |
|
Nice, that's exactly what I had in mind! |
8279d05 to
bbbf055
Compare
|
@bors try jobs=x86_64-msvc |
[Debuginfo] Emit artificial nested typedef representing generic params on MSVC try-job: x86_64-msvc
This comment has been minimized.
This comment has been minimized.
|
@bors try jobs=test-x86_64-msvc-1 |
|
A job failed! Check out the build log: (web) (plain enhanced) (plain) Click to see the possible cause of the failure (guessed by this bot) |
|
💔 Test for fd435d6 failed: CI. Failed job:
|
This comment has been minimized.
This comment has been minimized.
[Debuginfo] Emit artificial nested typedef representing generic params on MSVC try-job: test-x86_64-msvc-1
PDB has no node with which to represent generic parameters (i.e. template args, in LLDB parlance). This has resulted in playing with strings to a degree that I'm not happy with. It's finicky and error-prone and LLDB's type lookup behavior isn't even all that reliable in the first place. The current handling uses infallible methods when it can, but there's still issues now and then.
Part of the issue is that, especially for container types like
Vec(which are what want visualizers the most), the only place the generic tends to show up isPhantomData... in another generic param, so still unreachable.This patch takes each generic
Tand creates an empty static field of typeT(e.g.static T GENERIC_ARG_0), that way they're easily accessible from the visualizers viavalobj.GetType().GetStaticFieldWithName("GENERIC_ARG_0").GetType().Worth noting, we use a similar trick for enums to encode their discriminants and variant names
That said, this is a pretty heavy-handed way to do this. Technically, the only place this is "necessary" is when the generic is only accessible via
PhantomData(e.g.Vec). We could absolutely gate the static field generation byis_phantom_data()to NOT output so many fake static fields. The one extra problem with that is that LLDB omits 0-sized fields (includingPhantomData) when creating structs with PDB debug info (llvm/llvm-project#235686, llvm/llvm-project#237688), so we can't accessPhantomDatadirectly fromVec. We'd need to do another type lookup by transplanting the generic param to the string"PhantomData<{generic_arg}>"and looking up that type. That's probably more reliable than what we're currently doing? Still not ideal though.