<br><br><div class="gmail_quote">On Wed, Jul 13, 2011 at 6:51 AM, Mirko Wischer <span dir="ltr">&lt;<a href="mailto:Mirko.Wischer@sma.de">Mirko.Wischer@sma.de</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
Hi all,<br>
<br>
I&#39;m running mono 2.10.2 on ARM with soft-float.<br>
During tests mono segfaults during JIT. After<br>
some code analysis I think I have an idea what went wrong.<br>
I wrote a bugreport at<br>
<a href="https://bugzilla.novell.com/show_bug.cgi?id=705186" target="_blank">https://bugzilla.novell.com/show_bug.cgi?id=705186</a><br>
<br>
The following example-code segfaults on ARM with soft-float:<br>
<br>
public static void bad_soft_float_decompose(bool doEnter)<br>
{<br>
        float f = 1.3f;<br>
<br>
        if (doEnter)<br>
      {<br>
           Console.WriteLine(&quot;This nesting is needed to make mono segfault :-)&quot;);<br>
           if (f == 0.0)<br>
           {<br>
           }<br>
      }<br>
      Console.WriteLine(&quot;On ARM with soft-float we never get called because JIT has a segfault in decompose.c&quot;);<br>
}<br>
<br>
<br>
The float compare and the empty block will be converted (JIT) to<br>
<br>
OP_FCOMPARE XXX<br>
OP_BXX<br>
<br>
After optimization this becomes<br>
<br>
OP_FCOMPARE<br>
OP_NOP<br>
<br>
And finally just OP_FCOMPARE as last instruction in bb (verified in gdb)<br>
<br>
Now the ARM specific soft-float decompose in mono/mini/decompose.c tries<br>
to replace OP_FCOMPARE + next instruction with some soft-float ARM code.<br>
But the next ins pointer is null so line 1588 in decompose.c segfaults.<br>
<br>
I think there are two ways of fixing this bug:<br>
- First checking in soft-float-decompose if ins-&gt;next is null and handling this case.<br>
- Second not only NOPing/removing the branch in optimization also NOPing the FCOMPARE.<br>
<br>
What would be the preferred way of fixing this?<br><br></blockquote><div><br></div><div>The code on soft-float decomposition should handle this case.</div><div> </div></div>