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

给定一个LLVM IR,我们可以生成Clang AST吗?,clang,llvm,abstract-syntax-tree,llvm-ir,Clang,Llvm,Abstract Syntax Tree,Llvm Ir,这个问题纯粹是从研究的角度来看的,而现在我并没有考虑它的任何实际方面 就像我们有反编译器,它可以接收二进制代码并生成LLVM IR,比如 或 还有很多其他的。 我们是否有一些代码生成器可以将LLVM IR转换为Clang AST 先谢谢你 找到一个已删除的项目- 正在寻找更多信息。从AST到LLVM IR是一条单行道 看看这张照片。 高级编程语言的源代码文件(可能是C、C++或RIST)转换为CLANAST。这是一种数据结构,它了解编程语言本身的源代码结构。AST是特定于编程语言的。它是对

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

就像我们有反编译器,它可以接收二进制代码并生成LLVM IR,比如 或 还有很多其他的。 我们是否有一些代码生成器可以将LLVM IR转换为Clang AST

先谢谢你


找到一个已删除的项目-


正在寻找更多信息。

从AST到LLVM IR是一条单行道

看看这张照片。

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

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

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

有多个前端模块,每个模块对应于要转换为LLVM IR的高级语言。一旦转换完成,生成的LLVM IR就无法知道它来自于什么编程语言。您可以采用C++代码和以生锈编写的相同代码,在生成LLVM IR之后,您将无法区分它们。 一旦生成了LLVM IR,任何高级语言特定的信息都将消失。这包括有关如何生成AST的信息,因为AST需要有关特定于该编程语言的编码结构的知识

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

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


这就是为什么原则上您不能从LLVM IR进入AST。如果有人真的想做这样的事情,那么它就不会是与原始高级语言源代码完全相同的表示形式,也不会具有很高的可读性。

这将是一种LLVM反向工程