4 ms·
> I very much hope that the attribute will catch on, spreading to GCC, Visual C++, and other popular compilers, AFAIK, attribute musttail is in the process of
by gpderetta 2y ago
> I very much hope that the attribute will catch on, spreading to GCC, Visual C++, and other popular compilers,
AFAIK, attribute musttail is in the process of being added to GCC (the patch is under review) with semantics compatible with clang.
- ufo 2y agoWhat about the preserve_most attribute? Is there any chance something like that will get into GCC? Without it, the non-tail calls ruin the interpreter.
- gpderetta 2y agoMaybe, but not there yet: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110899 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110899 In the meantime some inline assembly macro trickery might help. edit: code duplication can also be obviated by templating your op function with a fast/slow parameter, with the fast variant tail-calling the slow variant when it cannot perform the fast path, while guarding the slow code via the compile time parameter. The downside is yet more code obfuscation of course.
- katzinsky 2y agoGiven some of the other scheme-like features GNUC has it's surprising they're lagging on this one.
- fweimer 2y agoIt's a hard problem because many ABIs cannot do tail calls even for very basic stuff, like calls to extern functions with matching argument and return types. It looks like Clang has some heuristics for changing call sequences for musttail calls. For example, it switches to noplt calls on i686. None of this is mentioned in the Clang documentation: https://clang.llvm.org/docs/AttributeReference.html#musttail https://clang.llvm.org/docs/AttributeReference.html#musttail What's realistic here is that you get a diagnostic if the compiler cannot generate a tail call. For many users, that will likely be good enough. Guaranteeing a tail call as in Scheme is unlikely to happen.