将编译器从 x86 汇编移植到 LLVM
Porting compiler from x86 Assembly to LLVM
所以最近,为了磨练我的汇编技能,我用C++为一种玩具语言编写了一个非常简单的编译器。它运行单次传递,并在解析阶段直接向多个字符串流发出代码,每个字符串流代表代码的一部分(即一个表示section .bss
,而其他表示.data
和.text
(。之后,这些字符串流被写入一个文件,我使用 NASM 和 gcc 来组装和链接它们。我知道这种单通道方法效率极低,但同样,这更像是理解代码生成阶段的练习,而不是其他任何东西。无论如何,我想修改我的代码以直接发出LLVM IL而不是原始汇编,再次作为学习练习。是否有LLVM IL的入门级指南?或者,更好的是,使用一种工具来确定装配线的等效 IL 代码?我看了看,我只找到了完整的规格,这比我需要的信息要多得多。
此处提供了 LLVM IR 语言参考。请注意,这是一个详细的参考页面,而不是教程。x86 程序集和 LLVM IR 之间没有直接的一对一对应关系,但由于 LLVM IR 比 x86 程序集更高级别、更通用,因此将编译器从发出 x86 调整为发出 LLVM IR 应该不会太困难。
官方LLVM文档附带了一个详细的教程,这绝对是您的最佳起点 - 它介绍了从简单的高级编程语言到LLVM IR创建玩具编译器的过程。通过学习,您将学习LLVM的许多关键概念,然后能够有效地使用上述语言参考。
如果您在本教程中发现任何问题,请将其报告给LLVM错误跟踪器或邮件列表。本教程应正常运行,并且将修复任何报告的问题。
理解LLVM IR的另一个很好的入门资源是在线演示页面。它允许您在线将C代码块编译为LLVM IR(无需安装任何东西(,并且对于理解如何在LLVM IR中表示基本编程结构非常有帮助。
- 如何将 I->getType() 作为参数传递给 llvm 中的 CreateCall?
- 将尾部调用void(i32,..)位转换为llvm::函数以获取FnAttribute
- 是否可以将llvm::FunctionType转换为C/C++原始函数指针
- llvm构建器向基本块添加终止符
- 正在LLVM中检测整数比较条件
- 如何在LLVM中dyn_cast以识别StoreInst?
- 使用 cmake 的 LLVM 构建在 tsan_libdispatch_mac.cc 期间失败; "Error: conflicting types for ..."
- 如何使用 llvm-10 库在C++定义 LLVM 全局值变量?
- 为什么我的C++程序的程序集输出充满了 .ascii,没有汇编代码?
- 编译 llvm 3.1 时,为什么会出现错误:在">"标记之前预期主表达式
- 如何删除 LLVM 中的不规则分支?
- LLVM | codegen 用于带有命令行选项的程序输入功能
- 在 emscripten 网页汇编正在运行期间更新进度条?
- 为什么我们不编写可以处理C++标识符的汇编器和链接器?
- 编译 llvm 插件时出现问题:llvm/Config/llvm-config.h:没有这样的文件或目录
- 在什么情况下,我想在 C/C++ 代码中使用内联汇编代码
- 如何检查函数是否在LLVM Instrumentation pass的ModulePass的系统头文件中定义?
- 从macOS Catalina上的源代码编译LLVM(如何解决未找到"stdio.h")
- LLVM 选择找不到函数传递
- 将编译器从 x86 汇编移植到 LLVM