2008-11-25 26 views

Respuesta

16

Bueno, dwarf2 acumula tablas para cada función, que contienen lo que el destinatario de la llamada guarda registros son y dónde en la pila que se salvan, y en donde la dirección de puntero de marco/de retorno en la pila de llamadas es y algunas otras cosas Si usa dwarf2, el compilador puede usar esa información y restaurar de manera efectiva los registros, y recurrir a las personas que llaman en el caso de una excepción. Los backends necesitan proporcionar información en el código de generación de prólogos de sus implementaciones, para decirle a GCC qué registros están guardados en el destinatario, y cuándo se guardó el puntero del marco y cosas por el estilo.

Usar setjmp/longjmp es solo un truco. Como setjmp/longjmp no conoce la estructura de la función de arrojar, restaurará todos los registros guardados en el búfer por setjmp, incluso si no fueron anulados por la función de lanzamiento. No soy realmente un experto en esto, pero creo que es obvio que esto no será eficiente. Además, cada vez que inicie un bloque de prueba, se debe llamar a setjmp para configurar el búfer que contiene los registros guardados, mientras que cuando se usa dwarf2, el compilador ya proporciona toda la información necesaria en tiempo de compilación.

Si los back-end no proporcionan la información necesaria, GCC automáticamente retrocederá a la gestión de excepciones basada en setjmp/longjmp.

Nota: No soy un experto de GCC. Acabo de portar la cadena de herramientas a un procesador sencillo de mi profesor, incluido GCC. Espero poder ayudarte un poco.

+0

Observe que existe http://www.nongnu.org/libunwind/, que tiene una implementación eficiente de 'setjmp' que a su vez está basada en tablas enanas. Así que 'setjmp' solo necesita almacenar el stackpointer y dejar el resto al enwinder enano que ya está trabajando. –

10

Avoid sjlj. Cada bloque "try" llamará a setjmp, que guarda registros, un golpe de rendimiento incluso cuando no se generan excepciones . Usando tablas, el flujo normal de control no incurre en ningún costo de ejecución. Solo cuando se produce una excepción , el mecanismo de manejo de excepciones tiene que arrastrarse a través de las tablas para descubrir qué hacer.