(转)LLVM IR 简介

本文深入探讨了LLVM的结构及三阶段设计的优势,解释了LLVMIR作为中间语言的关键作用,包括内存中、硬盘上及可读形式的三种表现,并指导如何通过实际操作直观获取IR的两种形式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作者:snsn1984

在介绍LLVM IR之前,我们需要先了解下LLVM的结构。传统的静态编译器分为三个阶段:前端、优化和后端。

[Three Major Components of a Three-Phase Compiler]
LLVM的三阶段设计是这样的:
[LLVM's Implementation of the Three-Phase Design]
这样做的优点是如果需要支持一种新的编程语言,那么我们只需要实现一种新的前端。如果我们需要支持一种新的硬件设备,那我们只需要实现一个新的后端。而优化阶段因为是针对了统一的LLVM IR,所以它是一个通用的阶段,不论是支持新的编程语言,还是支持新的硬件设备,这里都不需要对优化阶段做修改。所以从这里可以看出LLVM IR的作用。
LLVM IR主要有三种格式:一种是在内存中的编译中间语言;一种是硬盘上存储的二进制中间语言(以.bc结尾),最后一种是可读的中间格式(以.ll结尾)。这三种中间格式是完全相等的。
LLVM IR是LLVM优化和进行代码生成的关键。根据可读的IR,我们可以知道再最终生成目标代码之前,我们已经生成了什么样的代码。而且根据IR,我们可以选择使用不同的后端而生成不同的可执行代码。同时,因为使用了统一的IR,所以我们可以重用LLVM的优化功能,即使我们使用的是自己设计的编程语言。

如果想直观的看下llvm的IR到底是什么样的,可以先写一个helloworld的程序,文件名字叫做hello.c。

根据下列文档的步骤配置llvm:

http://clang.llvm.org/get_started.html

然后根据文档的内容使用下列命令可以得到二进制的.bc文件:

clang -emit-llvm -c hello.c -o hello.bc

然后使用下列命令可以得到对应的hello.ll文件,这个文件是可读的,可以通过文本编辑器打开。

llvm-dis hello.bc

这样我们就可以直观的得到IR的两种格式了,至于在内存中的那种格式,我们是无法通过文件的形式得到的。

我们一般都是查看.ll格式,因为这本身就是给人阅读的IR格式。


关于LLVM IR的介绍,LLVM专门有一个文档,文档的地址为:
05-13
### 关于 LLVM IR 的教程和文档 LLVM 提供了丰富的官方文档来帮助开发者理解和使用其内部机制,其中包括关于 LLVM 中间表示(IR)的部分。这些资源不仅涵盖了基础概念,还提供了深入的技术细节[^1]。 #### 官方文档 LLVM 官网提供了一套完整的文档集合,其中包含了针对 LLVM IR 的详细介绍。可以通过访问官网的 “Documentation” 部分找到相关内容。具体来说,“LangRef” 是一份非常重要的参考资料,它详尽描述了 LLVM IR 的语法结构及其语义[^1]。 #### 教程实例 除了理论性的文档外,《Kaleidoscope》系列教程是一个非常好的实践指南。该教程逐步引导读者实现一个名为“万花筒”的简单编程语言编译器,在此过程中展示了如何生成有效的 LLVM IR 并对其进行优化处理[^2]。此外还有中文翻译版本可供参考学习[^3]。 以下是创建基本加法操作并将其换成 LLVM IR 的 Python 示例代码: ```python import llvmlite.ir as llvm_ir # Define the module and function types. module = llvm_ir.Module() func_type = llvm_ir.FunctionType(llvm_ir.IntType(32), [llvm_ir.IntType(32), llvm_ir.IntType(32)]) # Create a function named 'add'. function = llvm_ir.Function(module, func_type, name="add") # Add arguments with names for readability. a, b = function.args a.name = "a" b.name = "b" # Build the body of the add function using an IRBuilder instance. block = function.append_basic_block(name="entry") builder = llvm_ir.IRBuilder(block) result = builder.add(a, b, name="sum") # Perform addition operation. # Return result from this block. builder.ret(result) print(str(module)) # Print generated LLVM IR code. ``` 这段脚本利用 `llvmlite` 库定义了一个接受两个整数参数返回它们之和的功能函数,并打印出了对应的 LLVM IR 表达形式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值