Skip to content

Make Vector64<T>, Vector128<T>, and Vector256<T> work with the debugger. #9495

@tannergooding

Description

@tannergooding

Rationale

Currently Vector64<T>, Vector128<T> and Vector256<T> in the System.Runtime.Intrinsics namespace are opaque types.

This is great for the hardware intrinsics API, but it provides a very poor experience in the debugger.

As such, I propose that the types be extended with the DebuggerTypeProxy and DebuggerDisplay attributes to provide a better debugging experience.

Additional Thoughts

I propose the DebuggerDisplay attribute should display a string of T elements.

Ex: For Vector128<float>, it would display "{e0, e1, e2, e3}", for Vector128<ushort> it would display "{e0, e1, e2, e3, e4, e5, e6, e7}" (where e# is the value of that given element).

I propose DebuggerTypeProxy should have several properties in the form of public <type>[] <type>View and there should be a property for each supported value of T (i.e. float, double, byte, short, int, long, sbyte, ushort, uint, and ulong).

Ex: Vector128DebugView would have public byte[] ByteView {get;}, public float[] SingleView {get;}, etc...

Notes

In doing a prototype for this proposal, I found that the debugger would always see 0 as the value of the underlying struct. I initially attempted to add serialization support, but that did not resolve the issue.

However, adding private fields to the structs allowed it to work (I'm guessing the debugger is marshalling the type, or something similar).

Ex: I had to change Vector128<T> to the following in order for DebuggerTypeProxy and DebuggerDisplay to work:

[Intrinsic]
[StructLayout(LayoutKind.Sequential, Size = 16)]
[DebuggerTypeProxy(typeof(Vector128DebugView<>))]
[DebuggerDisplay("{DebuggerDisplay,nq}")]
public struct Vector128<T> where T : struct
{
    // These fields exist purely so debug view works
    private ulong _lower;
    private ulong _upper;
}

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions