一般来说,在编写llvm前端时,会使用AST,并首先检查其语义是否定义良好。在此之后,将进行AST并执行IR构建阶段。我想知道,直接在AST上执行IR构建阶段有多现实,如果在构建过程中发现错误,恢复对模块对象的任何部分更改?
我想需要这样的东西:
- 删除已定义的类型
- 删除已定义的全局参数
- 我还缺什么吗
对此有什么想法吗?在失败的构建阶段之后,需要做些什么来干净地恢复模块更改,一般的指导方针是什么?
现在,这是从乐观地编译的角度来思考的,如果出现问题,就会优雅地失败。在当前的LLVM模型下,这很可能是完全不可能或不鼓励的。在这方面,一个明确且有充分证明的答案也是完全可以接受的
编辑最后,我只想要一种合理的方式来增量添加函数,但如果函数构建失败,则可以优雅地恢复到模块和/或LLVMContext
的先前状态。无论哪种方法是可取的,都将是完全令人满意的。
谢谢!
许多编译器(不一定与LLVM相关)将语义分析与代码生成混合在一起,因此它肯定可以完成。然而,我对您提到的"恢复对模块对象的任何部分更改"感到困惑。当您开始构建IR模块,并在AST中遇到语义错误时,您的计划是什么?是否要吐出不完整的模块?为什么?考虑到任何常规编译器的工作方式,如果代码中存在语义错误(即引用未定义的变量),则不会创建输出。你想要点不同的吗?