zoukankan      html  css  js  c++  java
  • 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 [zzb@centos ~]$ 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、运行

    [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*) 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的链接库打印出来,提供给需要库的程序

  • 相关阅读:
    【HDU1724】Ellipse-自适应Simpson积分法
    【HDU1724】Ellipse-自适应Simpson积分法
    【51Nod1227】平均最小公倍数-杜教筛
    【51Nod1227】平均最小公倍数-杜教筛
    【HDU5628】Clarke and math-狄利克雷卷积+快速幂
    【HDU5628】Clarke and math-狄利克雷卷积+快速幂
    deleted
    deleted
    deleted
    deleted
  • 原文地址:https://www.cnblogs.com/zhuangzebo/p/4060464.html
Copyright © 2011-2022 走看看