Question

GCC prend en charge les modèles de traitement des exceptions Setjump-longjump (sjlj) et Dwarf2 basés sur la table (dw2). Quelle est la différence entre les deux modèles et comment choisir le modèle approprié? Pourquoi le déroulement basé sur table Dwarf2 (dw2) est-il le modèle le plus efficace? Je comprends que les deux modèles ne peuvent pas être mélangés.

Référence: Aperçu technologique: gcc-4.2.1-sjlj -2

Était-ce utile?

La solution

Eh bien, dwarf2 construit des tables pour chaque fonction, contenant ce que sont les registres appelés appelés et où ils sont enregistrés dans la pile, et où se trouve le pointeur / l’adresse de retour de la pile d’appel, ainsi que d’autres éléments. Si vous utilisez dwarf2, le compilateur peut utiliser ces informations pour restaurer efficacement les registres et revenir aux appelants en cas d'exception. Les serveurs doivent fournir des informations dans le code de génération du prologue de leurs implémentations, pour indiquer à GCC quels registres sont appelés, et quand le pointeur de la trame a été sauvegardé, etc.

Utiliser setjmp / longjmp n’est qu’un hack. Setjmp / longjmp ne connaissant pas la structure de la fonction, il restaure tous les registres enregistrés dans le tampon de saut par setjmp, même s'ils n'ont pas été surchargés par la fonction. Je ne suis pas vraiment un expert pour cela, mais je pense qu'il est évident que cela ne sera pas efficace. De plus, chaque fois que vous démarrez un bloc try, setjmp doit être appelé pour configurer la mémoire tampon contenant les registres sauvegardés. Lors de l’utilisation de dwarf2, le compilateur fournit déjà toutes les informations nécessaires au moment de la compilation.

Si les moteurs ne fournissent pas les informations nécessaires, GCC aura automatiquement recours à la gestion des exceptions basée sur setjmp / longjmp.

Notez que je ne suis pas un expert de GCC. Je viens de porter la chaîne d’outils sur un processeur simple de mon professeur, y compris GCC. J'espère pouvoir vous aider un peu.

Autres conseils

Évitez les sjlj. Chaque " essayer " bloc appellera setjmp qui enregistre les registres, un coup dur pour la performance même sans exception sont portées. Utilisation de tables, le flux de contrôle normal n'engendre aucun coût d'exécution. Seulement quand une exception est levée le mécanisme de traitement des exceptions doit-il ramper à travers les tableaux pour savoir quoi faire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top