From: Rodrigo Kumpera Date: Sat, 31 Jan 2009 03:51:45 +0000 (-0000) Subject: 2009-01-31 Rodrigo Kumpera X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=commitdiff_plain;h=82a90c9311b1897d545ad2d8563c2e814ac3b636;p=mono.git 2009-01-31 Rodrigo Kumpera * basic-calls.cs: Test for the weird crash found on arm. svn path=/trunk/mono/; revision=125206 --- diff --git a/mono/mini/ChangeLog b/mono/mini/ChangeLog index e2ea703b056..d010e1bf03f 100644 --- a/mono/mini/ChangeLog +++ b/mono/mini/ChangeLog @@ -1,3 +1,7 @@ +2009-01-31 Rodrigo Kumpera + + * basic-calls.cs: Test for the weird crash found on arm. + 2009-01-31 Rodrigo Kumpera * cpu-arm.md: Increase the size of storer8_membase_reg and diff --git a/mono/mini/basic-calls.cs b/mono/mini/basic-calls.cs index 77996ab2ee3..08d43d548ec 100644 --- a/mono/mini/basic-calls.cs +++ b/mono/mini/basic-calls.cs @@ -23,6 +23,18 @@ using System.Reflection; * the IL code looks. */ +struct Alpha { + public long a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v; +} + +struct Beta { + public Alpha a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v; +} + +struct Gamma { + public Beta a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v; +} + class Tests { static int Main () { @@ -288,5 +300,47 @@ class Tests { return 0; } + static void InitMe (out Gamma noMercyWithTheStack) { + noMercyWithTheStack = new Gamma (); + } + + static int FunNoInline () { + int x = 99; + if (x > 344 && x < 22) + throw new Exception ("333"); + return x; + } + + static float DoNothingButDontInline (float a, int b) { + if (b > 0) + return a; + else if (b < 0 && b > 10) + throw new Exception ("444"); + return a; + } + + /* + * The local register allocator emits loadr8_membase and storer8_membase + * to do spilling. This code is generated after mono_arch_lowering_pass so + * mono_arch_output_basic_block must know how to deal with big offsets. + * This only happens because the call in middle forces the temp for "(float)obj" + * to be spilled. + */ + static int test_0_float_load_and_store_with_big_offset () + { + object obj = 1.0f; + Gamma noMercyWithTheStack; + float res; + + InitMe (out noMercyWithTheStack); + + res = DoNothingButDontInline ((float)obj, FunNoInline ()); + + if (!(res == 1.0f)) { + Console.WriteLine ("invalid number {0}", res); + return 1; + } + return 0; + } }