Fix debugger visualizer tuple child ordering w/ PDB debug info - #161726
Conversation
|
rustbot has assigned @Mark-Simulacrum. Use Why was this reviewer chosen?The reviewer was selected based on:
|
|
r? @Kobzol |
|
|
| str(index), element.GetData(), element.GetType() | ||
| ) | ||
| return self.valobj.GetChildAtIndex( | ||
| self.valobj.GetIndexOfChildWithName(f"__{index}") |
There was a problem hiding this comment.
Should this perhaps be using self.get_child_index to avoid dupicating the "logic"?
There was a problem hiding this comment.
Ah yeah, it saves us a function call and a conditional per field inspected. Not a huge deal in isolation, but with as common as tuples/tuple structs are, it can really add up.
There was a problem hiding this comment.
That bad, huh? In that case it would be good to add a comment here, otherwise someone might come and "optimize" it in the future :)
|
✌️ @Walnut356, you can now approve this pull request! If @Kobzol told you to " |
|
@bors r=Kobzol |
Fix debugger visualizer tuple child ordering w/ PDB debug info see: llvm/llvm-project#218613 for an explanation of the issue. tl;dr, PDB fields reflect rustc's reordering, whereas DWARF fields are in source-code-order. This causes issues with `GetChildAtIndex` in cases where both DWARF- and PDB-based types can interact with them. This PR uses field names to retrieve field indexes, rather than blindly indexing into the field array. I did a quick scan over the rest of the `GetChildAtIndex` calls, and they all fall under a few safe cases 1. in DWARF or PDB specific providers (mainly enum discriminants, which can't be reordered anyway) 2. used to get field `0` of a struct with only 1 field 3. in the summary provider where we're typically already interacting with the synthetic value and synthetic children anyway cc rust-lang#161657, fixes `tests/debuginfo/tuple-struct.rs` on `windows-msvc` <details><summary>`windows-msvc` `tests/debuginfo` results with this change</summary> ``` failures: [debuginfo-lldb] tests\debuginfo\associated-types.rs [debuginfo-lldb] tests\debuginfo\borrowed-basic.rs [debuginfo-lldb] tests\debuginfo\borrowed-unique-basic.rs [debuginfo-lldb] tests\debuginfo\basic-types-globals.rs#no-lto [debuginfo-lldb] tests\debuginfo\borrowed-tuple.rs [debuginfo-lldb] tests\debuginfo\boxed-struct.rs [debuginfo-lldb] tests\debuginfo\captured-fields-2.rs [debuginfo-lldb] tests\debuginfo\cross-crate-spans.rs [debuginfo-lldb] tests\debuginfo\coroutine-locals.rs [debuginfo-lldb] tests\debuginfo\box.rs [debuginfo-lldb] tests\debuginfo\captured-fields-1.rs [debuginfo-lldb] tests\debuginfo\c-style-enum-in-composite.rs [debuginfo-lldb] tests\debuginfo\by-value-self-argument-in-trait-impl.rs [debuginfo-lldb] tests\debuginfo\destructured-for-loop-variable.rs [debuginfo-lldb] tests\debuginfo\dummy_span.rs [debuginfo-lldb] tests\debuginfo\evec-in-struct.rs [debuginfo-lldb] tests\debuginfo\destructured-fn-argument.rs [debuginfo-lldb] tests\debuginfo\destructured-local.rs [debuginfo-lldb] tests\debuginfo\generic-struct.rs [debuginfo-lldb] tests\debuginfo\issue-22656.rs [debuginfo-lldb] tests\debuginfo\basic-types-globals.rs#lto [debuginfo-lldb] tests\debuginfo\lexical-scope-in-if.rs [debuginfo-lldb] tests\debuginfo\lexical-scope-in-stack-closure.rs [debuginfo-lldb] tests\debuginfo\lexical-scope-in-unconditional-loop.rs [debuginfo-lldb] tests\debuginfo\lexical-scope-with-macro.rs [debuginfo-lldb] tests\debuginfo\lexical-scope-in-unique-closure.rs [debuginfo-lldb] tests\debuginfo\lexical-scope-in-if-let.rs [debuginfo-lldb] tests\debuginfo\lexical-scopes-in-block-expression.rs [debuginfo-lldb] tests\debuginfo\method-on-generic-struct.rs [debuginfo-lldb] tests\debuginfo\lexical-scope-in-while.rs [debuginfo-lldb] tests\debuginfo\lexical-scope-in-for-loop.rs [debuginfo-lldb] tests\debuginfo\name-shadowing-and-scope-nesting.rs [debuginfo-lldb] tests\debuginfo\no_mangle-info.rs [debuginfo-lldb] tests\debuginfo\packed-struct-with-destructor.rs [debuginfo-lldb] tests\debuginfo\pretty-slices.rs [debuginfo-lldb] tests\debuginfo\packed-struct.rs [debuginfo-lldb] tests\debuginfo\reference-debuginfo.rs [debuginfo-lldb] tests\debuginfo\simple-struct.rs [debuginfo-lldb] tests\debuginfo\simple-lexical-scope.rs [debuginfo-lldb] tests\debuginfo\shadowed-variable.rs [debuginfo-lldb] tests\debuginfo\simple-tuple.rs [debuginfo-lldb] tests\debuginfo\shadowed-argument.rs [debuginfo-lldb] tests\debuginfo\struct-with-destructor.rs [debuginfo-lldb] tests\debuginfo\strings-and-strs.rs [debuginfo-lldb] tests\debuginfo\struct-in-struct.rs [debuginfo-lldb] tests\debuginfo\pretty-std-collections.rs [debuginfo-lldb] tests\debuginfo\tuple-in-tuple.rs [debuginfo-lldb] tests\debuginfo\thread-names.rs#win [debuginfo-lldb] tests\debuginfo\vec-slices.rs [debuginfo-lldb] tests\debuginfo\var-captured-in-sendable-closure.rs [debuginfo-lldb] tests\debuginfo\var-captured-in-stack-closure.rs [debuginfo-lldb] tests\debuginfo\var-captured-in-nested-closure.rs test result: FAILED. 244 passed; 52 failed; 223 ignored; 0 measured; 0 filtered out; finished in 13.22s ``` </details>
Fix debugger visualizer tuple child ordering w/ PDB debug info see: llvm/llvm-project#218613 for an explanation of the issue. tl;dr, PDB fields reflect rustc's reordering, whereas DWARF fields are in source-code-order. This causes issues with `GetChildAtIndex` in cases where both DWARF- and PDB-based types can interact with them. This PR uses field names to retrieve field indexes, rather than blindly indexing into the field array. I did a quick scan over the rest of the `GetChildAtIndex` calls, and they all fall under a few safe cases 1. in DWARF or PDB specific providers (mainly enum discriminants, which can't be reordered anyway) 2. used to get field `0` of a struct with only 1 field 3. in the summary provider where we're typically already interacting with the synthetic value and synthetic children anyway cc rust-lang#161657, fixes `tests/debuginfo/tuple-struct.rs` on `windows-msvc` <details><summary>`windows-msvc` `tests/debuginfo` results with this change</summary> ``` failures: [debuginfo-lldb] tests\debuginfo\associated-types.rs [debuginfo-lldb] tests\debuginfo\borrowed-basic.rs [debuginfo-lldb] tests\debuginfo\borrowed-unique-basic.rs [debuginfo-lldb] tests\debuginfo\basic-types-globals.rs#no-lto [debuginfo-lldb] tests\debuginfo\borrowed-tuple.rs [debuginfo-lldb] tests\debuginfo\boxed-struct.rs [debuginfo-lldb] tests\debuginfo\captured-fields-2.rs [debuginfo-lldb] tests\debuginfo\cross-crate-spans.rs [debuginfo-lldb] tests\debuginfo\coroutine-locals.rs [debuginfo-lldb] tests\debuginfo\box.rs [debuginfo-lldb] tests\debuginfo\captured-fields-1.rs [debuginfo-lldb] tests\debuginfo\c-style-enum-in-composite.rs [debuginfo-lldb] tests\debuginfo\by-value-self-argument-in-trait-impl.rs [debuginfo-lldb] tests\debuginfo\destructured-for-loop-variable.rs [debuginfo-lldb] tests\debuginfo\dummy_span.rs [debuginfo-lldb] tests\debuginfo\evec-in-struct.rs [debuginfo-lldb] tests\debuginfo\destructured-fn-argument.rs [debuginfo-lldb] tests\debuginfo\destructured-local.rs [debuginfo-lldb] tests\debuginfo\generic-struct.rs [debuginfo-lldb] tests\debuginfo\issue-22656.rs [debuginfo-lldb] tests\debuginfo\basic-types-globals.rs#lto [debuginfo-lldb] tests\debuginfo\lexical-scope-in-if.rs [debuginfo-lldb] tests\debuginfo\lexical-scope-in-stack-closure.rs [debuginfo-lldb] tests\debuginfo\lexical-scope-in-unconditional-loop.rs [debuginfo-lldb] tests\debuginfo\lexical-scope-with-macro.rs [debuginfo-lldb] tests\debuginfo\lexical-scope-in-unique-closure.rs [debuginfo-lldb] tests\debuginfo\lexical-scope-in-if-let.rs [debuginfo-lldb] tests\debuginfo\lexical-scopes-in-block-expression.rs [debuginfo-lldb] tests\debuginfo\method-on-generic-struct.rs [debuginfo-lldb] tests\debuginfo\lexical-scope-in-while.rs [debuginfo-lldb] tests\debuginfo\lexical-scope-in-for-loop.rs [debuginfo-lldb] tests\debuginfo\name-shadowing-and-scope-nesting.rs [debuginfo-lldb] tests\debuginfo\no_mangle-info.rs [debuginfo-lldb] tests\debuginfo\packed-struct-with-destructor.rs [debuginfo-lldb] tests\debuginfo\pretty-slices.rs [debuginfo-lldb] tests\debuginfo\packed-struct.rs [debuginfo-lldb] tests\debuginfo\reference-debuginfo.rs [debuginfo-lldb] tests\debuginfo\simple-struct.rs [debuginfo-lldb] tests\debuginfo\simple-lexical-scope.rs [debuginfo-lldb] tests\debuginfo\shadowed-variable.rs [debuginfo-lldb] tests\debuginfo\simple-tuple.rs [debuginfo-lldb] tests\debuginfo\shadowed-argument.rs [debuginfo-lldb] tests\debuginfo\struct-with-destructor.rs [debuginfo-lldb] tests\debuginfo\strings-and-strs.rs [debuginfo-lldb] tests\debuginfo\struct-in-struct.rs [debuginfo-lldb] tests\debuginfo\pretty-std-collections.rs [debuginfo-lldb] tests\debuginfo\tuple-in-tuple.rs [debuginfo-lldb] tests\debuginfo\thread-names.rs#win [debuginfo-lldb] tests\debuginfo\vec-slices.rs [debuginfo-lldb] tests\debuginfo\var-captured-in-sendable-closure.rs [debuginfo-lldb] tests\debuginfo\var-captured-in-stack-closure.rs [debuginfo-lldb] tests\debuginfo\var-captured-in-nested-closure.rs test result: FAILED. 244 passed; 52 failed; 223 ignored; 0 measured; 0 filtered out; finished in 13.22s ``` </details>
Fix debugger visualizer tuple child ordering w/ PDB debug info see: llvm/llvm-project#218613 for an explanation of the issue. tl;dr, PDB fields reflect rustc's reordering, whereas DWARF fields are in source-code-order. This causes issues with `GetChildAtIndex` in cases where both DWARF- and PDB-based types can interact with them. This PR uses field names to retrieve field indexes, rather than blindly indexing into the field array. I did a quick scan over the rest of the `GetChildAtIndex` calls, and they all fall under a few safe cases 1. in DWARF or PDB specific providers (mainly enum discriminants, which can't be reordered anyway) 2. used to get field `0` of a struct with only 1 field 3. in the summary provider where we're typically already interacting with the synthetic value and synthetic children anyway cc rust-lang#161657, fixes `tests/debuginfo/tuple-struct.rs` on `windows-msvc` <details><summary>`windows-msvc` `tests/debuginfo` results with this change</summary> ``` failures: [debuginfo-lldb] tests\debuginfo\associated-types.rs [debuginfo-lldb] tests\debuginfo\borrowed-basic.rs [debuginfo-lldb] tests\debuginfo\borrowed-unique-basic.rs [debuginfo-lldb] tests\debuginfo\basic-types-globals.rs#no-lto [debuginfo-lldb] tests\debuginfo\borrowed-tuple.rs [debuginfo-lldb] tests\debuginfo\boxed-struct.rs [debuginfo-lldb] tests\debuginfo\captured-fields-2.rs [debuginfo-lldb] tests\debuginfo\cross-crate-spans.rs [debuginfo-lldb] tests\debuginfo\coroutine-locals.rs [debuginfo-lldb] tests\debuginfo\box.rs [debuginfo-lldb] tests\debuginfo\captured-fields-1.rs [debuginfo-lldb] tests\debuginfo\c-style-enum-in-composite.rs [debuginfo-lldb] tests\debuginfo\by-value-self-argument-in-trait-impl.rs [debuginfo-lldb] tests\debuginfo\destructured-for-loop-variable.rs [debuginfo-lldb] tests\debuginfo\dummy_span.rs [debuginfo-lldb] tests\debuginfo\evec-in-struct.rs [debuginfo-lldb] tests\debuginfo\destructured-fn-argument.rs [debuginfo-lldb] tests\debuginfo\destructured-local.rs [debuginfo-lldb] tests\debuginfo\generic-struct.rs [debuginfo-lldb] tests\debuginfo\issue-22656.rs [debuginfo-lldb] tests\debuginfo\basic-types-globals.rs#lto [debuginfo-lldb] tests\debuginfo\lexical-scope-in-if.rs [debuginfo-lldb] tests\debuginfo\lexical-scope-in-stack-closure.rs [debuginfo-lldb] tests\debuginfo\lexical-scope-in-unconditional-loop.rs [debuginfo-lldb] tests\debuginfo\lexical-scope-with-macro.rs [debuginfo-lldb] tests\debuginfo\lexical-scope-in-unique-closure.rs [debuginfo-lldb] tests\debuginfo\lexical-scope-in-if-let.rs [debuginfo-lldb] tests\debuginfo\lexical-scopes-in-block-expression.rs [debuginfo-lldb] tests\debuginfo\method-on-generic-struct.rs [debuginfo-lldb] tests\debuginfo\lexical-scope-in-while.rs [debuginfo-lldb] tests\debuginfo\lexical-scope-in-for-loop.rs [debuginfo-lldb] tests\debuginfo\name-shadowing-and-scope-nesting.rs [debuginfo-lldb] tests\debuginfo\no_mangle-info.rs [debuginfo-lldb] tests\debuginfo\packed-struct-with-destructor.rs [debuginfo-lldb] tests\debuginfo\pretty-slices.rs [debuginfo-lldb] tests\debuginfo\packed-struct.rs [debuginfo-lldb] tests\debuginfo\reference-debuginfo.rs [debuginfo-lldb] tests\debuginfo\simple-struct.rs [debuginfo-lldb] tests\debuginfo\simple-lexical-scope.rs [debuginfo-lldb] tests\debuginfo\shadowed-variable.rs [debuginfo-lldb] tests\debuginfo\simple-tuple.rs [debuginfo-lldb] tests\debuginfo\shadowed-argument.rs [debuginfo-lldb] tests\debuginfo\struct-with-destructor.rs [debuginfo-lldb] tests\debuginfo\strings-and-strs.rs [debuginfo-lldb] tests\debuginfo\struct-in-struct.rs [debuginfo-lldb] tests\debuginfo\pretty-std-collections.rs [debuginfo-lldb] tests\debuginfo\tuple-in-tuple.rs [debuginfo-lldb] tests\debuginfo\thread-names.rs#win [debuginfo-lldb] tests\debuginfo\vec-slices.rs [debuginfo-lldb] tests\debuginfo\var-captured-in-sendable-closure.rs [debuginfo-lldb] tests\debuginfo\var-captured-in-stack-closure.rs [debuginfo-lldb] tests\debuginfo\var-captured-in-nested-closure.rs test result: FAILED. 244 passed; 52 failed; 223 ignored; 0 measured; 0 filtered out; finished in 13.22s ``` </details>
Fix debugger visualizer tuple child ordering w/ PDB debug info see: llvm/llvm-project#218613 for an explanation of the issue. tl;dr, PDB fields reflect rustc's reordering, whereas DWARF fields are in source-code-order. This causes issues with `GetChildAtIndex` in cases where both DWARF- and PDB-based types can interact with them. This PR uses field names to retrieve field indexes, rather than blindly indexing into the field array. I did a quick scan over the rest of the `GetChildAtIndex` calls, and they all fall under a few safe cases 1. in DWARF or PDB specific providers (mainly enum discriminants, which can't be reordered anyway) 2. used to get field `0` of a struct with only 1 field 3. in the summary provider where we're typically already interacting with the synthetic value and synthetic children anyway cc rust-lang#161657, fixes `tests/debuginfo/tuple-struct.rs` on `windows-msvc` <details><summary>`windows-msvc` `tests/debuginfo` results with this change</summary> ``` failures: [debuginfo-lldb] tests\debuginfo\associated-types.rs [debuginfo-lldb] tests\debuginfo\borrowed-basic.rs [debuginfo-lldb] tests\debuginfo\borrowed-unique-basic.rs [debuginfo-lldb] tests\debuginfo\basic-types-globals.rs#no-lto [debuginfo-lldb] tests\debuginfo\borrowed-tuple.rs [debuginfo-lldb] tests\debuginfo\boxed-struct.rs [debuginfo-lldb] tests\debuginfo\captured-fields-2.rs [debuginfo-lldb] tests\debuginfo\cross-crate-spans.rs [debuginfo-lldb] tests\debuginfo\coroutine-locals.rs [debuginfo-lldb] tests\debuginfo\box.rs [debuginfo-lldb] tests\debuginfo\captured-fields-1.rs [debuginfo-lldb] tests\debuginfo\c-style-enum-in-composite.rs [debuginfo-lldb] tests\debuginfo\by-value-self-argument-in-trait-impl.rs [debuginfo-lldb] tests\debuginfo\destructured-for-loop-variable.rs [debuginfo-lldb] tests\debuginfo\dummy_span.rs [debuginfo-lldb] tests\debuginfo\evec-in-struct.rs [debuginfo-lldb] tests\debuginfo\destructured-fn-argument.rs [debuginfo-lldb] tests\debuginfo\destructured-local.rs [debuginfo-lldb] tests\debuginfo\generic-struct.rs [debuginfo-lldb] tests\debuginfo\issue-22656.rs [debuginfo-lldb] tests\debuginfo\basic-types-globals.rs#lto [debuginfo-lldb] tests\debuginfo\lexical-scope-in-if.rs [debuginfo-lldb] tests\debuginfo\lexical-scope-in-stack-closure.rs [debuginfo-lldb] tests\debuginfo\lexical-scope-in-unconditional-loop.rs [debuginfo-lldb] tests\debuginfo\lexical-scope-with-macro.rs [debuginfo-lldb] tests\debuginfo\lexical-scope-in-unique-closure.rs [debuginfo-lldb] tests\debuginfo\lexical-scope-in-if-let.rs [debuginfo-lldb] tests\debuginfo\lexical-scopes-in-block-expression.rs [debuginfo-lldb] tests\debuginfo\method-on-generic-struct.rs [debuginfo-lldb] tests\debuginfo\lexical-scope-in-while.rs [debuginfo-lldb] tests\debuginfo\lexical-scope-in-for-loop.rs [debuginfo-lldb] tests\debuginfo\name-shadowing-and-scope-nesting.rs [debuginfo-lldb] tests\debuginfo\no_mangle-info.rs [debuginfo-lldb] tests\debuginfo\packed-struct-with-destructor.rs [debuginfo-lldb] tests\debuginfo\pretty-slices.rs [debuginfo-lldb] tests\debuginfo\packed-struct.rs [debuginfo-lldb] tests\debuginfo\reference-debuginfo.rs [debuginfo-lldb] tests\debuginfo\simple-struct.rs [debuginfo-lldb] tests\debuginfo\simple-lexical-scope.rs [debuginfo-lldb] tests\debuginfo\shadowed-variable.rs [debuginfo-lldb] tests\debuginfo\simple-tuple.rs [debuginfo-lldb] tests\debuginfo\shadowed-argument.rs [debuginfo-lldb] tests\debuginfo\struct-with-destructor.rs [debuginfo-lldb] tests\debuginfo\strings-and-strs.rs [debuginfo-lldb] tests\debuginfo\struct-in-struct.rs [debuginfo-lldb] tests\debuginfo\pretty-std-collections.rs [debuginfo-lldb] tests\debuginfo\tuple-in-tuple.rs [debuginfo-lldb] tests\debuginfo\thread-names.rs#win [debuginfo-lldb] tests\debuginfo\vec-slices.rs [debuginfo-lldb] tests\debuginfo\var-captured-in-sendable-closure.rs [debuginfo-lldb] tests\debuginfo\var-captured-in-stack-closure.rs [debuginfo-lldb] tests\debuginfo\var-captured-in-nested-closure.rs test result: FAILED. 244 passed; 52 failed; 223 ignored; 0 measured; 0 filtered out; finished in 13.22s ``` </details>
Fix debugger visualizer tuple child ordering w/ PDB debug info see: llvm/llvm-project#218613 for an explanation of the issue. tl;dr, PDB fields reflect rustc's reordering, whereas DWARF fields are in source-code-order. This causes issues with `GetChildAtIndex` in cases where both DWARF- and PDB-based types can interact with them. This PR uses field names to retrieve field indexes, rather than blindly indexing into the field array. I did a quick scan over the rest of the `GetChildAtIndex` calls, and they all fall under a few safe cases 1. in DWARF or PDB specific providers (mainly enum discriminants, which can't be reordered anyway) 2. used to get field `0` of a struct with only 1 field 3. in the summary provider where we're typically already interacting with the synthetic value and synthetic children anyway cc rust-lang#161657, fixes `tests/debuginfo/tuple-struct.rs` on `windows-msvc` <details><summary>`windows-msvc` `tests/debuginfo` results with this change</summary> ``` failures: [debuginfo-lldb] tests\debuginfo\associated-types.rs [debuginfo-lldb] tests\debuginfo\borrowed-basic.rs [debuginfo-lldb] tests\debuginfo\borrowed-unique-basic.rs [debuginfo-lldb] tests\debuginfo\basic-types-globals.rs#no-lto [debuginfo-lldb] tests\debuginfo\borrowed-tuple.rs [debuginfo-lldb] tests\debuginfo\boxed-struct.rs [debuginfo-lldb] tests\debuginfo\captured-fields-2.rs [debuginfo-lldb] tests\debuginfo\cross-crate-spans.rs [debuginfo-lldb] tests\debuginfo\coroutine-locals.rs [debuginfo-lldb] tests\debuginfo\box.rs [debuginfo-lldb] tests\debuginfo\captured-fields-1.rs [debuginfo-lldb] tests\debuginfo\c-style-enum-in-composite.rs [debuginfo-lldb] tests\debuginfo\by-value-self-argument-in-trait-impl.rs [debuginfo-lldb] tests\debuginfo\destructured-for-loop-variable.rs [debuginfo-lldb] tests\debuginfo\dummy_span.rs [debuginfo-lldb] tests\debuginfo\evec-in-struct.rs [debuginfo-lldb] tests\debuginfo\destructured-fn-argument.rs [debuginfo-lldb] tests\debuginfo\destructured-local.rs [debuginfo-lldb] tests\debuginfo\generic-struct.rs [debuginfo-lldb] tests\debuginfo\issue-22656.rs [debuginfo-lldb] tests\debuginfo\basic-types-globals.rs#lto [debuginfo-lldb] tests\debuginfo\lexical-scope-in-if.rs [debuginfo-lldb] tests\debuginfo\lexical-scope-in-stack-closure.rs [debuginfo-lldb] tests\debuginfo\lexical-scope-in-unconditional-loop.rs [debuginfo-lldb] tests\debuginfo\lexical-scope-with-macro.rs [debuginfo-lldb] tests\debuginfo\lexical-scope-in-unique-closure.rs [debuginfo-lldb] tests\debuginfo\lexical-scope-in-if-let.rs [debuginfo-lldb] tests\debuginfo\lexical-scopes-in-block-expression.rs [debuginfo-lldb] tests\debuginfo\method-on-generic-struct.rs [debuginfo-lldb] tests\debuginfo\lexical-scope-in-while.rs [debuginfo-lldb] tests\debuginfo\lexical-scope-in-for-loop.rs [debuginfo-lldb] tests\debuginfo\name-shadowing-and-scope-nesting.rs [debuginfo-lldb] tests\debuginfo\no_mangle-info.rs [debuginfo-lldb] tests\debuginfo\packed-struct-with-destructor.rs [debuginfo-lldb] tests\debuginfo\pretty-slices.rs [debuginfo-lldb] tests\debuginfo\packed-struct.rs [debuginfo-lldb] tests\debuginfo\reference-debuginfo.rs [debuginfo-lldb] tests\debuginfo\simple-struct.rs [debuginfo-lldb] tests\debuginfo\simple-lexical-scope.rs [debuginfo-lldb] tests\debuginfo\shadowed-variable.rs [debuginfo-lldb] tests\debuginfo\simple-tuple.rs [debuginfo-lldb] tests\debuginfo\shadowed-argument.rs [debuginfo-lldb] tests\debuginfo\struct-with-destructor.rs [debuginfo-lldb] tests\debuginfo\strings-and-strs.rs [debuginfo-lldb] tests\debuginfo\struct-in-struct.rs [debuginfo-lldb] tests\debuginfo\pretty-std-collections.rs [debuginfo-lldb] tests\debuginfo\tuple-in-tuple.rs [debuginfo-lldb] tests\debuginfo\thread-names.rs#win [debuginfo-lldb] tests\debuginfo\vec-slices.rs [debuginfo-lldb] tests\debuginfo\var-captured-in-sendable-closure.rs [debuginfo-lldb] tests\debuginfo\var-captured-in-stack-closure.rs [debuginfo-lldb] tests\debuginfo\var-captured-in-nested-closure.rs test result: FAILED. 244 passed; 52 failed; 223 ignored; 0 measured; 0 filtered out; finished in 13.22s ``` </details>
Fix debugger visualizer tuple child ordering w/ PDB debug info see: llvm/llvm-project#218613 for an explanation of the issue. tl;dr, PDB fields reflect rustc's reordering, whereas DWARF fields are in source-code-order. This causes issues with `GetChildAtIndex` in cases where both DWARF- and PDB-based types can interact with them. This PR uses field names to retrieve field indexes, rather than blindly indexing into the field array. I did a quick scan over the rest of the `GetChildAtIndex` calls, and they all fall under a few safe cases 1. in DWARF or PDB specific providers (mainly enum discriminants, which can't be reordered anyway) 2. used to get field `0` of a struct with only 1 field 3. in the summary provider where we're typically already interacting with the synthetic value and synthetic children anyway cc rust-lang#161657, fixes `tests/debuginfo/tuple-struct.rs` on `windows-msvc` <details><summary>`windows-msvc` `tests/debuginfo` results with this change</summary> ``` failures: [debuginfo-lldb] tests\debuginfo\associated-types.rs [debuginfo-lldb] tests\debuginfo\borrowed-basic.rs [debuginfo-lldb] tests\debuginfo\borrowed-unique-basic.rs [debuginfo-lldb] tests\debuginfo\basic-types-globals.rs#no-lto [debuginfo-lldb] tests\debuginfo\borrowed-tuple.rs [debuginfo-lldb] tests\debuginfo\boxed-struct.rs [debuginfo-lldb] tests\debuginfo\captured-fields-2.rs [debuginfo-lldb] tests\debuginfo\cross-crate-spans.rs [debuginfo-lldb] tests\debuginfo\coroutine-locals.rs [debuginfo-lldb] tests\debuginfo\box.rs [debuginfo-lldb] tests\debuginfo\captured-fields-1.rs [debuginfo-lldb] tests\debuginfo\c-style-enum-in-composite.rs [debuginfo-lldb] tests\debuginfo\by-value-self-argument-in-trait-impl.rs [debuginfo-lldb] tests\debuginfo\destructured-for-loop-variable.rs [debuginfo-lldb] tests\debuginfo\dummy_span.rs [debuginfo-lldb] tests\debuginfo\evec-in-struct.rs [debuginfo-lldb] tests\debuginfo\destructured-fn-argument.rs [debuginfo-lldb] tests\debuginfo\destructured-local.rs [debuginfo-lldb] tests\debuginfo\generic-struct.rs [debuginfo-lldb] tests\debuginfo\issue-22656.rs [debuginfo-lldb] tests\debuginfo\basic-types-globals.rs#lto [debuginfo-lldb] tests\debuginfo\lexical-scope-in-if.rs [debuginfo-lldb] tests\debuginfo\lexical-scope-in-stack-closure.rs [debuginfo-lldb] tests\debuginfo\lexical-scope-in-unconditional-loop.rs [debuginfo-lldb] tests\debuginfo\lexical-scope-with-macro.rs [debuginfo-lldb] tests\debuginfo\lexical-scope-in-unique-closure.rs [debuginfo-lldb] tests\debuginfo\lexical-scope-in-if-let.rs [debuginfo-lldb] tests\debuginfo\lexical-scopes-in-block-expression.rs [debuginfo-lldb] tests\debuginfo\method-on-generic-struct.rs [debuginfo-lldb] tests\debuginfo\lexical-scope-in-while.rs [debuginfo-lldb] tests\debuginfo\lexical-scope-in-for-loop.rs [debuginfo-lldb] tests\debuginfo\name-shadowing-and-scope-nesting.rs [debuginfo-lldb] tests\debuginfo\no_mangle-info.rs [debuginfo-lldb] tests\debuginfo\packed-struct-with-destructor.rs [debuginfo-lldb] tests\debuginfo\pretty-slices.rs [debuginfo-lldb] tests\debuginfo\packed-struct.rs [debuginfo-lldb] tests\debuginfo\reference-debuginfo.rs [debuginfo-lldb] tests\debuginfo\simple-struct.rs [debuginfo-lldb] tests\debuginfo\simple-lexical-scope.rs [debuginfo-lldb] tests\debuginfo\shadowed-variable.rs [debuginfo-lldb] tests\debuginfo\simple-tuple.rs [debuginfo-lldb] tests\debuginfo\shadowed-argument.rs [debuginfo-lldb] tests\debuginfo\struct-with-destructor.rs [debuginfo-lldb] tests\debuginfo\strings-and-strs.rs [debuginfo-lldb] tests\debuginfo\struct-in-struct.rs [debuginfo-lldb] tests\debuginfo\pretty-std-collections.rs [debuginfo-lldb] tests\debuginfo\tuple-in-tuple.rs [debuginfo-lldb] tests\debuginfo\thread-names.rs#win [debuginfo-lldb] tests\debuginfo\vec-slices.rs [debuginfo-lldb] tests\debuginfo\var-captured-in-sendable-closure.rs [debuginfo-lldb] tests\debuginfo\var-captured-in-stack-closure.rs [debuginfo-lldb] tests\debuginfo\var-captured-in-nested-closure.rs test result: FAILED. 244 passed; 52 failed; 223 ignored; 0 measured; 0 filtered out; finished in 13.22s ``` </details>
…uwer Rollup of 13 pull requests Successful merges: - #158874 (hir_ty_lowering: fix anon const type recovery) - #161443 (add internal DSL for testing binders) - #161617 (Add custom allocators to `(try_)map` on `Box`, `Rc`, `Arc`) - #161726 (Fix debugger visualizer tuple child ordering w/ PDB debug info) - #161729 (miri subtree update) - #161745 (make trivial ABI check resilient against new repr) - #160871 (Remove `#[rustc_reservation_impl]`) - #161180 (Detect missing binding available: add a MaybeIncorrect suggestion) - #161522 (test `f16::mul_add` not double-rounding the result) - #161631 (Add two comments relating to new-solver performance) - #161724 (Add codegen test for static table search loop unrolling) - #161740 (do not compress debuginfo for Cygwin) - #161750 (vector ABI check: reword so it makes more sense for non-obviously-vector types)
Rollup merge of #161726 - Walnut356:pdb_tuple_fields, r=Kobzol Fix debugger visualizer tuple child ordering w/ PDB debug info see: llvm/llvm-project#218613 for an explanation of the issue. tl;dr, PDB fields reflect rustc's reordering, whereas DWARF fields are in source-code-order. This causes issues with `GetChildAtIndex` in cases where both DWARF- and PDB-based types can interact with them. This PR uses field names to retrieve field indexes, rather than blindly indexing into the field array. I did a quick scan over the rest of the `GetChildAtIndex` calls, and they all fall under a few safe cases 1. in DWARF or PDB specific providers (mainly enum discriminants, which can't be reordered anyway) 2. used to get field `0` of a struct with only 1 field 3. in the summary provider where we're typically already interacting with the synthetic value and synthetic children anyway cc #161657, fixes `tests/debuginfo/tuple-struct.rs` on `windows-msvc` <details><summary>`windows-msvc` `tests/debuginfo` results with this change</summary> ``` failures: [debuginfo-lldb] tests\debuginfo\associated-types.rs [debuginfo-lldb] tests\debuginfo\borrowed-basic.rs [debuginfo-lldb] tests\debuginfo\borrowed-unique-basic.rs [debuginfo-lldb] tests\debuginfo\basic-types-globals.rs#no-lto [debuginfo-lldb] tests\debuginfo\borrowed-tuple.rs [debuginfo-lldb] tests\debuginfo\boxed-struct.rs [debuginfo-lldb] tests\debuginfo\captured-fields-2.rs [debuginfo-lldb] tests\debuginfo\cross-crate-spans.rs [debuginfo-lldb] tests\debuginfo\coroutine-locals.rs [debuginfo-lldb] tests\debuginfo\box.rs [debuginfo-lldb] tests\debuginfo\captured-fields-1.rs [debuginfo-lldb] tests\debuginfo\c-style-enum-in-composite.rs [debuginfo-lldb] tests\debuginfo\by-value-self-argument-in-trait-impl.rs [debuginfo-lldb] tests\debuginfo\destructured-for-loop-variable.rs [debuginfo-lldb] tests\debuginfo\dummy_span.rs [debuginfo-lldb] tests\debuginfo\evec-in-struct.rs [debuginfo-lldb] tests\debuginfo\destructured-fn-argument.rs [debuginfo-lldb] tests\debuginfo\destructured-local.rs [debuginfo-lldb] tests\debuginfo\generic-struct.rs [debuginfo-lldb] tests\debuginfo\issue-22656.rs [debuginfo-lldb] tests\debuginfo\basic-types-globals.rs#lto [debuginfo-lldb] tests\debuginfo\lexical-scope-in-if.rs [debuginfo-lldb] tests\debuginfo\lexical-scope-in-stack-closure.rs [debuginfo-lldb] tests\debuginfo\lexical-scope-in-unconditional-loop.rs [debuginfo-lldb] tests\debuginfo\lexical-scope-with-macro.rs [debuginfo-lldb] tests\debuginfo\lexical-scope-in-unique-closure.rs [debuginfo-lldb] tests\debuginfo\lexical-scope-in-if-let.rs [debuginfo-lldb] tests\debuginfo\lexical-scopes-in-block-expression.rs [debuginfo-lldb] tests\debuginfo\method-on-generic-struct.rs [debuginfo-lldb] tests\debuginfo\lexical-scope-in-while.rs [debuginfo-lldb] tests\debuginfo\lexical-scope-in-for-loop.rs [debuginfo-lldb] tests\debuginfo\name-shadowing-and-scope-nesting.rs [debuginfo-lldb] tests\debuginfo\no_mangle-info.rs [debuginfo-lldb] tests\debuginfo\packed-struct-with-destructor.rs [debuginfo-lldb] tests\debuginfo\pretty-slices.rs [debuginfo-lldb] tests\debuginfo\packed-struct.rs [debuginfo-lldb] tests\debuginfo\reference-debuginfo.rs [debuginfo-lldb] tests\debuginfo\simple-struct.rs [debuginfo-lldb] tests\debuginfo\simple-lexical-scope.rs [debuginfo-lldb] tests\debuginfo\shadowed-variable.rs [debuginfo-lldb] tests\debuginfo\simple-tuple.rs [debuginfo-lldb] tests\debuginfo\shadowed-argument.rs [debuginfo-lldb] tests\debuginfo\struct-with-destructor.rs [debuginfo-lldb] tests\debuginfo\strings-and-strs.rs [debuginfo-lldb] tests\debuginfo\struct-in-struct.rs [debuginfo-lldb] tests\debuginfo\pretty-std-collections.rs [debuginfo-lldb] tests\debuginfo\tuple-in-tuple.rs [debuginfo-lldb] tests\debuginfo\thread-names.rs#win [debuginfo-lldb] tests\debuginfo\vec-slices.rs [debuginfo-lldb] tests\debuginfo\var-captured-in-sendable-closure.rs [debuginfo-lldb] tests\debuginfo\var-captured-in-stack-closure.rs [debuginfo-lldb] tests\debuginfo\var-captured-in-nested-closure.rs test result: FAILED. 244 passed; 52 failed; 223 ignored; 0 measured; 0 filtered out; finished in 13.22s ``` </details>
…uwer Rollup of 13 pull requests Successful merges: - rust-lang/rust#158874 (hir_ty_lowering: fix anon const type recovery) - rust-lang/rust#161443 (add internal DSL for testing binders) - rust-lang/rust#161617 (Add custom allocators to `(try_)map` on `Box`, `Rc`, `Arc`) - rust-lang/rust#161726 (Fix debugger visualizer tuple child ordering w/ PDB debug info) - rust-lang/rust#161729 (miri subtree update) - rust-lang/rust#161745 (make trivial ABI check resilient against new repr) - rust-lang/rust#160871 (Remove `#[rustc_reservation_impl]`) - rust-lang/rust#161180 (Detect missing binding available: add a MaybeIncorrect suggestion) - rust-lang/rust#161522 (test `f16::mul_add` not double-rounding the result) - rust-lang/rust#161631 (Add two comments relating to new-solver performance) - rust-lang/rust#161724 (Add codegen test for static table search loop unrolling) - rust-lang/rust#161740 (do not compress debuginfo for Cygwin) - rust-lang/rust#161750 (vector ABI check: reword so it makes more sense for non-obviously-vector types)
…uwer Rollup of 13 pull requests Successful merges: - rust-lang/rust#158874 (hir_ty_lowering: fix anon const type recovery) - rust-lang/rust#161443 (add internal DSL for testing binders) - rust-lang/rust#161617 (Add custom allocators to `(try_)map` on `Box`, `Rc`, `Arc`) - rust-lang/rust#161726 (Fix debugger visualizer tuple child ordering w/ PDB debug info) - rust-lang/rust#161729 (miri subtree update) - rust-lang/rust#161745 (make trivial ABI check resilient against new repr) - rust-lang/rust#160871 (Remove `#[rustc_reservation_impl]`) - rust-lang/rust#161180 (Detect missing binding available: add a MaybeIncorrect suggestion) - rust-lang/rust#161522 (test `f16::mul_add` not double-rounding the result) - rust-lang/rust#161631 (Add two comments relating to new-solver performance) - rust-lang/rust#161724 (Add codegen test for static table search loop unrolling) - rust-lang/rust#161740 (do not compress debuginfo for Cygwin) - rust-lang/rust#161750 (vector ABI check: reword so it makes more sense for non-obviously-vector types)
see: llvm/llvm-project#218613 for an explanation of the issue. tl;dr, PDB fields reflect rustc's reordering, whereas DWARF fields are in source-code-order. This causes issues with
GetChildAtIndexin cases where both DWARF- and PDB-based types can interact with them.This PR uses field names to retrieve field indexes, rather than blindly indexing into the field array.
I did a quick scan over the rest of the
GetChildAtIndexcalls, and they all fall under a few safe cases0of a struct with only 1 fieldcc #161657, fixes
tests/debuginfo/tuple-struct.rsonwindows-msvc`windows-msvc` `tests/debuginfo` results with this change