Using GCC's Nested Functions with Wide Pointers and No Trampolines II
La prise d'adresse d'une fonction imbriquée obligeait GCC à générer un trampoline en pile rendant la pile exécutable, ce qui pose des problèmes de sécurité et de coût quand le trampoline est alloué sur le tas. L'auteur avait proposé un type de pointeur large et présenté un patch préliminaire pour éviter ces trampolines en transférant la chaîne statique autrement. Depuis GCC 16, une fonction imbriquée qui n'accède pas aux variables de la fonction parente est garantie de ne pas nécessiter de trampoline, même sans optimisation, et le compilateur signale les retours de fonctions qui capturent le contexte. Une version du patch a été fusionnée dans la branche de développement de GCC et ajoute des builtins permettant, avec __builtin_call_with_static_chain, d'appeler des fonctions imbriquées capturant le contexte sans générer de trampolines en passant la chaîne statique via un registre dédié. On peut rendre l'usage plus ergonomique en définissant un type large et des macros, obtenir des optimisations très efficaces, et l'auteur annonce des travaux futurs sur la portabilité entre GCC et clang et des moyens d'éviter les trampolines sur d'anciennes versions.