1. 程式人生 > >llvm之旅第一站 - 編譯及簡單使用

llvm之旅第一站 - 編譯及簡單使用

llvm介紹

llvm(low level virtual machine)是一個開源編譯器框架,最早的時候是Illinois的一個研究專案,主要負責人是Chris Lattner,他現在就職於Apple. Apple 目前也是llvm專案的主要贊助者之一。

llvm有一個表達形式很好的IR語言,高度模組化的結構,因此它可以作為多種語言的後端,提供與程式語言無關的優化和針對多種CPU的程式碼生成功能。

傳統編譯器分三個階段: 

1.png

llvm也分三個階段,但是設計上略微的有些區別:

2.png

不同的前端後端使用統一的 LLVM IR ,如果需要支援新的程式語言或者新的裝置平臺,只需要開發對應的前端和後端即可。同時基於 LLVM  IR 我們可以很快的開發自己的程式語言。

目前llvm有很多的子專案,針對不同的需求進行了深入的擴充套件,具體參考llvm官方首頁。

其中的Clang子專案實現了支援C/C++/Objective-C的優秀編譯器前端,官方資料表明,在某些編譯環境下,其編譯速度要比gcc快三倍。

llvm下載及編譯

後續的系列文章我們都將以Clang作為前端,Mac系統上進行開發。(Linux 及Window系統上的下載及編譯過程與此相同)

1. 遷出LLVM 

1 2 cd where-you-want-llvm-to-live $ svn co http://llvm.org/svn/llvm-project/llvm/trunk
 llvm

0.png

 2. 遷出Clang 

1 2 3 cd where-you-want-llvm-to-live cd llvm/tools $ svn co http://llvm.org/svn/llvm-project/cfe/trunk clang

3.png

 3. 遷出編譯執行庫 

1 2 3 cd where-you-want-llvm-to-live cd llvm/projects $ svn co http://llvm.org/svn/llvm-project/compiler-rt/trunk compiler-rt

4.png

 4.編譯原始碼 (Release)  

1 2 3 mkdir build cd build $ cmake -DCMAKE_BUILD_TYPE:String=Release ../llvm/

5.png

6.png

也可以:

1 2 3 cd llvm $ ./configure make

推薦使用cmake編譯。

build目錄下存放著編譯後的檔案: 

7.png

bin中存放著完整的工具鏈:

8.png

工具鏈使用 

編譯完成後,build/bin目錄下存放了完整的編譯工具鏈,使用這些工具就可以完成原始碼的編譯。

建立簡單的c語言原始碼檔案test.c

1 2 3 4 5 #include <stdio.h> int main() { printf("hello llvm\n"); return 0; }

編譯可執行檔案

./clang test.c -o test

生成LLVM 位元組碼檔案

./clang -O3 -emit-llvm test.c -c -o test.bc

生成LLVM  視覺化位元組碼檔案

./clang -O3 -emit-llvm test.c -S -o test.ll

執行可執行檔案

./test

執行位元組碼檔案

./lli test.bc

反彙編位元組碼檔案

./llvm-dis < test.bc | less

編譯位元組碼為彙編檔案

./llc test.bc -o test.s

參考文獻:


相關推薦

llvm第一 編譯簡單使用

llvm介紹 llvm(low level virtual machine)是一個開源編譯器框架,最早的時候是Illinois的一個研究專案,主要負責人是Chris Lattner,他現在就職於Apple. Apple 目前也是llvm專案的主要贊助者之一。 llvm

安卓第一--第一次Android Studio2.3搭建過程總結

關於Android Studio的安裝包可以從官方網站下載對應的版本,但是官方網站的安裝包是隨時更新的有可能會出現一些問題,所以可以去國內一些較好的網站下載映象檔案,比較穩定,這裡我給大家推薦一個網站http://www.androiddevtools.cn/index.ht

Linux第一篇-目錄結構操作目錄

一、引言 Linux對java開發來說也是一項必備的技能,因為專案基本都是部署在Linux作業系統的伺服器中,雖然專案不一定需要我們去部署,但不管是自己測試環境部署,還是一些生產環境中日誌的檢視,Linux作業系統都是免不了要去接觸的。對於我們開發來說懂得基礎的命令及簡單shell指令碼編寫是必須的。 跳

我的前端第一彈--SeaJs基礎和spm編譯工具運用[圖文]

1. 概述 本文章來源於本人在專案的實際應用中寫下的記錄。因初期在安裝和使用Seajs和SPM的時候,有點不知所措的經歷。為此,我們編寫本文件,通過圖文並茂的方式來為大家講解seajs和spm編譯環境的搭建和基本使用方法。 2. 認識SEAJS seajs是一種前端模組化

我的Android進階------&gt;Android編譯錯誤java.util.zip.ZipException: duplicate entry的解決方法

image bsp failed 進階 技術分享 san col get cep 今天在Android Studio中把另外一個項目引入當前項目,編譯的時候出現了java.util.zip.ZipException: duplicate entry錯誤。 錯誤例如以下

小程序——第二()

rgs nts 回車 chrome 所有 type [] this 1-1 一、sublime text 3 前提是得先安裝package control插件 1、通過"ctrl+shift+p"打開命令面板 2、輸入"install package"打開安裝插件面板

Android開發1:環境搭建HelloWorld

lan 及其 其它 ply 新項目 bsp 驗證 for 對話框 ——工欲善其事必先利其器 引言 本系列適合0基礎的人員,因為我就是從0開始的,此系列記錄我步入Android開發的一些經驗分享,望與君共勉!作為Android隊伍中的一個新人的

React學習----mock模擬假資料封裝axios,動態渲染表格

import React from 'react'; import { Card, Table, Modal, Button, message } from 'antd'; import axios from './../../axios/index' import Utils from './..

React學習----配置多頁面路由巢狀路由demo

const menuList = [ { title: '首頁', // key: '/home' key: '/admin/home' }, { title: 'UI', key: '/ui', children: [ {

程式設計路------第一

  大家好,我是杜先森。哈哈哈!現在是一名大三的學生,我現在最大的愛好就是擼程式碼,目前來看再無其他愛好。我的座右銘就是一擼到底! 首先談一下為什麼我愛上了程式設計,我是轉專業的,當初的專業不是怎麼適合我,我轉之前也沒有什麼喜歡的專業,好幾個同學在學計算機,所以就轉到計算機,一方面是他們可以幫幫我,另一方面

Web 探索 | 第一

             本文純屬個人閱讀後的筆記,如有不足之處,請多多指教 Client-Server 模型 我們去餐廳用餐,服務我們的服務生英語也是“Server”(或者也叫 waiter) 在資訊科技領域,這種模型就是最著名和使用最廣泛“客戶機-伺服器” (也有稱

敏捷開發系列 第二(走近XP極限程式設計)

     這是最重要的核心價值。因為XP強調要“擁抱變化”,因此對於使用者的反饋,提倡積極面對現實和修改問題的勇氣,如放棄已有程式碼,改進系統設計等;勇敢的重構;所有人擁有程式碼;敢於極限(把好的方法做到極致)。XP認為,軟體開發中,人是最重要的一個方面。在一個軟體產品的開發中,人的參與貫穿其整個生命週期,是

【我的Android進階】解決AndroidStudio編譯時報錯:Timeout waiting to lock artifact cache .

1、 錯誤描述 今天在Android Studio中,使用gradle命令的時候,出現瞭如下所示的錯誤: D:\GitLab Source\XTCLint>gradlew clean uploadArchives --stacktrace Star

我的Unity 3D——第一人稱射擊遊戲(2)

三、主角 因為是第一人稱射擊遊戲,所以主角在視野中是不可見的,但我們依然需要為主角建立碰撞體並控制其移動。 1. 在選單欄選擇【GameObject】→【Create Empty】建立一個空的遊戲體,在Inspector視窗將它的Tag設為Player,這就是我們的主角。

廈門第一篇Gradle多渠道打包(動態設定App名稱,應用圖示,背景圖片,狀態列顏色)

我不是詩人,寫不出廈門的美;我不是歌手,唱不出廈門的情;我不是畫家,畫不出廈門的景。 我只是一名程式設計師,我只能用我的眼,我的心去看去感受,那久違的海風吹拂著臉頰,好似內心那一份煩躁與沉重也隨著海風飄向了遠方 . . . . . . 一、Grad

Android瘋狂ListView 第一季 《側滑刪除條目》

題記 -- -- 靜坐窗前,細數曾經,撿拾來時路上的點點滴滴,妥帖地收藏,讓它們安靜地沉睡,等風起的日子,輕輕地喚醒,陪我笑看落花。 落花的窗臺,宛若初秋的原野,淌著流動的色彩,像一片片時光打磨的水黑畫,定格在歲月的深處,寧靜而淡薄。 第一季:《側滑彈框刪除條目操

WCF學習第一簡單的WCF應用

       本應用功能雖然簡單,但他具有一個完整的WCF應用的基本結構。客戶端和服務端通過執行在同一臺機器上的不同程式來模擬,下圖體現了客戶端和服務端程序互相呼叫的關係 步驟一:構建整個解決方案 本程式通過vs2012創造2個程式,分別為服務端WcfHosting和客戶

我的Android重構:外掛化改造原理

熱文導讀 | 點選標題閱讀作者:殺魚能手小耗子連結:https://www.jianshu.co

我的Unity 3D——第一人稱射擊遊戲(3)

四、敵人 1. 自動尋路。光有一個主角,我們的第一人稱射擊遊戲肯定是沒法玩的,所以還需要新增敵人。而為了遊戲更具有可玩性,敵人需要能夠追擊主角並攻擊主角。在很多遊戲中,經常需要敵人在複雜的地形環境中追著主角跑。而場景中經常會存在很多障礙物,這就AI要能夠找出到達目標地點的最

mybatis第一篇-初識mybatis

stream 事務 多條 如果 模糊查詢 user uid exceptio ring 一、JDBC的問題 為什麽我們要使用mybatis,是因為JDBC存在以下問題 1、 數據庫連接創建、釋放頻繁造成系統資源浪費,從而影響系統性能。如果使用數據庫連接池可解決此問題。