给定一个 LLVM IR,我们可以生成 Clang AST 吗?

Given an LLVM IR, can we generate Clang AST?

这个问题纯粹是从研究的角度提出的,目前我还没有考虑它的任何实际方面。

就像我们有可以接受二进制代码并生成 LLVM IR 的反编译器,比如 https://github.com/repzret/dagger or https://github.com/avast/retdec 和许多其他。 我们有一些代码生成器可以将 LLVM IR 转换为 Clang AST 吗?

提前谢谢你。


找到一个掉落的项目 - https://www.phoronix.com/scan.php?page=news_item&px=MTE2OTg

寻找更多。

从 AST 到 LLVM IR 是单行道。

看看这张照片。

高级编程语言(可能是 C、C++ 或 Rust)的源代码文件被转换为 Clang AST。这是一种数据结构,它了解编程语言本身的源代码结构。 AST 特定于一种编程语言。它是对编程语言解析后的源代码文件的描述,就像Javascript DOM树是对HTML文档的描述一样。这意味着 AST 包含特定于该编程语言的信息。如果编程语言是 Rust,那么 Rust AST 可能包含函数式编码结构。

然而,LLVM IR 有时被描述为一种可移植的高级汇编语言,因为它具有可以紧密映射到系统硬件的结构。

前端模块将高级编程语言转换为 LLVM IR。它通过生成特定于语言的 AST,然后递归遍历该 AST 并生成代表 AST 中每个节点的 LLVM 代码结构来实现这一点。然后我们有 LLVM IR 代码。然后后端模块将 LLVM IR 转换为架构特定的汇编代码。

有多个前端模块,一个用于您要转换为 LLVM IR 的每种高级语言。一旦转换完成,生成的 LLVM IR 就无法知道它来自哪种编程语言。你可以使用 C++ 代码和用 Rust 编写的相同代码,在生成 LLVM IR 之后你将无法区分它们。

一旦生成了 LLVM IR,任何高级语言特定信息都将消失。这包括有关如何生成 AST 的信息,因为 AST 需要有关特定于该编程语言的编码结构的知识。

从高级(更抽象的)源代码表示进入中级,例如 LLVM IR,甚至进入较低级别,例如汇编代码 相对容易.

反过来,从非常低级的机器特定代码到高级编程语言的更抽象的源代码要困难得多。这是因为在高级编程语言中你可以用多种不同的方式解决同一个问题,而汇编语言中的代码表示更为有限,所以你无法知道低级代码最初是由哪个特定的高级编码构造的.

这就是为什么原则上你不能从 LLVM IR 进入 AST。如果有人真的会尝试做这样的事情,它不会是原始高级语言源代码的完全相同的表示,而且可读性也不会很好。