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 <seu...@linux.vnet.ibm.com
<mailto:seu...@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
        <seu...@linux.vnet.ibm.com <mailto:seu...@linux.vnet.ibm.com>
        <mailto:seu...@linux.vnet.ibm.com
        <mailto:seu...@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

_______________________________________________
Mono-devel-list mailing list
Mono-devel-list@lists.ximian.com
http://lists.ximian.com/mailman/listinfo/mono-devel-list

Reply via email to