Pregunta

GCC admite los modelos de manejo de excepciones de desenrollado basado en tablas (dw2) Setjump-longjump (sjlj) y Dwarf2. ¿Cuál es la diferencia entre los dos modelos y cómo elegir el modelo apropiado? ¿Por qué el desenrollado basado en tablas Dwarf2 (dw2) es el modelo más eficiente? Entiendo que los dos modelos no se pueden mezclar.

Referencia: Vista previa de tecnología: gcc-4.2.1-sjlj -2

¿Fue útil?

Solución

Bueno, dwarf2 construye tablas para cada función, que contienen lo que son los registros guardados de la persona que llama y en qué parte de la pila se guardan, y dónde está el puntero del marco / dirección de retorno en la pila de llamadas, y algunas otras cosas. Si usa dwarf2, el compilador puede usar esa información y restaurar efectivamente los registros, y volver a los llamadores en caso de una excepción. Los backends deben proporcionar información en el código de generación de prólogo de sus implementaciones, para decirle a GCC qué registros se guardan en la llamada, y cuándo se guardó el puntero de trama y esas cosas.

Usar setjmp / longjmp es solo un truco. Dado que setjmp / longjmp no conoce la estructura de la función de lanzamiento, restaurará todos los registros guardados en el búfer de salto por setjmp, incluso si no fueron anulados por la función de lanzamiento. Realmente no soy un experto en esto, pero creo que es obvio que esto no será eficiente. Además, cada vez que inicia 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 el momento de la compilación.

Si los backends no proporcionan la información necesaria, GCC recurrirá automáticamente al manejo de excepciones basado en setjmp / longjmp.

Tenga en cuenta que no soy un experto en CCG. Acabo de portar la cadena de herramientas a un procesador fácil de mi profesor, incluido GCC. Espero poder ayudarte un poco.

Otros consejos

Evita sjlj. Cada " intente " bloque llamará setjmp que guarda registros, un éxito en el rendimiento incluso cuando no hay excepciones están alzadas. Usando tablas, el flujo normal de control no incurre en costos de ejecución. Solo cuando se plantea una excepción el mecanismo de manejo de excepciones tiene que arrastrarse a través de las tablas para descubrir qué hacer.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top