[Mono-dev] Number of elements in a fixed buffer

Bill Seurer seurer at linux.vnet.ibm.com
Tue Aug 11 15:15:06 UTC 2015


The ELF ABI v2 changed how parameters that are structures are passed to 
functions and also how structures are returned.  One of the changes is 
that if a structure parameter is completely made up of 8 or fewer 
doubles xor floats then the structure is passed in FPRs instead of GPRs.

The condition "completely made up of" includes nested structures and 
arrays (i.e., fixed buffers in C# parlance).  So

	public unsafe struct double_array4 {
		public fixed double f1[4];
	}

needs to be passed in FPRs.  This is in fact the structure I was 
experimenting with in the output I showed earlier.

I can sort of detect this by the size of the field being 32 while only 
having one double member (size of 8) but that seems clumsy and possibly 
inaccurate.  I figured that it should be possible to see that it is a 
fixed buffer (array) and that it has 4 elements.

On 08/10/2015 11:32 AM, Zoltan Varga wrote:
> Hi,
>
> The class has an internal valuetype which represents the fixed buffer,
> and that valuetype has the FixedBufferAttribute.
>
> Runtime code generally doesn't need to care about fixed buffers, why is
> this needed ?
>
> <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
>
> .class public sequential ansi sealed beforefieldinit double_array4
>
>         extends [mscorlib]System.ValueType
>
> {
>
>    .class sequential ansi sealed nested public beforefieldinit
> '<f1>__FixedBuffer0'
>
>           extends [mscorlib]System.ValueType
>
>    {
>
>      .pack 0
>
>      .size 32
>
>      .custom instance void
> [mscorlib]System.Runtime.CompilerServices.UnsafeValueTypeAttribute::.ctor()
> = ( 01 00 00 00 )
>
>      .custom instance void
> [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor()
> = ( 01 00 00 00 )
>
>      .field public float64 FixedElementField
>
>    } // end of class '<f1>__FixedBuffer0'
>
>    .field public valuetype double_array4/'<f1>__FixedBuffer0' f1
>
>    .custom instance void
> [mscorlib]System.Runtime.CompilerServices.FixedBufferAttribute::.ctor(class
> [mscorlib]System.Type,
>
>
>                        int32) = ( 01 00 5A 53 79 73 74 65 6D 2E 44 6F 75
> 62 6C 65   // ..ZSystem.Double
>
>
>                                    2C 20 6D 73 63 6F 72 6C 69 62 2C 20
> 56 65 72 73   // , mscorlib, Vers
>
>
>                                    69 6F 6E 3D 34 2E 30 2E 30 2E 30 2C
> 20 43 75 6C   // ion=4.0.0.0, Cul
>
>
>                                    74 75 72 65 3D 6E 65 75 74 72 61 6C
> 2C 20 50 75   // ture=neutral, Pu
>
>
>                                    62 6C 69 63 4B 65 79 54 6F 6B 65 6E
> 3D 62 37 37   // blicKeyToken=b77
>
>
>                                    61 35 63 35 36 31 39 33 34 65 30 38
> 39 04 00 00   // a5c561934e089...
>
>
>                                    00 00 00 )
>
> } // end of class double_array4
>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>
>
> On Mon, Aug 10, 2015 at 10:53 AM, Bill Seurer <seurer at linux.vnet.ibm.com
> <mailto:seurer at linux.vnet.ibm.com>> wrote:
>
>     The only mention of FixedBufferAttribute I see is in the C# code in mcs.
>
>     I looked through all the mono C code and I see several places where
>     MonoCustomAttrInfo is used but no where is it doing anything with
>     fixed buffers.  Is there some documentation or more examples of what
>     is in the MonoCustomAttrInfo data for something like this?
>
>     I experimented a bit and used mono_custom_attrs_from_class() to pull
>     the MonoCustomAttrInfo for the class.  It looks like there are two
>     attributes.
>
>     {num_attrs = 2, cached = 0, image = 0x10566ed0, attrs = 0x1061c630}
>
>     So looking at the two attributes I see
>
>     attrs[0]:  {ctor = 0x1061cb10, data_size = 4, data = 0x3fffb7840e71
>     "\001"}
>     attrs[1]:  {ctor = 0x1061c990, data_size = 4, data = 0x3fffb7840e71
>     "\001"}
>
>
>     The data fields are identical and are 01 00 00 00 or maybe the other
>     way around depending on what the field represents (this is a LE
>     machine).
>
>     The ctors are
>
>     (gdb) print cinfo->attrs[0].ctor->klass->name
>     $14 = 0x3fffb5b225b6 "UnsafeValueTypeAttribute"
>     (gdb) print cinfo->attrs[1].ctor->klass->name
>     $15 = 0x3fffb5b22281 "CompilerGeneratedAttribute"
>
>     What do those represent?
>
>
>     On 08/06/2015 12:23 PM, Zoltan Varga wrote:
>
>         Hi,
>
>             The type has a FixedBufferAttribute custom attribute which
>         contains
>         the length of the array. There are some functions in reflection.c
>         like mono_custom_attrs_from_class () which can return
>         information about it.
>
>                          Zoltan
>
>         On Thu, Aug 6, 2015 at 12:32 PM, Bill Seurer
>         <seurer at linux.vnet.ibm.com <mailto:seurer at linux.vnet.ibm.com>
>         <mailto:seurer at linux.vnet.ibm.com
>         <mailto:seurer at linux.vnet.ibm.com>>> wrote:
>
>              In some code in mono/mini I need to figure out how many
>         elements
>              there are in a fixed buffer field in a struct, something
>         like this:
>
>                       public unsafe struct double_array4 {
>                               public fixed double f1[4];
>                       }
>
>              So I'd need to know "4".
>
>              I can get the MonoClass of the field from the MonoFieldType
>         and if I
>              print out the name I get
>
>              Test_double.double_array4.<f1>__FixedBuffer0
>
>              so it knows it is a fixed buffer.  If I look at the fields
>         of the
>              struct in the above example there is just one and it's a
>         double.
>
>              So how can I figure out the number of elements?
>
>              Thanks!
>
>
>
>     --
>
>     -Bill Seurer
>
>


-- 

-Bill Seurer



More information about the Mono-devel-list mailing list