LLVM 初探<一>

一、安装LLVM

  LLVM是一个低级虚拟机,全称为Low Level Virtual Machine.LLVM也是一个新型的编译器框架,相关的介绍Wikipedia

  现在LLVM的版本已经有很多,根据编译器需要选择下载的版下。

  GCC/G++版本 >= 4.7,可以选择3.0以上版本,因为C++的新特性。

  

  下载地址:http://llvm.org/releases/

  本人用的系统是Centos,GCC/G++编译器版本为

1 [[email protected] ~]$ g++ --version
2 g++ (GCC) 4.4.7 20120313 (Red Hat 4.4.7-4)

  1、下载版本

clang-3.0.tar.gz
llvm-3.0.tar.gz

  2、解压

1 tar xvf clang-3.0.tar.gz
2 tar xvf llvm-3.0.tar.gz

  3、编译安装

cp clang-3.0.src llvm-3.0.src/tools/clang
./configure CC=gcc CXX=g++
make && make install

如果已经安装过,那么需要指明CC=gcc,CXX=g++,这个有其它的方式指明。否则会安装失败。

二、试用clang/clang++

1、编写hello.cpp

#include <iostream>
using namespace std;

int main(int argc, char *argv[])
{
    cout << "Hello, World." << endl;
    return 0;
}

2、编译程序

clang++ hello.cpp -o hello

3、运行

[[email protected] Hello]$ ./hello
Hello, World.

Look,与C++同样的编译功能。

4、生成IR

clang++ hello.cpp -S -emit-llvm
; ModuleID = ‘hello.cpp‘
target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32-S128"
target triple = "i386-pc-linux-gnu"

declare void @_ZNSt8ios_base4InitC1Ev(%"class.std::ios_base::Init"*)

declare void @_ZNSt8ios_base4InitD1Ev(%"class.std::ios_base::Init"*)

declare i32 @__cxa_atexit(void (i8*)*, i8*, i8*) nounwind

define i32 @main(i32 %argc, i8** %argv) {
  %1 = alloca i32, align 4
  %2 = alloca i32, align 4
  %3 = alloca i8**, align 4
  store i32 0, i32* %1
  store i32 %argc, i32* %2, align 4
  store i8** %argv, i8*** %3, align 4
  %4 = call %"class.std::basic_ostream"* @_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(%"class.std::basic_ostream"* @_ZSt4cout, i8* getelementptr inbounds ([14 x i8]* @.str, i32 0, i32 0))
  %5 = call %"class.std::basic_ostream"* @_ZNSolsEPFRSoS_E(%"class.std::basic_ostream"* %4, %"class.std::basic_ostream"* (%"class.std::basic_ostream"*)* @_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_)
  ret i32 0
}

declare %"class.std::basic_ostream"* @_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(%"class.std::basic_ostream"*, i8*)

declare %"class.std::basic_ostream"* @_ZNSolsEPFRSoS_E(%"class.std::basic_ostream"*, %"class.std::basic_ostream"* (%"class.std::basic_ostream"*)*)

declare %"class.std::basic_ostream"* @_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_(%"class.std::basic_ostream"*)

define internal void @_GLOBAL__I_a() {
  call void @__cxx_global_var_init()
  ret void
}

生成的hello.s文件,去掉某代IR代码。这就是LLVM的中间表达式代码。可读性比GCC/G++的中间表达式代码好!

 

5、相关llvm命令

llvm-ar          llvm-config      llvm-dis         llvm-ld          llvm-nm          llvm-ranlib      llvm-stub
llvm-as          llvm-cov         llvm-dwarfdump   llvm-link        llvm-objdump     llvm-rtdyld      llvm-tblgen
llvm-bcanalyzer  llvm-diff        llvm-extract     llvm-mc          llvm-prof        llvm-size    

document:http://llvm.org/docs/CommandGuide/

llvm-as:将汇编语言(这里指llvm中间语言)转化字节码

llvm-dis:与llvm-as相反,是将字节码转化为汇编语言

llvm-config:将有关llvm的链接库打印出来,提供给需要库的程序

时间: 2024-10-13 16:49:37

LLVM 初探<一>的相关文章

llvm 初探

gcc/g++ 如此成熟,本来以为可能下个20年我们还是用它,但最近看 llvm 似乎大有取代gcc 和 g++ 的架势 1)Apple 编程已经把 llvm 提供developer 使用 2)  开源 3D 架构,Mesa3D 可以使用 llvm 引擎 (当没有 GPU时, Mesa 解释 glsl并执行,速度慢,如果使用 LLVM JIT, 速度大大提升) 3)某些云平台,引入 llvm 提高速度 后端: llvm 可以运行是  llvm 定义的 中间代码, 这个中间代码 可以 编译为  x

apple swift 初探

今天凌晨,苹果举办了wwdc14,自然又成了各大网站的头条.尽管使用作为mac os的用户已经有接近10年时间,但是对苹果的开发平台却一直没什么了解,一方面是因为并不认可苹果的用户哲学,另一方面由于长期从事c++开发,对objective-c的语法也什么好感,甚至觉得怪异(个人感觉). 下午浏览新闻的时候,却发现wwdc14没有发布硬件产品,却有一门新的开发语言swift发布,按照苹果的说法是"innovative new programming language",不禁对这门语言产生

进阶之初探nodeJS

一.前言 在"初探nodeJS"随笔中,我们对于node有了一个大致地了解,并在最后也通过一个示例,了解了如何快速地开启一个简单的服务器. 今儿,再次看了该篇随笔,发现该随笔理论知识稍多,适合初级入门node,固萌生一个想法--想在该篇随笔中,通过一步步编写一个稍大一点的node示例,让我们在整体上更加全面地了解node. so,该篇随笔是建立在"初探nodeJS"之上的,固取名为"进阶之初探nodeJS". 好了,侃了这多,那么我们即将实现一个

从273二手车的M站点初探js模块化编程

前言 这几天在看273M站点时被他们的页面交互方式所吸引,他们的首页是采用三次加载+分页的方式.也就说分为大分页和小分页两种交互.大分页就是通过分页按钮来操作,小分页是通过下拉(向下滑动)时异步加载数据. 273这个M站点是产品推荐我看的.第一眼看这个产品时我就再想他们这个三次加载和翻页按钮的方式,那么小分页的pageIndex是怎么计算的.所以就顺便看了下源码. 提到看源码时用到了Chrome浏览器的格式化工具(还是朋友推荐我的,不过这个格式化按钮的确不明显,不会的话自行百度). 三次加载和分

[转载]HDFS初探之旅

转载自 http://www.cnblogs.com/xia520pi/archive/2012/05/28/2520813.html , 感谢虾皮工作室这一系列精彩的文章. Hadoop集群(第8期)_HDFS初探之旅 1.HDFS简介 HDFS(Hadoop Distributed File System)是Hadoop项目的核心子项目,是分布式计算中数据存储管理的基础,是基于流数据模式访问和处理超大文件的需求而开发的,可以运行于廉价的商用服务器上.它所具有的高容错.高可靠性.高可扩展性.高

MongoDB初探系列之二:认识MongoDB提供的一些常用工具

在初探一中,我们已经可以顺利的将MongoDB在我们自己的机器上跑起来了.但是在其bin目录下面还有一些我们不熟知的工具.接下来,将介绍一下各个小工具的用途以及初探一中MongoDB在data文件夹下创建的文件的用途. 1.bin目录下面的各种小工具简介及使用方式 bsondump.exe 用于将导出的BSON文件格式转换为JSON格式mongo.exe mongoDB的客户端 mongod.exe 用于启动mongoDB的Server mongodump.exe 用于从mongodb数据库中导

Asynchronous Pluggable Protocols 初探

Asynchronous Pluggable Protocols,异步可插入协议,允许开发者创建可插协议处理器,MIME过滤器,以及命名空间处理器工作在微软IE4.0浏览器以及更高版本或者URL moniker中.这涉及到Urlmon.dll动态链接库所公开(输出)的可插协议诸多功能,本文不进行深入的原理讲解,只对它其中之一的应用进行解析,那就是如何将一个应用程序注册为URL协议. 应用场景: tencent协议: 当我们打开"tencent://message/?uin=要链接的QQ号 &qu

重新认识HTML,CSS,Javascript 之node-webkit 初探

今天我们来系统的.全面的 了解一下前端的一些技术,将有助于我们写出 更优秀的 产品 出来. 什么是HTML? HTML 是用来描述网页的一种语言. HTML 包含一些根节点,子节点,文本节点,属性节点,组成, 它通过一系列预定义标签来描述网页结构,如: <title>This is title</title> ,这个表明该网页的标题是 This is title. 什么是CSS? CSS 指层叠样式表 (Cascading Style Sheets),它描述浏览器显示如何显示htm

从LLVM源码学C++(五)

知识点:static,const,static const 详解:转(http://blog.csdn.net/yjkwf/article/details/6067267) const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间. static表示的是静态的.类的静态成员函数.静态成员变量是和类相关的,而不是和类的具体对象相关的.即使没有具体对象,也能调用类的静态成员函数和成员变量.一般类的静态函数几乎就是一个全局函数,只不过它的作用域限