22

LLVM 非常模块化,允许您相当轻松地定义新的后端。然而,大多数关于创建 LLVM 后端的文档/教程都侧重于添加新的处理器指令集和寄存器。我想知道为 LLVM 创建 VHDL 后端需要什么?是否有使用 LLVM 从一种高级语言转换到另一种语言的示例?

澄清一下:是否有将 LLVM IR 翻译成高级语言而不是汇编语言的例子?例如:您可以使用 Clang 读入 C 语言,使用 LLVM 进行一些优化,然后用另一种语言(如 Java 或 Fortran)编写代码。

4

7 回答 7

19

是的 !

有许多针对 VHDL/Verilog 的 LLVM 后端:

我知道还有很多其他人......

像 LLVM 或 GIMPLE(顺便说一下也称为 RTL)这样的低级表示的有趣之处在于它们公开了静态单一分配 (SSA) 形式:这可以非常直接地转换为硬件,因为 SSA 可以被视为多路复用器树...

于 2011-02-01T14:02:18.650 回答
3

LLVM IR 并没有什么特别之处。这是一个具有可变参数的标准 DAG。反编译 LLVM IR 很像反编译机器语言。

您也许可以利用一些前端优化,例如常量折叠,但与整个任务相比,这听起来微不足道。

我对 LLVM 的唯一经验是为一个类项目编写二进制翻译器,从玩具 CISC 到自定义 RISC。

我想说,因为它是最接近标准 IR 的东西(好吧,GCC GIMPLE紧随其后),看看它是否适合您的算法和风格,并将其作为一种替代方案进行评估。

请注意,GCC 也开始优先考虑可移植性,并且也取得了很多成就。

于 2010-09-09T00:27:03.790 回答
1

我不确定我是否遵循您问题的各个部分如何相互关联。

将 LLVM 定位为像 C 这样的高级语言是非常有可能的,而且您似乎已经找到了一个参考点。

然而,VHDL 完全是另一回事。您认为 VHDL 是一种高级语言吗?它可能是,但描述了硬件/逻辑。当然,VHDL 有一些结构,您可以使用这些结构在其中进行实际编程,但这并不是一项富有成效的努力。VHDL 描述了硬件,因此将 LLVM IR 翻译成它是一个非常困难的问题,当然,除非您使用 VHDL 中的自定义指令集设计 CPU 并将 LLVM IR 翻译成您的指令。

于 2010-09-17T17:00:47.217 回答
1

这个线程是我在寻找同样的东西时发现的第一件事。

我发现了一个相当远的项目,它可以在 llvm 3.5 下/使用 llvm 3.5 干净地构建。真是太酷了。它吐出 HDL 并做各种其他很酷的 FPGA 相关的事情。虽然它被设计为与 TTA 一起工作并为 FPGA 生成图像(或模拟它们),但它也可能被用来从 c 函数生成一些简单的 HDL。

它非常适合我的目的,因为我想上传到 Altera FPGA,而且 fpga_stdout 示例甚至会输出 Quartus 构建脚本和项目文件。

基于 TTA 的协同设计环境

我还尝试了接受的答案中列出的东西和其他一些东西,发现它们不会为我工作或质量不是很高(通常两者都是)。TCE 是专业的感觉,但我相信纯粹是学术性的。一路上都非常好。

于 2014-11-27T16:55:54.190 回答
1

似乎这个问题得到了部分回答,所以我想试一试:

  • 为 LLVM 创建 VHDL 后端需要什么?

  • 将 LLVM IR 翻译成更高级的语言需要什么(大概是为了在高级语言之间进行转换)?

我会给你一些关于 2 的背景知识。稍后会在 1 上进行扩展。

如果要将 LLVM IR 转换为高级语言,例如 C 或 Java:

您必须采用 LLVM 指令,并将其抽象为等效的 C 代码。然后,您需要获取 LLVM 没有等效的剩余特性(如 C++ 的类和抽象)并编写一个例程,在 LLVM 中找到这些模式(如重用块)并编写 C。对于基本的东西,它非常简单。但是,只要顺着思路,你很快就会发现问题的真正难度,毕竟不是每个人都写简单的 C。更复杂的是,在编译生成的 C 时,你可能不会得到相同的 LLVM IR!(考虑产生的反馈循环)

至于 Java,您将面临直接从 LLVM IR 进行的更艰巨的战斗,并且无论哪种情况,您都可能无法将相同的代码编译到 LLVM IR,即使可以做到这一点。相反,您会将 LLVM IR 转换为 JVM 字节码。然后你可以使用反向编译器来获取你的 Java。

一群中国学生显然能够做到这一点,但他们想知道为什么对他们的研究兴趣如此之小。我想说的是,他们并不完全理解 LLVM 人所做的事情,以及它比 JVM 更好的地方。(事实上​​,LLVM 可以说让 JVM 过时了;)

尽管这看起来很有用,因为可以使用 LLVM 作为 C 和 Java 之间的中介来进行双向转换,但这种解决方案实际上用处不大,因为我们问错了问题。看,出于实际目的,您想要这样做的全部原因是拥有一个通用的代码库并提高性能。

但真正的问题是,我们需要一种抽象现代语言的共同特征的语言,并为您提供可以构建的中心语言。 http://julialang.org/已经回答了这个问题

于 2016-01-08T08:55:31.057 回答
-1

看起来最好的起点是 LLVM 源代码中的 CBackend:

llvm/lib/Target/CBackend/CBackend.cpp

于 2010-09-09T16:54:23.793 回答
-1

tl,dr:我不认为 LLVM 是正确的工具

您正在寻找的是将 LLVM 代码翻译成高级语言的方法,这就是emscripten为 Javascript 所做的。

但看起来你错过了 LLVM 的一点,因为它旨在生成静态代码,以实现他们为此目的使用特定的中间语言构建。

正如您所看到的,emscripten 的工作方式是实现一个堆栈,但不使用 javascript 作为人类会这样做。

它们是几个试图实现您最初的问题的项目,例如将 python 转换为 VHDL 或 Verilog 的MyHDL

于 2011-01-30T00:28:06.787 回答