<div dir="ltr">I think this behavior is intended to allow better LTO between C and C++. Consider this kind of code:<div><br></div><div>// foo.h</div><div>extern "C" int doThing(bool canThrow);</div><div>// foo.cpp</div><div>int doThing(bool canThrow) {</div><div>  ...</div><div>  if (hadError) {</div><div>    if (canThrow) throw MyException; else return -1;<br>  }</div><div>}</div><div>// bar.c</div><div>#include "foo.h"</div><div>void f() {</div><div>  doThing(false); // don't declare doThing as nounwind<br>}</div><div>// baz.cpp</div><div>...</div><div>  doThing(true);</div><div><br></div><div>Basically, compiling a C declaration for a function is not an assertion that it never throws an exception. However, *defining* a function in a C TU implies that it will not throw an exception.</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Feb 5, 2017 at 8:32 AM, Andrew Kelley via llvm-dev <span dir="ltr"><<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>from <a href="http://llvm.org/docs/LangRef.html" target="_blank">http://llvm.org/docs/<wbr>LangRef.html</a>:</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">nounwind<br>This function attribute indicates that the function never raises an exception. If the function does raise an exception, its runtime behavior is undefined. However, functions marked nounwind may still trap or generate asynchronous exceptions. Exception handling schemes that are recognized by LLVM to handle asynchronous exceptions, such as SEH, will still provide their implementation defined semantics.</blockquote><div><br></div><div>Some things I noticed by looking at various C test programs with clang -S -emit-llvm:</div><div><br></div><div> * If a function definition is provided, it gets nounwind, even if it calls a non-nounwind function</div><div> * If a function is external (no definition provided), it does not get nounwind</div><div><br></div><div>What I don't understand is:</div><div> * A non-nounwind function that calls a nounwind function, wouldn't the ability for an exception to be thrown transfer? I thought if you don't catch an exception, it bubbles up to the caller and so on.</div><div> * More importantly, if compiling in C mode, why doesn't every function have nounwind? I thought that C does not have exceptions, so calling a function and having it throw an exception would be undefined behavior anyway. Wouldn't that mean every function should be nounwind?</div><div><br></div><div>Regards,</div><div>Andrew<br></div></div>
<br>______________________________<wbr>_________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-dev</a><br>
<br></blockquote></div><br></div>