I am experimenting again with tagging certain function and branches using GCC's builtin attributes.<div><br></div><div>For instance, FEprogram_error is now tagged __attribute__((noreturn)) indicating that it is a function that does not return.</div>
<div><br></div><div>These attributes existed before in ECL's code, but GCC was broken at some point and interpreted "noreturn" also as "nolongjmp". This broke code that captures errors using UNWIND-PROTECT, HANDLER-CASE, etc.</div>
<div><br></div><div>As of GCC 4.* a "noreturn" function is explicitely allowed to use "longjmp" to return to the caller. I would love to simply uncomment all __attribute__((noreturn)), but 1) there is the chance that this is still broken in some corner cases or 2) some people may try to build ECL using GCC 3.4, for instance. Hence my approach is now conservative, using ((noreturn)) only on functions that are called from other functions that do not use those protection mechanisms. Perhaps this is too conservative.</div>
<div><br></div><div>The other optimization is using __builtin_expect() to denote branches of code which are really rare, such as errors.</div><div><br></div><div>The overall gain is right now marginal, in total, but it is quite significant in some cases because those function calls and rare branches are moved out of the function core, which may become slimmer and more efficient. In many cases, for instance, GCC moves all calls to the error functions to the end, much like SBCL does.</div>
<div><br></div><div>Help is welcome in doing this perhaps in a more civilized way, allowing more attributes for more recent versions of GCC, or improving the aestetics of the resulting code via C macros -- __builtin_expect() is definitely ugly.</div>
<div><br></div><div>Juanjo<br clear="all"><br>-- <br>Instituto de Física Fundamental, CSIC<br>c/ Serrano, 113b, Madrid 28006 (Spain) <br><a href="http://juanjose.garciaripoll.googlepages.com">http://juanjose.garciaripoll.googlepages.com</a><br>

</div>