LLVM每日谈之二 LLVM IR

作者:snsn1984

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

LLVM的三阶段设计是这样的:

这样做的优点是如果需要支持一种新的编程语言,那么我们只需要实现一种新的前端。如果我们需要支持一种新的硬件设备,那我们只需要实现一个新的后端。而优化阶段因为是针对了统一的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专门有一个文档,文档的地址为:

http://llvm.org/docs/LangRef.html

时间: 2024-10-26 06:08:27

LLVM每日谈之二 LLVM IR的相关文章

LLVM每日谈之十 LLVM Test简介

作者:snsn1984 就像很多优秀的软件都有自己的测试框架一样,LLVM也有自己的测试框架.LLVM的测试主要分为两 部分:regression tests 和 whole programs.其中,regression tests主要位于LLVM源码/test目录下,主要是 用来测试LLVM的一些特性或者是用来测试一些bug的.我们在平时的工作中,一般使用的就是这个类型的test. whole programs这个类型的测试,不在LLVM的源码中,在SVN库上有自己的单独目录,一般称之为tes

LLVM每日谈之二十一 一些关于编译器和LLVM/Clang的代码

作者:史宁宁(snsn1984) 自己收集了一些LLVM/Clang的代码,并且自己也在一点一点的写一些LLVM/Clang以及编译器的代码,在这里把这些代码库分享出来,欢迎大家交流探讨. 1.crange https://github.com/shining1984/crange 这是一个python写的调用libclang去定位和交叉检索C/C++源码的工具.这个工具不是我写的,我给fork过来了,方便自己加一些自己的代码. 2. libclang-examples https://gith

LLVM每日谈之二十二 llvm-config工具的使用

作者:史宁宁(snsn1984) llvm-config作为LLVM的一个工具,是非常有用的,官方文档(http://llvm.org/docs/CommandGuide/llvm-config.html)关于它的介绍如下: llvm-config makes it easier to build applications that use LLVM. It can print the compiler flags, linker flags and object libraries neede

LLVM每日谈之二十三 LLVM/Clang编译Linux内核资料

作者:史宁宁(snsn1984) 之前有朋友问到这个问题,是否有使用LLVM/Clang编译Linux内核的,随手找了一些相关资料,在这里贴出来,与大家共享. 网址:http://llvm.linuxfoundation.org 项目简介: LLVMLinux Project Overview This project aims to fully build the Linux kernel using Clang which is the C front end for the LLVM co

LLVM每日谈之二十四 Google的ClangMR

ClangMR的论文<Large-Scale Automated Refactoring Using ClangMR>:http://www.hyrumwright.org/papers/icsm2013.pdf ClangMR是Goolge的一个工具,严格的说,并不属于Clang家族,是属于基于Clang所构建的一个工具.Google秉承他们一贯的原则,在构建该工具并投入使用之后,将该工具的情况发了一篇论文<Large-Scale Automated Refactoring Using

LLVM每日谈之十七 LLVM/Clang的学习的思考

        之前一直关注LLVM和基于LLVM的工程(工具)多一些,对Clang和基于Clang的工具关注不是很多.这就导致了一个很严重的问题,觉的如果要深入理解Clang就必须要去读Clang的源码,这个想法不是不对,但是这不是唯一的路,而且Clang的源码太多,容易让人无法坚持下去,也容易让人无从下手.         了解了Clang的一些工具之后,觉的这些工具是一个很好的切入点,简单.方便使用.代码量不大,却可以完成很多以前觉的是很难实现的工作.这让我觉的找到了可以深入学习Clang

LLVM每日谈之四 Pass初探

作者:snsn1984 LLVM 的Pass框架是LLVM系统的一个很重要的部分.每个Pass都是做优化或者转变的工作,LLVM的优化和转换工作就是由很多个Pass来一起完成的. 所以按照我的理解,Pass就是LLVM系统转化和优化的工作的一个节点,每个节点做一些工作,这些工作加起来就构成了LLVM整个系统的优化和转化.Pass架构这么做的话,可重用性非常好,你可以选择已有的一些Pass,自己去构建出自己想要的优化和转化效果.并且自己也可以重新写Pass去做自己想要的优化和转变,因为每个Pass

LLVM每日谈之七 Clang

作者:snsn1984         官方介绍Clang是LLVM native的一个面向C/C++/Objective-C的编译器,目标是要提供一个编译非常快的编译器.他们宣称在Debug模式下编译Objective-C比GCC快3倍.至于是否能比GCC快这么多,总有人去做对比,大家可以搜索下,好像确实快了些. Clang一般被说是LLVM的一个前端.关于前端的定义,大家可以从LLVM每日谈之二里面看到前端在整个LLVM体系中的位置.Clang当初的定位就是要做下一个十年中一个伟大的前端,这

LLVM每日谈之十三 使用LLVM自带的PASS

作者:snsn1984 PS:最近一段时间,投入在LLVM上的时间有些减少.差点把对它的研究断掉,今天开始继续.对LLVM的研究需要很长一段时间的坚持不懈才可以彻底搞明白. 前面已经介绍过如何写自己的PASS,并且也针对一个简单的PASS进行了分析和介绍.相信大家也可以从LLVM源码中找到很多的PASS,这些PASS太多,他们每个到底是做什么用?如何去调用这些系统已经有的PASS?这就是这次每日谈要关注的问题. 在文档 http://llvm.org/docs/Passes.html 中,列出了