博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LLVM 初探<一>
阅读量:4622 次
发布时间:2019-06-09

本文共 2916 字,大约阅读时间需要 9 分钟。

一、安装LLVM

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

 

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

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

  

  下载地址:

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

1 [zzb@centos ~]$ g++ --version2 g++ (GCC) 4.4.7 20120313 (Red Hat 4.4.7-4)

  1、下载版本

clang-3.0.tar.gzllvm-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 
using namespace std;int main(int argc, char *argv[]){ cout << "Hello, World." << endl; return 0;}

2、编译程序

clang++ hello.cpp -o hello

3、运行

[zzb@centos 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*) nounwinddefine 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:

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

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

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

转载于:https://www.cnblogs.com/zhuangzebo/p/4060464.html

你可能感兴趣的文章
P3385 【模板】负环
查看>>
URI、URL 和 URN的区别
查看>>
根据表达式序列(前缀、中缀、后缀)构建表达式树
查看>>
mysql性能优化
查看>>
【SqlServer系列】语法定义符号解析
查看>>
Color Length UVA - 1625
查看>>
TLS/SSL
查看>>
zoj2319Beautiful People Dp
查看>>
图片加载 背景色块问题
查看>>
Static Binding (Early Binding) vs Dynamic Binding (Late Binding)
查看>>
搭建git服务器
查看>>
iOS之UIDynamic UI动力学使用步骤
查看>>
poj 2498 动态规划
查看>>
Windows Phone 7中使用PhoneApplicationService类保存应用程序状态
查看>>
MySql数据库的下载和安装卸载
查看>>
JDBC接口核心的API
查看>>
双缓冲技术局部更新原理之派生自View
查看>>
PPAPI插件与浏览器的通信
查看>>
用 query 方法 获得xml 节点的值
查看>>
Hello,Android
查看>>