首页 > 解决方案 > 给定一个 LLVM IR,我们可以生成 Clang AST 吗?

问题描述

这个问题纯粹是从研究的角度来看的,现在我没有考虑它的任何实际方面。

就像我们有可以接收二进制代码并生成 LLVM IR 的反编译器一样,例如 https://github.com/repzret/daggerhttps://github.com/avast/retdec 等等。我们是否有一些代码生成器可以将 LLVM IR 转换为 Clang AST?

先感谢您。


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

寻找更多。

标签: clangllvmabstract-syntax-treellvm-ir

解决方案


从 AST 到 LLVM IR 是一条单行道。

看看这张照片。 LLVM 工具链

高级编程语言(可能是 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

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

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

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

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

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


推荐阅读