llvm:是否可以在一个阶段中合并验证和编译



一般来说,在编写llvm前端时,会使用AST,并首先检查其语义是否定义良好。在此之后,将进行AST并执行IR构建阶段。我想知道,直接在AST上执行IR构建阶段有多现实,如果在构建过程中发现错误,恢复对模块对象的任何部分更改?

我想需要这样的东西:

  • 删除已定义的类型
  • 删除已定义的全局参数
  • 我还缺什么吗

对此有什么想法吗?在失败的构建阶段之后,需要做些什么来干净地恢复模块更改,一般的指导方针是什么?

现在,这是从乐观地编译的角度来思考的,如果出现问题,就会优雅地失败。在当前的LLVM模型下,这很可能是完全不可能或不鼓励的。在这方面,一个明确且有充分证明的答案也是完全可以接受的

编辑最后,我只想要一种合理的方式来增量添加函数,但如果函数构建失败,则可以优雅地恢复到模块和/或LLVMContext的先前状态。无论哪种方法是可取的,都将是完全令人满意的。

谢谢!

许多编译器(不一定与LLVM相关)将语义分析与代码生成混合在一起,因此它肯定可以完成。然而,我对您提到的"恢复对模块对象的任何部分更改"感到困惑。当您开始构建IR模块,并在AST中遇到语义错误时,您的计划是什么?是否要吐出不完整的模块?为什么?考虑到任何常规编译器的工作方式,如果代码中存在语义错误(即引用未定义的变量),则不会创建输出。你想要点不同的吗?

相关内容

最新更新