鉴于LLVM IR,我们可以生成Clang AST吗?

问题描述 投票:0回答:1

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

就像我们有反编译器一样,它们可以接收二进制代码并生成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

正在寻找更多。

clang llvm abstract-syntax-tree llvm-ir
1个回答
0
投票

从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”

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.