<div dir="ltr">Hi,<div><br></div><div>  Fixed buffers are a c# construct, the il code generared by the c# compiler is not much different than the il code generated for this declaration:</div><div><br></div><div>[StructLayout (LayoutKind.Sequential, Size=32)]</div><div>struct FooStruct {</div><div>   double d;</div><div>}</div><div><br></div><div>The Size= argument is kinda hard to handle in the runtime since it has no counterpart in the native ABIs, the native ABIs assume that structs are made of consecutive fields. So I think the best way to handle this is to special case it as you said.</div><div><br></div><div>                          Zoltan</div><div><br></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Aug 11, 2015 at 11:15 AM, Bill Seurer <span dir="ltr"><<a href="mailto:seurer@linux.vnet.ibm.com" target="_blank">seurer@linux.vnet.ibm.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">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.<br>
<br>
The condition "completely made up of" includes nested structures and arrays (i.e., fixed buffers in C# parlance).  So<span class=""><br>
<br>
        public unsafe struct double_array4 {<br>
                public fixed double f1[4];<br>
        }<br>
<br></span>
needs to be passed in FPRs.  This is in fact the structure I was experimenting with in the output I showed earlier.<br>
<br>
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.<span class=""><br>
<br>
On 08/10/2015 11:32 AM, Zoltan Varga wrote:<br>
</span><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi,<br>
<br><div><div class="h5">
The class has an internal valuetype which represents the fixed buffer,<br>
and that valuetype has the FixedBufferAttribute.<br>
<br>
Runtime code generally doesn't need to care about fixed buffers, why is<br>
this needed ?<br>
<br>
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<br>
<br>
.class public sequential ansi sealed beforefieldinit double_array4<br>
<br>
        extends [mscorlib]System.ValueType<br>
<br>
{<br>
<br>
   .class sequential ansi sealed nested public beforefieldinit<br>
'<f1>__FixedBuffer0'<br>
<br>
          extends [mscorlib]System.ValueType<br>
<br>
   {<br>
<br>
     .pack 0<br>
<br>
     .size 32<br>
<br>
     .custom instance void<br>
[mscorlib]System.Runtime.CompilerServices.UnsafeValueTypeAttribute::.ctor()<br>
= ( 01 00 00 00 )<br>
<br>
     .custom instance void<br>
[mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor()<br>
= ( 01 00 00 00 )<br>
<br>
     .field public float64 FixedElementField<br>
<br>
   } // end of class '<f1>__FixedBuffer0'<br>
<br>
   .field public valuetype double_array4/'<f1>__FixedBuffer0' f1<br>
<br>
   .custom instance void<br>
[mscorlib]System.Runtime.CompilerServices.FixedBufferAttribute::.ctor(class<br>
[mscorlib]System.Type,<br>
<br>
<br>
                       int32) = ( 01 00 5A 53 79 73 74 65 6D 2E 44 6F 75<br>
62 6C 65   // ..ZSystem.Double<br>
<br>
<br>
                                   2C 20 6D 73 63 6F 72 6C 69 62 2C 20<br>
56 65 72 73   // , mscorlib, Vers<br>
<br>
<br>
                                   69 6F 6E 3D 34 2E 30 2E 30 2E 30 2C<br>
20 43 75 6C   // ion=4.0.0.0, Cul<br>
<br>
<br>
                                   74 75 72 65 3D 6E 65 75 74 72 61 6C<br>
2C 20 50 75   // ture=neutral, Pu<br>
<br>
<br>
                                   62 6C 69 63 4B 65 79 54 6F 6B 65 6E<br>
3D 62 37 37   // blicKeyToken=b77<br>
<br>
<br>
                                   61 35 63 35 36 31 39 33 34 65 30 38<br>
39 04 00 00   // a5c561934e089...<br>
<br>
<br>
                                   00 00 00 )<br>
<br>
} // end of class double_array4<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
</blockquote></blockquote></blockquote></blockquote></blockquote></blockquote></blockquote></blockquote></blockquote></blockquote></blockquote></blockquote></blockquote></blockquote></blockquote></blockquote></blockquote></blockquote></blockquote></blockquote></blockquote></blockquote></blockquote></blockquote></blockquote></blockquote></blockquote></blockquote></blockquote></blockquote></blockquote></blockquote></blockquote></blockquote></blockquote></blockquote></blockquote></blockquote></blockquote></blockquote></blockquote></blockquote></blockquote></blockquote></blockquote></blockquote></blockquote></blockquote></blockquote>
<br>
<br>
On Mon, Aug 10, 2015 at 10:53 AM, Bill Seurer <<a href="mailto:seurer@linux.vnet.ibm.com" target="_blank">seurer@linux.vnet.ibm.com</a><br></div></div><div><div class="h5">
<mailto:<a href="mailto:seurer@linux.vnet.ibm.com" target="_blank">seurer@linux.vnet.ibm.com</a>>> wrote:<br>
<br>
    The only mention of FixedBufferAttribute I see is in the C# code in mcs.<br>
<br>
    I looked through all the mono C code and I see several places where<br>
    MonoCustomAttrInfo is used but no where is it doing anything with<br>
    fixed buffers.  Is there some documentation or more examples of what<br>
    is in the MonoCustomAttrInfo data for something like this?<br>
<br>
    I experimented a bit and used mono_custom_attrs_from_class() to pull<br>
    the MonoCustomAttrInfo for the class.  It looks like there are two<br>
    attributes.<br>
<br>
    {num_attrs = 2, cached = 0, image = 0x10566ed0, attrs = 0x1061c630}<br>
<br>
    So looking at the two attributes I see<br>
<br>
    attrs[0]:  {ctor = 0x1061cb10, data_size = 4, data = 0x3fffb7840e71<br>
    "\001"}<br>
    attrs[1]:  {ctor = 0x1061c990, data_size = 4, data = 0x3fffb7840e71<br>
    "\001"}<br>
<br>
<br>
    The data fields are identical and are 01 00 00 00 or maybe the other<br>
    way around depending on what the field represents (this is a LE<br>
    machine).<br>
<br>
    The ctors are<br>
<br>
    (gdb) print cinfo->attrs[0].ctor->klass->name<br>
    $14 = 0x3fffb5b225b6 "UnsafeValueTypeAttribute"<br>
    (gdb) print cinfo->attrs[1].ctor->klass->name<br>
    $15 = 0x3fffb5b22281 "CompilerGeneratedAttribute"<br>
<br>
    What do those represent?<br>
<br>
<br>
    On 08/06/2015 12:23 PM, Zoltan Varga wrote:<br>
<br>
        Hi,<br>
<br>
            The type has a FixedBufferAttribute custom attribute which<br>
        contains<br>
        the length of the array. There are some functions in reflection.c<br>
        like mono_custom_attrs_from_class () which can return<br>
        information about it.<br>
<br>
                         Zoltan<br>
<br>
        On Thu, Aug 6, 2015 at 12:32 PM, Bill Seurer<br>
        <<a href="mailto:seurer@linux.vnet.ibm.com" target="_blank">seurer@linux.vnet.ibm.com</a> <mailto:<a href="mailto:seurer@linux.vnet.ibm.com" target="_blank">seurer@linux.vnet.ibm.com</a>><br></div></div>
        <mailto:<a href="mailto:seurer@linux.vnet.ibm.com" target="_blank">seurer@linux.vnet.ibm.com</a><span class=""><br>
        <mailto:<a href="mailto:seurer@linux.vnet.ibm.com" target="_blank">seurer@linux.vnet.ibm.com</a>>>> wrote:<br>
<br>
             In some code in mono/mini I need to figure out how many<br>
        elements<br>
             there are in a fixed buffer field in a struct, something<br>
        like this:<br>
<br>
                      public unsafe struct double_array4 {<br>
                              public fixed double f1[4];<br>
                      }<br>
<br>
             So I'd need to know "4".<br>
<br>
             I can get the MonoClass of the field from the MonoFieldType<br>
        and if I<br>
             print out the name I get<br>
<br>
             Test_double.double_array4.<f1>__FixedBuffer0<br>
<br>
             so it knows it is a fixed buffer.  If I look at the fields<br>
        of the<br>
             struct in the above example there is just one and it's a<br>
        double.<br>
<br>
             So how can I figure out the number of elements?<br>
<br>
             Thanks!<br>
<br>
<br>
<br>
    --<br>
<br>
    -Bill Seurer<br>
<br>
<br>
</span></blockquote><span class="HOEnZb"><font color="#888888">
<br>
<br>
-- <br>
<br>
-Bill Seurer<br>
<br>
</font></span></blockquote></div><br></div>