0

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

我认为需要这样的东西:

  • 删除定义的类型
  • 删除定义的全局变量
  • 我还缺少什么吗?

有什么想法吗?在构建阶段失败后彻底恢复模块更改需要做什么的一般准则是什么?

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

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

谢谢!

4

1 回答 1

1

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

于 2012-02-03T14:30:07.660 回答