【问题标题】:Porting compiler from x86 Assembly to LLVM将编译器从 x86 程序集移植到 LLVM
【发布时间】:2012-05-09 11:13:46
【问题描述】:

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

【问题讨论】:

  • 不会有一对一的映射。这里没有捷径。
  • 我意识到这一点,我只是在寻找有关如何发出基本内容的指南,例如保留数据、cmp 和条件跳转等。
  • LLVM 文档。有一个(至少一个)教程,指导您为玩具语言创建编译器。
  • 我看到了,但它已经过时了,而且大部分示例代码都不起作用。
  • 这个项目可以在某个地方查看吗?会很有趣...

标签: c++ assembly compiler-construction x86 llvm


【解决方案1】:

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

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

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

了解 LLVM IR 的另一个很好的入门资源是 online demo page。它允许您在线将 C 代码块编译为 LLVM IR(无需安装任何东西),并且对于理解如何在 LLVM IR 中表示基本编程结构非常有帮助。

【讨论】:

  • 谢谢!我从未见过那个演示页面,这正是我想要的。
  • @chameco:演示页面真的很有用,我个人经常用它来检查 Clang 可以执行(或不执行)什么样的优化。确实有助于让人们看到光明并避免他们的代码过于底层。
  • 我有一个稍微修改过的页面版本,让您也可以查看其他 LLVM 目标的汇编语言:ellcc.org/demo
猜你喜欢
  • 1970-01-01
  • 2015-05-18
  • 2011-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多