[llvm-dev] help me understand how nounwind attribute on functions works?

Andrew Kelley via llvm-dev llvm-dev at lists.llvm.org
Sun Feb 5 08:32:44 PST 2017


from http://llvm.org/docs/LangRef.html:

nounwind
> 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.


Some things I noticed by looking at various C test programs with clang -S
-emit-llvm:

 * If a function definition is provided, it gets nounwind, even if it calls
a non-nounwind function
 * If a function is external (no definition provided), it does not get
nounwind

What I don't understand is:
 * 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.
 * 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?

Regards,
Andrew
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170205/15595437/attachment-0001.html>


More information about the llvm-dev mailing list