Pergunta

GCC suporta setjump-longjump (sjlj) e modelos baseados em mesa desenrolando (DW2) manipulação de exceção Dwarf2. Qual é a diferença entre os dois modelos e como escolher o modelo apropriado? Por que é Dwarf2 tabela baseada-desenrolando (DW2) o modelo mais eficiente? Eu entendo que os dois modelos não podem ser misturados.

Referência: Technology Preview: gcc-4.2.1-sjlj -2

Foi útil?

Solução

Bem, dwarf2 acumula tabelas para cada função, que contêm quais são as callee registradores salvos e onde na pilha eles são salvos, e onde o endereço ponteiro do quadro / retorno na pilha de chamadas é, e algumas outras coisas. Se você usar dwarf2, o compilador pode usar essas informações e efetivamente restaurar registradores, e saltar de volta para os chamadores no caso de uma exceção. Os backends precisa fornecer informações em código de geração prólogo de suas implementações, para dizer GCC que registros são callee-salvos, e quando o ponteiro do quadro foi salvo e tais coisas.

Usando o setjmp / longjmp é apenas um hack. Desde setjmp / longjmp não sabe sobre a estrutura do arremesso função, ele irá restaurar todos os registros salvos no jump-tampão por setjmp, mesmo que eles não foram substituídos pela função de arremesso. Eu não sou realmente um especialista para isso, mas eu acho que é óbvio que isso não será eficiente. Além disso, cada vez que você iniciar um bloco try, setjmp tem que ser chamado para configurar o tampão contendo os registros salvos, enquanto que ao usar dwarf2, o compilador já fornece todas as informações necessárias em tempo de compilação.

Se os backends não fornecer as informações necessárias, GCC vai cair-volta para setjmp automaticamente / longjmp tratamento de exceção base.

Note que eu não sou um especialista em GCC. Eu só portado o conjunto de ferramentas para algum processador fácil de meu professor, incluindo GCC. Espero que eu possa ajudá-lo um pouco.

Outras dicas

Evite sjlj. Cada bloco "try" vai chamar setjmp que salva registros, um desempenho atingido mesmo quando não há exceções são levantadas. Usando tabelas, o fluxo normal de controle não incorre em custos de execução. Somente quando uma exceção é lançada O mecanismo para o tratamento a excepção ter de rastejar por entre as mesas para descobrir o que fazer.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top