<html><body bgcolor="#FFFFFF"><div>It's essentially the sane thing. :-) I don't quite understand the code. Is 'v' ever assigned a value before 'v.Call()'?</div><div><br></div><div>Two options remain, from what I can see. Either mark v as volatile, or compile without optimizations. The second is more drastic.</div><div><br></div><div>If you *really* want it to perform a call on null. Then you could place a function in another module that only returns null, then do the call:</div><div><br></div><div>// module A</div><div>typedef void (*func)();</div><div><br></div><div>func Foo() { return 0; }</div><div><br></div><div>// module B</div><div><br></div><div>Foo().Call();</div><div><br></div><div>And then make sure you don't perform LTO. <br><br>-bw</div><div><br>On Sep 5, 2009, at 4:59 PM, Zoltan Varga <<a href="mailto:vargaz@gmail.com">vargaz@gmail.com</a>> wrote:<br><br></div><div></div><blockquote type="cite"><div>Hi,<br><br>  I don't intentionally want to induce a tramp, the load null is created by an llvm optimization<br>pass from code like:<br>   v = null;<br>   .....<br>   v.Call ();<br><br>            Zoltan<br><br><div class="gmail_quote">
On Sat, Sep 5, 2009 at 11:39 PM, Bill Wendling <span dir="ltr"><<a href="mailto:isanbard@gmail.com"><a href="mailto:isanbard@gmail.com">isanbard@gmail.com</a></a>></span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Hi Zoltan,<br>
<br>
We've come across this before where people meant to induce a trap by dereferencing a null. It doesn't work for LLVM (as you found out). Essentially, it's a valid transformation to turn this into unreachable. The better solution is to use something like __builtin_trap.<br>

<br>
-bw<div><div></div><div class="h5"><br>
<br>
On Sep 5, 2009, at 2:19 PM, Zoltan Varga <<a href="mailto:vargaz@gmail.com" target="_blank"><a href="mailto:vargaz@gmail.com">vargaz@gmail.com</a></a>> wrote:<br>
<br>
</div></div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><div><div></div><div class="h5">
<br>
                Hi,<br>
<br>
  Currently, llvm treats the loads from a null address as unreachable code, i.e.:<br>
     load i32* null<br>
is transformed by some optimization pass into<br>
    unreachable<br>
<br>
This presents problems in JIT compilers like mono which implement null pointer checks by trapping SIGSEGV signals. It also<br>
looks incorrect since it changes program behavior, which might be undefined in general, but it is quite well defined on unix.<br>
Is there a way to prevent llvm from doing this besides marking all loads as volatile ?<br>
<br>
                          thanks<br>
<br>
                              Zoltan<br>
<br></div></div>
_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:LLVMdev@cs.uiuc.edu" target="_blank"><a href="mailto:LLVMdev@cs.uiuc.edu">LLVMdev@cs.uiuc.edu</a></a>         <a href="http://llvm.cs.uiuc.edu" target="_blank"><a href="http://llvm.cs.uiuc.edu">http://llvm.cs.uiuc.edu</a></a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" target="_blank"><a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a></a><br>
</blockquote>
</blockquote></div><br>
</div></blockquote></body></html>