问题 将编译器从x86 Assembly移植到LLVM


最近,为了磨练我的装配技巧,我在C ++中为玩具语言编写了一个非常简单的编译器。它运行单次传递,并在解析阶段直接将代码发送到几个字符串流,每个字符串流代表一段代码(即一个代表section .bss,而其他人代表 .data 和 .text)。然后,这些字符串流被写入文件,我使用NASM和gcc来汇编和链接它们。我知道这种单遍方法非常低效,但同样,这更像是一种理解代码生成阶段的练习。无论如何,我想修改我的代码直接发出LLVM IL而不是原始程序集,再次作为学习练习。是否有LLVM IL的入门级指南?或者,更好的是,确定一行装配的等效IL代码的工具?我看了,我只找到了完整的规格,这比我需要的更多信息。


4197
2018-04-29 12:19


起源

不会有一对一的映射。这里没有捷径。 - David Heffernan
我意识到这一点,我只是在寻找关于如何发出基本事物的指南,比如保留数据,cmp和条件跳跃等。 - Samuel Breese
LLVM文档。有一个(至少一个)教程,指导您为玩具语言创建编译器。 - Mat
我看到了,但它非常过时,大多数示例代码都不起作用。 - Samuel Breese
这个项目可以在某处查看吗?会很有趣...... - Peter Slotko


答案:


LLVM IR语言参考是 在这里。请注意,这是一个详细的参考页面,而不是教程。 x86汇编和LLVM IR之间没有直接的一对一对应关系,尽管由于LLVM IR比x86汇编更高级且更通用,因此编译器从发出x86到发出LLVM IR应该不会太困难。

官方LLVM文档附带一个 详细教程 这绝对是最适合您的起点 - 它从简单的高级编程语言到LLVM IR创建玩具编译器。通过它,您将学习LLVM的许多关键概念,然后将能够有效地使用上述语言参考。

如果您发现本教程有任何问题,请将它们报告给LLVM错误跟踪器或邮件列表。预计该教程将起作用,任何报告的问题都将得到修复。

理解LLVM IR的另一个好的开始资源是 在线演示页面。它允许您在线编译C代码块到LLVM IR(无需安装任何东西),并且应该非常有助于理解如何在LLVM IR中表示基本编程结构。


14
2018-04-29 12:53



谢谢!我从未见过那个演示页面,这正是我想要的。 - Samuel Breese
@chameco:演示页面非常有用,我经常用它来检查Clang可以执行哪种优化(或不执行)。真正有助于让人们看到光线,避免让他们的代码过低。 - Matthieu M.
我有一个稍微修改过的页面版本,让你看看其他LLVM目标的汇编语言: ellcc.org/demo - Richard Pennington