一般来说,在编写llvm前端时,将使用AST并首先检查其语义是否定义良好。在此之后,将采用AST并执行IR构建阶段。 我想知道,直接将IR构建阶段执行到AST是多么现实,如果在构建过程中发现错误,还原对模块对象的任何部分更改?
我认为需要这样的东西:
有关于此的任何想法?在构建阶段失败后,为了彻底恢复模块更改需要做些什么的一般准则是什么?
现在,这是在乐观地编译方面的思考,并且优雅地失败,它会出错。在当前的LLVM模型下,这可能是完全不可能或不鼓励的。在这方面一个明确且有充分证据的答案也是完全可以接受的
编辑最后,我只想要一种合理的方式来逐步添加函数,但是如果函数构建失败,则优雅地恢复到模块的先前状态和/或LLVMContext
。无论什么样的首选方法都是完全令人满意的。
谢谢!
答案 0 :(得分:1)
许多编译器(不一定与LLVM相关)将语义分析与代码生成相结合,因此绝对可以完成。但是,我对你的“恢复对模块对象的任何部分更改”的引用感到困惑。当您开始构建IR模块并在AST中遇到语义错误时,您的计划是什么?你想吐一个不完整的模块吗?为什么?考虑任何常规编译器的工作方式,如果代码中存在语义错误(即引用未定义的变量),则不会创建输出。你想要不同的东西吗?