Visitar URL original
[Debuginfo] Emit artificial nested typedef representing generic params on MSVC by Walnut356 · Pull Request #165267 · rust-lang/rust · GitHub
Skip to content

[Debuginfo] Emit artificial nested typedef representing generic params on MSVC - #165267

Open
Walnut356 wants to merge 1 commit into
rust-lang:mainfrom
Walnut356:phantom_static
Open

Walnut356 wants to merge 1 commit into
rust-lang:mainfrom
Walnut356:phantom_static

Conversation

@Walnut356

Copy link
Copy Markdown
Contributor

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 is PhantomData... in another generic param, so still unreachable.

This patch takes each generic T and creates an empty static field of type T (e.g. static T GENERIC_ARG_0), that way they're easily accessible from the visualizers via valobj.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 by is_phantom_data() to NOT output so many fake static fields. The one extra problem with that is that LLDB omits 0-sized fields (including PhantomData) when creating structs with PDB debug info (llvm/llvm-project#235686, llvm/llvm-project#237688), so we can't access PhantomData directly from Vec. 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.

@rustbot rustbot added A-LLVM Area: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues. S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Nov 1, 2026
@rustbot

rustbot commented Nov 1, 2026

Copy link
Copy Markdown
Collaborator

r? @davidtwco

rustbot has assigned @davidtwco.
They will have a look at your PR within the next two weeks and either review your PR or reassign to another reviewer.

Use r? to explicitly pick a reviewer

Why was this reviewer chosen?

The reviewer was selected based on:

  • Owners of files modified in this PR: compiler
  • compiler expanded to 77 candidates
  • Random selection from 22 candidates

@Nerixyz

Nerixyz commented Nov 1, 2026

Copy link
Copy Markdown

I thought about something like this for Clang too. But using typedefs instead of static fields. So in LLDB you'd use SBType::FindDirectNestedType.
Then a generic struct would look something like

struct Something<A, B> {
  using __rustc_g0 = A;
  using __rustc_g1 = B;
}

@Walnut356

Copy link
Copy Markdown
Contributor Author

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.

@Walnut356
Walnut356 force-pushed the phantom_static branch 2 times, most recently from 4a11deb to 8279d05 Compare November 8, 2026 18:58
@Walnut356

Copy link
Copy Markdown
Contributor Author

Yeah that's way cleaner ^^ thanks @Nerixyz

@Nerixyz

Nerixyz commented Nov 8, 2026

Copy link
Copy Markdown

Nice, that's exactly what I had in mind!

@Walnut356 Walnut356 changed the title [Debuginfo] Emit artificial static field representing generic params on MSVC [Debuginfo] Emit artificial nested typedef representing generic params on MSVC Nov 8, 2026
@Walnut356

Copy link
Copy Markdown
Contributor Author

@bors try jobs=x86_64-msvc

rust-bors Bot pushed a commit that referenced this pull request Nov 8, 2026
[Debuginfo] Emit artificial nested typedef representing generic params on MSVC


try-job: x86_64-msvc
@rust-bors

This comment has been minimized.

@Walnut356

Copy link
Copy Markdown
Contributor Author

@bors try jobs=test-x86_64-msvc-1

@rust-bors rust-bors Bot added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Nov 8, 2026
@rust-log-analyzer

Copy link
Copy Markdown
Collaborator

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)
   Compiling diff v0.1.13
   Compiling citool v0.1.0 (/home/runner/work/rust/rust/src/ci/citool)
    Finished `dev` profile [unoptimized] target(s) in 16.74s
     Running `target/debug/citool calculate-job-matrix`
Run type: TryJob { job_patterns: Some(["x86_64-msvc"]), nolimit: false }
Error: Failed to calculate job matrix

Caused by:
    Patterns `x86_64-msvc` did not match any auto jobs
##[error]Process completed with exit code 1.

@rust-bors

rust-bors Bot commented Nov 8, 2026

Copy link
Copy Markdown
Contributor

💔 Test for fd435d6 failed: CI. Failed job:

@rust-bors

This comment has been minimized.

rust-bors Bot pushed a commit that referenced this pull request Nov 8, 2026
[Debuginfo] Emit artificial nested typedef representing generic params on MSVC


try-job: test-x86_64-msvc-1
@rust-bors

rust-bors Bot commented Nov 8, 2026

Copy link
Copy Markdown
Contributor

☀️ Try build successful (CI)
Build commit: f906ddf (f906ddf5ace49b291d13ee5080ec88325d6f2f5f)
Base parent: 1a4d65f (1a4d65fa9d3ff3990d766c52e741c7027ffa4fc6)

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-LLVM Area: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues. S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants