<div dir="ltr"><div>from <a href="http://llvm.org/docs/LangRef.html">http://llvm.org/docs/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>