GCC支持Setjump-跳远踏板(sjlj)和Dwarf2的基于表的退绕(DW2)异常处理模型。什么是选择合适的模型两个模型,以及如何区别?为什么Dwarf2的表为基础的平仓(DW2)更有效的模型?据我所知,两个模型不能被混合。

参考:技术预览:GCC-4.2.1-sjlj -2

有帮助吗?

解决方案

那么,DWARF2积聚为每个函数表,包含什么被叫方保存的寄存器是与其中它们被保存在堆栈,并且其中在调用堆栈帧指针/返回地址,以及其他一些东西。如果使用DWARF2,编译器可以使用这些信息,并有效地恢复寄存器,并跳转回呼叫者在例外的情况下。的后端需要在它们的实现序言生成代码提供信息,告诉GCC哪些寄存器调用方保存,并且当帧指针被保存并且这样的东西。

使用的setjmp / longjmp的仅仅是一个黑客攻击。由于的setjmp / longjmp的不知道该函数投掷的结构,将恢复保存在由setjmp跳缓冲所有的寄存器,即使他们没有被投掷功能覆盖。我真的不用于这方面的专家,但我认为这是明显的,这将不会是有效的。此外,每次启动一个try块,那么setjmp必须调用来设置缓冲含有保存的寄存器,采用DWARF2时同时,编译器已经提供了在编译时的所有必要信息。

如果该后端不提供必要的信息,GCC将自动回退对setjmp基于/ longjmp异常处理。

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

其他提示

避免sjlj。每一个“尝试”块将调用setjmp的这 保存寄存器,一个性能命中,即使没有异常 上调。使用表格,控制的正常流动 招致没有执行成本。只有当产生一个异常 没有异常处理机制只得低声下气 通过表找出该怎么办。

scroll top