gpt4 book ai didi

GCC的异常处理模型

转载 作者:行者123 更新时间:2023-12-03 20:13:15 25 4
gpt4 key购买 nike

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

引用:Technology Preview: gcc-4.2.1-sjlj -2

最佳答案

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

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

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

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

关于GCC的异常处理模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/318383/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com