Exception GCC的异常处理模型

Exception GCC的异常处理模型,exception,gcc,mingw,Exception,Gcc,Mingw,GCC支持Setjump longjump(sjlj)和Dwarf2基于表的退绕(dw2)异常处理模型。这两种模式的区别是什么?如何选择合适的模式?为什么Dwarf2基于表的退绕(dw2)是更有效的模型?我明白这两种模式不能混用 参考资料:嗯,dwarf2为每个函数建立表,其中包含被调用方保存的寄存器是什么,它们保存在堆栈中的什么位置,调用堆栈中的帧指针/返回地址在哪里,以及其他一些内容。如果使用dwarf2,编译器可以使用这些信息,有效地恢复寄存器,并在发生异常时跳回调用方。后端需要在其实现的

GCC支持Setjump longjump(sjlj)和Dwarf2基于表的退绕(dw2)异常处理模型。这两种模式的区别是什么?如何选择合适的模式?为什么Dwarf2基于表的退绕(dw2)是更有效的模型?我明白这两种模式不能混用


参考资料:

嗯,dwarf2为每个函数建立表,其中包含被调用方保存的寄存器是什么,它们保存在堆栈中的什么位置,调用堆栈中的帧指针/返回地址在哪里,以及其他一些内容。如果使用dwarf2,编译器可以使用这些信息,有效地恢复寄存器,并在发生异常时跳回调用方。后端需要在其实现的序言生成代码中提供信息,告诉GCC哪些寄存器被调用方保存,以及帧指针何时保存等等

使用setjmp/longjmp只是一种技巧。由于setjmp/longjmp不知道函数抛出的结构,因此它将恢复setjmp保存在跳转缓冲区中的所有寄存器,即使它们没有被抛出函数重写。我并不是这方面的专家,但我认为这显然是没有效率的。此外,每次启动try块时,都必须调用setjmp来设置包含已保存寄存器的缓冲区,而使用dwarf2时,编译器已经在编译时提供了所有必要的信息

如果后端没有提供必要的信息,GCC将自动退回到基于setjmp/longjmp的异常处理

注意,我不是GCC专家。我刚刚将工具链移植到我教授的一些简单处理器上,包括GCC。希望我能帮你一点忙。

避免sjlj。每个“try”块都将调用setjmp,其中 保存寄存器,即使没有异常也能提高性能 他们长大了。使用表格,控制的正常流程 不产生执行成本。仅当引发异常时 异常处理机制必须低声下气吗 请注意,存在一个高效的
setjmp
实现,它本身就是基于矮表的。因此,
setjmp
然后只需要存储stackpointer,并将剩余部分留给已经工作的dwarf放卷机。