<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><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">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>On Sep 22, 2011, at 3:29 AM, Renato Golin wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div>On 22 September 2011 03:30, Eli Friedman <<a href="mailto:eli.friedman@gmail.com">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/">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/">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/">http://systemcall.org/</a><br>_______________________________________________<br>LLVM Developers mailing list<br>LLVMdev@cs.uiuc.edu         http://llvm.cs.uiuc.edu<br>http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev<br></div></blockquote></div><br></body></html>