[Mono-dev] AOT and generics

Virgile Bello virgile.bello at gmail.com
Mon Jul 9 05:21:26 UTC 2012


Ok, just did a bug report:
https://bugzilla.xamarin.com/show_bug.cgi?id=6040
Also, I attempted to fix it, seems working so far.
I published it on github (link is inside the bug report).

On Sat, Jul 7, 2012 at 12:21 AM, Virgile Bello <virgile.bello at gmail.com>wrote:

> Thanks for the confirmation, that's what I could guess as well (one shared
> code for every ref instance).
> However, in that case, I can't think of any way this code can run because
> for every ref type in A, the method B::Test<X<T>>() will need to be
> generated (X being a struct -- it's just like "bringing" a non-shareable
> struct type into the shared generic instance). Basically, if the class is
> requested with T, if it has any method call depending on T, they should be
> generated. It seems to actually be done if B::Test<T> is called but not
> B::Test<X<T>>. There might be some other related cases as well (when
> bringing a struct into a generic type). That's why I was suggesting sharing
> might be problematic in this case, I will take a look at the code to have a
> better idea of it.
>
> Also, I will double check my setup, but it pretty seems standard (other
> AOT stuff works fine, experimenting under linux x64).
> Anyway, I will fill a bug to not pollute the mailing list too much.
>
> Virgile
>
>
> On Fri, Jul 6, 2012 at 11:39 PM, Rodrigo Kumpera <kumpera at gmail.com>wrote:
>
>> The FullAOT compiler handles generics by compiling a single shared
>> instance for all ref-only type arguments.
>> so List<object> shares code with List<string> but List<int> gets its own
>> version. This is the default behavior.
>>
>> If this is not the case, then you have something broken in your setup.
>>
>>
>> On Fri, Jul 6, 2012 at 11:24 AM, Virgile Bello <virgile.bello at gmail.com>wrote:
>>
>>> It would be for platforms supporting only AOT.
>>> Of course we would license Mono. We already had a quick discussion about
>>> licensing maybe a year ago (it's still R&D/proof of concept for now, and it
>>> was only Windows until now so we just delayed actual deal until necessary),
>>> but thanks for pointing out, maybe now is a good time to start the
>>> discussion again with Xamarin, I will send an email right away.
>>>
>>>
>>> On Fri, Jul 6, 2012 at 10:31 PM, Rodrigo Kumpera <kumpera at gmail.com>wrote:
>>>
>>>> You need to correctly drive the FullAOT compiler.
>>>> Why do you want to use FullAOT anyway?
>>>> Do you plan to run it on a target that disables JIT?
>>>> Do you hold a license that allows you to do so? Mono is LGPL and
>>>> FullAOT doesn't work with it.
>>>>
>>>> On Fri, Jul 6, 2012 at 9:29 AM, Virgile Bello <virgile.bello at gmail.com>wrote:
>>>>
>>>>> During full AOT, It seems that if generics is a ref type, AOT is
>>>>> skipped (which makes sense because most of the time it is not necessary,
>>>>> one codegen for any ref type is usually enough).
>>>>> However, if the class internally uses a struct based on the generic
>>>>> types, it will fail at runtime.
>>>>> Here is a simple example showcasing the issue:
>>>>>
>>>>> public class B
>>>>> {
>>>>>     public void Test<T>()
>>>>>     {
>>>>>         System.Console.WriteLine(typeof(T));
>>>>>     }
>>>>> }
>>>>>
>>>>> public class A<T>
>>>>> {
>>>>>     public void Test()
>>>>>     {
>>>>>         new B().Test<System.Collections.Generic.KeyValuePair<T, T>>();
>>>>>     }
>>>>> }
>>>>>
>>>>>
>>>>> class P
>>>>> {
>>>>>     static void Main(string[] args)
>>>>>     {
>>>>>         new A<int>().Test();
>>>>>         new A<string>().Test();
>>>>>     }
>>>>> }
>>>>>
>>>>> If I run this program with full aot, it will fail.
>>>>> new A<int> will work (AOT forced because value type)
>>>>> However, new A<string> will generate a JIT exception (because even
>>>>> though string is a ref type, A should be AOT for this specific type because
>>>>> KeyValuePair inside A<T> needs to be JITed.)
>>>>>
>>>>> But maybe I misunderstood the problem (or it is just a specific bug),
>>>>> because this other case actually work (I was expecting it to have the same
>>>>> issue):
>>>>>
>>>>> public class B
>>>>> {
>>>>>     public void Test<T>()
>>>>>     {
>>>>>
>>>>> System.Console.WriteLine(typeof(System.Collections.Generic.KeyValuePair<T,
>>>>> T>));
>>>>>     }
>>>>> }
>>>>>
>>>>> public class A<T>
>>>>> {
>>>>>     public void Test()
>>>>>     {
>>>>>         new B().Test<T>();
>>>>>     }
>>>>> }
>>>>>
>>>>>
>>>>> class P
>>>>> {
>>>>>     static void Main(string[] args)
>>>>>     {
>>>>>         new A<int>().Test();
>>>>>         new A<string>().Test();
>>>>>     }
>>>>> }
>>>>>
>>>>> Just wanted to check if I understood the issue right and if there
>>>>> would be nothing preventing from fixing it?
>>>>> I wouldn't mind taking a look at the sources by myself if necessary.
>>>>>
>>>>> Virgile
>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> Mono-devel-list mailing list
>>>>> Mono-devel-list at lists.ximian.com
>>>>> http://lists.ximian.com/mailman/listinfo/mono-devel-list
>>>>>
>>>>>
>>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.ximian.com/pipermail/mono-devel-list/attachments/20120709/5815b068/attachment.html>


More information about the Mono-devel-list mailing list