Thanks! Your suggestions are really helpful to me. I am verifying the differences and will provide my findings soon.<div><div><div><br>--<br>Best Regards,<br>Fei Jia</div><div><br></div><br>
<br><br><div class="gmail_quote">On Thu, Sep 22, 2011 at 2:33 PM, Anna Zaks <span dir="ltr"><<a href="mailto:ganna@apple.com">ganna@apple.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

<div style="word-wrap:break-word"><div><div>Another difference is the presence of exceptions in C++, which would require you to handle more IR instructions. This might not matter depending on type of analysis you do.</div>

<div>See: <a href="http://llvm.org/docs/LangRef.html#i_invoke" target="_blank">http://llvm.org/docs/LangRef.html#i_invoke</a></div><div>(Note that there is a substantial rewrite of exception handling going into 3.0)</div>

<div><br></div><div>Anna.</div><div><div></div><div class="h5"><div>On Sep 22, 2011, at 3:29 AM, Renato Golin wrote:</div><br></div></div><blockquote type="cite"><div><div><div></div><div class="h5">On 22 September 2011 03:30, Eli Friedman <<a href="mailto:eli.friedman@gmail.com" target="_blank">eli.friedman@gmail.com</a>> wrote:<br>

<blockquote type="cite"><blockquote type="cite">I am trying to find such difference of bitcode between C and C++.<br></blockquote></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">There isn't any difference in that sense... in IR, a constructor is<br>

</blockquote><blockquote type="cite">just a function call, a reference is just a pointer, etc.<br></blockquote><br>Hi Fei,<br><br>While Clang (like others) lowers C++ into C semantics and lower that<br>into IR, there are some changes that exist in C++ and not in C. The IR<br>

has the same features, but some assumptions on the semantics are<br>different.<br><br>I can give you two examples:<br><br>1. Classes in C++ are like C structures in IR, but the C++ ABI makes<br>it difficult to express Base/Derived classes in pure structures.<br>

(<a href="http://www.systemcall.org/blog/2011/01/cpp-class-sizes/" target="_blank">http://www.systemcall.org/blog/2011/01/cpp-class-sizes/</a> and<br><a href="http://www.systemcall.org/blog/2011/03/cpp-class-sizes-2/" target="_blank">http://www.systemcall.org/blog/2011/03/cpp-class-sizes-2/</a>).<br>

<br>So, if your pass depends on identifying the same types, you could end<br>up thinking that the types are different, but they're not. They're<br>just different struct representations (base vs. derived) of the same<br>

type.<br><br>2. Virtual table tables encode offsets in two different ways:<br>addresses and offsets, and the two representations are normally on the<br>same global static array in IR. So, while the type of the array is int<br>

(or pointer), it contains addresses and offsets from addresses<br>bitcasting to the type of the global.<br><br>These are not the only C-lowering that C++ front-ends do, but it gives<br>you a taste of what to expect. As Eli said, most of C++ can be lowered<br>

into C-like structures and the IR is very similar, but some semantic<br>interpretations are done differently, and the internal IR (that deals<br>with those objects) is slightly different.<br><br><br>-- <br>cheers,<br>--renato<br>

<br><a href="http://systemcall.org/" target="_blank">http://systemcall.org/</a><br></div></div>_______________________________________________<br>LLVM Developers mailing list<br><a href="mailto:LLVMdev@cs.uiuc.edu" target="_blank">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu" target="_blank">http://llvm.cs.uiuc.edu</a><br>

<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><br></div></blockquote></div><br></div></blockquote></div><br></div></div>