一般而言,在编写 llvm 前端时,将采用 AST 并首先检查其语义是否定义明确。在此之后,将采用 AST 并执行 IR 构建阶段。我想知道,直接在 AST 上执行 IR 构建阶段有多现实,如果在构建过程中发现错误,恢复对模块对象的任何部分更改?
我认为需要这样的东西:
- 删除定义的类型
- 删除定义的全局变量
- 我还缺少什么吗?
有什么想法吗?在构建阶段失败后彻底恢复模块更改需要做什么的一般准则是什么?
现在,这是从乐观编译的角度来考虑的,如果出现问题,则优雅地失败。在当前的 LLVM 模型下,这很可能是完全不可能或不鼓励的。在这方面一个明确且有据可查的答案也是完全可以接受的
编辑最后,我只想要一种合理的方式来增量添加功能,但可以优雅地恢复到模块的先前状态和/或LLVMContext
如果功能构建失败。无论是哪种首选方法都将完全令人满意。
谢谢!