gpt4 book ai didi

webassembly - setjmp/longjmp 在 WebAssembly 中如何实现?

转载 作者:行者123 更新时间:2023-12-03 01:28:30 26 4
gpt4 key购买 nike

我刚刚开始研究 WebAssembly MVP,并注意到无法访问堆栈和堆栈指针,或者实际上没有任何结构化异常处理支持(抛出/捕获)等。

鉴于它应该是一个 C 编译目标,它肯定可以实现 setjmplongjmp,但我无法理解如何做到这一点很好。这个构造在废物中看起来怎么样?

最佳答案

WebAssembly MVP 不支持零成本异常处理。

C++ 异常处理和 setjmp/longjmp 当前通过 Emscripten 实现,方法是让每个 try 或“invoke”执行对 JavaScript 的调用WebAssembly 的 C++ 代码的延续。然后,一个 throw 会抛出一个 JavaScript 异常,该异常会展开堆栈并处理展开代码所在的“landingpad”(通常是析构函数调用和 catch block )。这意味着每个延续都会接收一个 bool 值:异常路径或常规路径。

这个太贵了!如果 LLVM 无法证明函数调用不会抛出异常,那么它的 IR 包含一个 invoke 指令,Emscripten 依靠它来插入异常处理代码。 C++ 中的默认设置是任何东西都可能抛出异常,因此如果您查看 LLVM IR,就会发现当您编译时出现异常时,到处都是invoke

零成本exception handling is being worked on at the moment ,所以这种情况最终应该会解决。这将用于实现setjmp/longjmp。这可以启用 setjmp/longjmp 的所有定义行为,即在不调用 C++ 析构函数的情况下展开堆栈。但是,它不允许向前跳转到已展开的堆栈(有时用于实现协程)的未定义行为情况。

关于webassembly - setjmp/longjmp 在 WebAssembly 中如何实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44263019/

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