有没有办法在LLVM中维护多个堆栈/指令指针?

时间:2015-10-15 19:18:21

标签: asynchronous llvm coroutine fiber

我一直在为LLVM编写玩具语言。我想要实现的最雄心勃勃的功能是光纤。我已经阅读了很多关于此事的内容,我认为我对它们传统上如何实施有一个模糊的概念。据我所知,光纤通常被建模为指令指针和堆栈。 (参见:Golang运行时)

是否有任何LLVM支持异步执行,具有不同的指令指针?多个堆栈?

我知道LLVM是一个注册机器,有没有办法确保所有相关数据都保存在堆栈中?和/或保存和恢复当前寄存器状态的方法?

手工实施这将是一个真正的害虫,所以任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:0)

对于玩具语言,一种快速解决方案是使用线程模拟纤维的行为。制作一堆线程,但要确保其中只有一个做任何事情。您可以通过告诉他们对连接到主线程的套接字进行阻塞调用来使其他线程放松。

显然,线程比纤维更贵。因此,这在性能方面并不理想。

如果你想要性能,不幸的是,据我所知,唯一的方法是明确地管理前端堆栈,所有这些都是你自己。例如,一种方法是

"继续"然后,对象履行指令指针的作用(尽管以一种非常不同的方式!),并且您的手动分配的内存履行堆栈数据的作用。可以找到更多详细信息here