llvm學習第二站 - 什麼是llvm IR

2021-01-14 阿茲貓



開始學習之前,可以先看看llvm的一些基本命令用途,因為接下來會用到。

官網介紹:https://releases.llvm.org/11.0.0/docs/GettingStarted.html

工具名稱
工具用途
llvm-ar‍歸檔器,創建靜態庫,用法和ar基本一致llvm-as
LLVM assembler 彙編器,輸入是LLVM IR,輸出為LLVM bitcodellvm-disLLVM disassembler 反彙編器,輸入是bitcode,輸出為LLVM IRllvm-linkllvm連結器,將多個bitcode連結為一個bitcode,輸入為多個bitcoede,輸出一個連結後的bitcodelli
bitcode立即執行工具,直接運行LLVM的二進位文件llc
靜態編譯器,將.ll或.bc文件編譯為彙編文件,輸出為後綴名.s的文件opt
優化器,能夠對Bitcode執行優化(PASS)的工具。輸入是LLVM bitcode,輸出是優化後的LLVM bitcode

所有的命令介紹:https://llvm.org/docs/CommandGuide/index.html

代碼格式之間的轉換如圖所示:



LLVM IR究竟是什麼?它的全稱是LLVM Intermediate Representation,也就是LLVM的中間表示,可以理解為LLVM自己的彙編,LLVM的優化都在IR層進行處理;它有三種等價的表達形式:內存表示(Instruction類等)、被壓縮的磁碟表示(bitcode文件)、人工可讀的磁碟表示(LLVM彙編碼文件)


下圖可見IR的重要性


關於llvm IR的結構

以下結構示意圖來自於《LLVM IR Tutorial - Phis, GEPs and other things, oh my!》的報告,可以看到IR的結構,pdf下載地址:http://llvm.org/devmtg/2019-04/slides/Tutorial-Bridgers-LLVM_IR_tutorial.pdf有興趣也可以直接去油管訂閱llvm官方頻道看視頻,有很多有用的分享。

結構示意圖

:以下文字內容來源於網絡(https://www.leadroyal.cn/?p=701)[

Module:可以被視為一個.c文件的 IR  表示,如果用Java的描述的話, Module相當於Java裡的類,是獨立存在的一個東西。

      每個 Module都是相對獨立的東西,主要包含了聲明或者定義的函數、聲明或定義的全局變量、當前 Module的基本信息。

      多個 Module之間是相互隔離的、無法獲取對方的內容,跟Java裡類的設定真的非常像。平時為了獲取 Module 的主要信息,使用它的 M.dump() 方法就會在屏幕上列印出全部信息。


Function:是Module中以List的方式存放的,如果用Java的描述的話, Function相當於Java裡的Method,無法單獨存在,必須是在某個 Module裡的。主要包含了大量 BasicBlock 、參數和返回值類型、可變參數列表、函數的attribute和其他函數的基本信息(例如函數名、所在 Module等)。


BasicBlock:是 Function 中以List方式存放的,無法單獨存在,必須是在某個Function裡的,是真正存放可執行代碼的容器。主要包含了大量的 Instruction ,前驅、後繼的 BasicBlock,以及一些基本信息(例如名字什麼的),相比 Function ,它的校驗也更加嚴格,例如不可以憑空出現、不可以處於游離狀態。

      BasicBlock由很多 Instruction組成,按照是否為 TerminatorInst  可以將指令分為兩類,一類是普通的指令,一類是可以成為 TerminatorInst 的指令;因此 BasicBlock一定要以 TerminatorInst類的指令結尾,而且除了最後一個指令是 TerminatorInst,其他指令都是普通指令。每個 BasicBlock都可以視為一段順序執行的代碼,完全不會有任何的分支,有分支就會通過 TerminatorInst進行跳轉。


Instruction:就是上面提到過的「指令」,LLVM IR的最基本的單位,Instruction被包含在BasicBlock中,一個BasicBlock可以有多條Instruction

:以上文字內容來源於網絡(https://www.leadroyal.cn/?p=701)]


foo.c ==> foo.ll

int foo(int i){     return i;}


1.IR的高級結構

01~04行:當前模塊信息,比如ID,源文件名等

06~10行:foo()函數定義

12~12行:全局屬性

14~18行:命名元數據


2.目標信息

以下圖參考對照

3.IR語法

注釋以分號 ; 開頭

全局標識符以@開頭,局部標識符以%開頭

alloca,在當前函數棧幀中分配內存

i32,32bit,4個字節的意思

align,內存對齊

store,寫入數據

load,讀取數據

本文的介紹僅是滄海一粟,關於IR語法更多的學習可以看https://llvm.org/docs/LangRef.html


4.Function

開始於關鍵字define

返回值類型i32,32bit整型

@foo:全局作用域函數foo()

foo()後一般還帶有Function Attributes,如下

參數列表:type-var對列表,此例中是i32類型的%arg

Basic Block:bb是Basic Block的開始標籤

Instruction:表示return的ret指令,有一個i32類型的參數


5.全局屬性attributes

nounwind:表示該函數不會引發異常

uwtable:unwind符號表,記錄與函數相關的debug信息


6.Named Metadata

llvm.module.flags元數據包含一個元數據列表,以傳達有關整個模塊的信息

llvm.ident是llvm標識符的縮寫,可以看到!1即是clang的版本號

每一個元數據包含三個元素:

behavior flag:指定兩個(或多個)模塊合併在一起時的行為,並且可能遇到具有相同ID的元數據。該值可以是1到7,表示不同的行為,例如發出錯誤,發出警告,使用指定的值覆蓋,附加兩個值等

metadata string:元數據的唯一ID作為其名稱

value of the flag:元數據的值。它用於與另一個模塊的元數據值進行比較並觸發指定的行為。

此例:

metadata !0的ID即為wchar_size,值為4,行為標誌為1,如果兩個值不同發出錯誤。

metadata !1的flag和value都為空,只包含一個ID即字符串名字


7.修改IR文件

IR文件可以直接修改運行,比如,修改world改為azima


結語

好吧,這一篇就水到這裡吧,實在水不動了😄,英文的視頻文檔看的頭大...不過好在看完以上的這些應該就對IR有了一個模糊的印象了,更加深入的內容隨著學習會逐漸明朗起來的,加油。



相關焦點

  • 通過LLVM 在 Android 上運行 Swift 代碼
    ;構建對象文件:$ $SDK/usr/bin/swiftc -emit-object hello.swifthello.o 裡面到底有什麼:$ nm hello_swift.o                 U __TFSSCfMSSFT21_builtinStringLiteralBp8byteSizeBw7isASCIIBi1
  • 基於LLVM的內存計算
    所以LLVM可謂是移動時代的幕後英雄,那麼它和傳統的數據處理有什麼關係呢?在深入介紹LLVM是如何改變傳統數據處理引擎之前,讓我們先了解一下傳統數據處理引擎的短板。
  • [英語學習]表示否定的前綴ir, un, im, in, non, dis添加規律
    [英語學習]表示否定的前綴ir, un, im, in, non, dis添加規律 2011-10-26 14:53 來源:網絡 作者:
  • ir2110中文資料詳解_引腳圖及功能_工作原理_內部結構及應用電路
    一、ir2110中文資料詳解_ir2110引腳圖及功能 1、ir2110引腳圖 中文資料詳解_ir2110內部結構 R2110的內部結構和工作原理框圖如圖所示。 三、ir2110中文資料詳解_ir2110工作原理 IR2110內部功能由三部分組成:邏輯輸入;電平平移及輸出保護。
  • ir2103典型應用電路詳解(三款ir2103典型應用電路)
    打開APP ir2103典型應用電路詳解(三款ir2103典型應用電路) 發表於 2018-03-04 14:36:46   ir2103典型應用電路一:   永磁無刷直流電機是隨著高性能永磁材料、電機控制技術和電力電子技術的發展而出現的一種新型電機,它既具有交流電機結構簡單、運行可靠、維護方便、壽命長等優點,又具備直流電機運行效率高、無勵磁損耗及調速性能好等諸多優點,而且還具有功率密度高,低轉速,大轉矩的特點。
  • ir2130引腳圖及功能
    打開APP ir2130引腳圖及功能 發表於 2017-11-06 09:09:21 文章及其配圖僅供工程師學習之用,如有內容圖片侵權或者其他問題,請聯繫本站作侵刪。 侵權投訴
  • 三個有用的前綴:im-,ir-,non-,你知道它們的意思嗎?
    ir-「ir-」這個前綴在英語中相當於「not something」。OK,你看這個單詞,irregular,regular是規律的意思,加上ir-這個前綴,某個東西不是regular,那麼irregular就是不規律的意思啦。
  • 眼底在什麼位置圖片_眼底彩圖和視網膜眼底圖 - CSDN
    相關文檔:llvm-exegesis - LLVM Machine Instruction Benchmarkhttps://llvm.org/docs/CommandGuide/llvm-exegesis.htmlGoogle產品,我們的雲產品和機器學習模型推理決定了計算、存儲和網絡提供大規模、可靠、高效的技術基礎架構的能力。
  • 英語詞彙學習之策略--Stand by是站哪?
    詞彙學習Stand up是由兩部分構成的,stand是「站著、站立」的意思,而by有一種常見含義即「在……旁邊」。直觀地看二者合成一個短語其意義就應該是「站在……旁邊」,那麼stand by有這種含義嗎?
  • 掌握英語學習小技巧,英語單詞不再犯愁,親測真高效
    英語單詞需要理解記憶,這是我們學習英語單詞的根本。我們對所學的英語單詞必須理解透徹了才能把它轉為大腦的長效存儲。當然理解單詞的方法主要是詞根詞綴的方法,但是有時候也可以採用一些小竅門,比如聯想法,諧音法,歸類法等等。
  • 讓學生站在巨人肩膀上學習
    78歲的他在臺上站著講了90分鐘,臺下的中國科學院大學(以下簡稱「國科大」)學生,把教室前三排坐得滿滿當當……「科教融合」是國科大獨具特色的育人模式。在國科大「科教融合」的40年間,無數像李家春一樣的一線科學家走上講臺,把一批批學生送出校園,他們中不少已成長為國家科技的中堅力量。
  • 李航《統計學習方法》第二版上線,6 年耕耘增加無監督學習
    李航博士告訴機器之心,《統計學習方法》第二版新加了無監督學習方面的內容,並對第一版的監督學習方法做了一些修改。總體而言,第二版可以分為監督學習和無監督學習兩篇。從這兩大塊出發,基本上傳統機器學習的主要概念就能一步步掌握了。
  • 複習篇丨進來測測你的英語學習成果
    大家好,我是十個豆加,關注我,每天為您分享英語學習的小技巧。英語學習不是一蹴而就,大家要持之以恆呀~小編每天為大家更新的英語學習的知識點,不知您掌握得怎麼樣呢?那麼從下面的實例來測一下您的學習成果吧!根據構詞法,regular的否定為加前綴「ir」,因此②選擇irregular。整句翻譯為:疼痛在月經前或情緒波動時可加重,連續三個月經周期不規律。學習要靠日積月累,一點一滴才能匯聚汪洋大海,大家繼續加油吧!如果你喜歡我的英語學習分享,那就關注我吧!你的分享和關注是小編努力寫文章的動力哦~
  • 中國金融在線將於北京時間9月25日公布2020年第二季度及上半年未經...
    來源:中國金融在線中國金融在線(NASDAQ GS: JRJC)9月23日宣布,公司將於美國東部時間2020年9月24日美國股市收盤後公布截至2020年6月30日的第二季度及上半年未經審計的財務報告。相關業績新聞稿請查詢公司投資者關係網站https://ir.chinafinanceonline.com/。 財務報告公布後,公司管理層將舉行2020年第二季度及上半年財務報告電話會議。電話會議的時間定於美國東部時間2020年9月24日晚8點(北京或香港時間2020年9月25日早8點)。
  • IR Drop分析之Redhawk分析流程
    anlysisperform analysis -static#perform emcheck -mode avg#run Redhawk explorerexplore design# -constraint_file "cons.rpt" #save databaseexport db static_ir.db
  • 《智慧學習方程式》第二期:投入越多學得越好?
    「再窮不能窮教育、學習改變命運」,為了提升孩子的學習競爭力,越來越多的家長尤其重視教育上的投入。但是,一個常見現象是,教育投入多,卻不能獲得同等的回報,面對孩子不見起色的學習成績,家長們十分苦惱,他們並沒有意識到,自己很可能陷入了教育投入的誤區。
  • 學習強國!一站到底知識擂臺挑戰賽!誰是最強大腦?
    學習強國!一站到底知識擂臺挑戰賽!誰是最強大腦?>海珠區文廣旅體局選手楊亦嗚說:「『學習強國』一站到底知識競賽很好玩也很有意義,通過備賽和參賽的過程,加深了我對黨的政治理論知識深層次的理解。