日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

LLVM编译器基础架构与DragonEgg示例

發布時間:2023/11/28 生活经验 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LLVM编译器基础架构与DragonEgg示例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

LLVM編譯器基礎架構與DragonEgg示例
LLVM 概述
LLVM 項目是模塊化和可重用的編譯器和工具鏈技術的集合。LLVM 與傳統的虛擬機幾乎沒有關系。“LLVM”這個名字本身并不是一個首字母縮寫詞;是項目的全名。
LLVM開始作為一個研究項目,在伊利諾伊大學,與提供能夠一個現代的,基于SSA編譯策略目標,支持任意編程語言的,靜態與動態編譯。從那時起,LLVM 已經發展成為一個由多個子項目組成的傘形項目,其中許多被各種商業和開源項目用于量產, 廣泛用于學術研究。LLVM 項目中的代碼,根據"Apache 2.0 License with LLVM exceptions"許可的。
LLVM 的主要子項目是:

  1. LLVM內核庫提供一個現代化的,source- and target-independent獨立的 optimizer 優化,依靠 code generation support代碼生成,支持許多流行的CPU(以及一些不太常見的!),這些庫文件基于特定代碼,稱為LLVM中間代碼表示(“LLVM IR”)構建的。LLVM 核心庫有很好的參考文檔,而且特別容易創造新語言(或移植現有的編譯器),使用 LLVM 作為優化器和代碼生成器。
  2. Clang是一個“LLVM 原生”,C/C++/Objective-C 編譯器,旨在提供驚人的編譯速度、極好的 error and warning messages 錯誤和警告消息,構建一個平臺,構建超源級工具building great source level tools。 Clang Static Analyzer and clang-tidy,在代碼中自動尋找錯誤bugs,可以使用Clang frontend前端庫,提供解析C / C ++代碼生成工具的大量示例。
  3. LLDB項目由LLVM和Clang構建,提供了大量調試great native debugger。使用 Clang AST 和表達式解析器、LLVM JIT、LLVM 反匯編器等,提供了“正常工作”"just works"的體驗。在加載符號時,比 GDB 更快,存儲效率更高。
  4. 在libc中++和 libc ++ ABI項目,提供了一個標準的適配和高性能實現的C ++標準庫,包括C ++ 11和C ++ 14的完全支持。
  5. 編譯器RT項目,提供了高效tune調試,如"__fixunsdfdi"的low-level code generator支持例程的實現等,當目標不具有本地指令的短序列實現核心IR操作,產生的調用時。還為動態測試工具(例如AddressSanitizer、 ThreadSanitizer、 MemorySanitizer和 DataFlowSanitizer )提供運行時庫的實現 。
  6. MLIR子項目,一種新的方法來構建可重用和可擴展的編譯架構。MLIR 旨在解決軟件碎片問題,改進異構硬件的編譯,顯著降低構建特定領域編譯器的成本,支持將現有編譯器連接在一起。
  7. OpenMP的子項目, 在clang 中,通過OpenMP實現,提供OpenMP runtime。
  8. 該polly項目,使用using a polyhedral model多面體模型套件,auto-parallelism and vectorization自動并行和向量化,實現整套cache-locality optimizations緩存局部性優化。
  9. libclc項目,實現OpenCL標準庫。
  10. klee項目,實現了“symbolic virtual machine符號虛擬機” ,通過程序中的所有動態路徑,采用一個定理證明,試圖評估在努力發現問題和證明的功能性。klee 的一個主要特性,可以在檢測到錯誤時,生成測試用例。
  11. LLD項目,一個新的linker鏈接器。系統鏈接器的直接替代品,運行速度更快。
    除了 LLVM 的官方子項目之外,還有各種各樣的其它項目,使用 LLVM 的組件完成各種任務。通過這些外部項目,可以使用 LLVM,編譯 Ruby、Python、Haskell、Rust、D、PHP、Pure、Lua 和許多其它語言。LLVM 的一個主要優勢,多功能性、靈活性和可重用性,這就是為什么用于如此廣泛的不同任務:從對 Lua 等嵌入式語言,進行輕量級 JIT 編譯,到為大規模超級計算機編譯 Fortran 代碼。
    與其它一樣,LLVM 擁有一個廣泛而友好的社區,對構建出色的低級工具感興趣。如果有興趣參與,最好先瀏覽LLVM 博客并注冊LLVM 開發人員郵件列表。有關如何發送補丁、獲取提交訪問權限,以及版權和許可主題的信息,請參閱LLVM 開發人員規則。
    DragonEgg示例
    DragonEgg in action
    使用gcc-4.5編譯"hello world" 程序:
    $ gcc hello.c -S -O1 -o -
    .file “hello.c”
    .section .rodata.str1.1,“aMS”,@progbits,1
    .LC0:
    .string “Hello world!”
    .text
    .globl main
    .type main, @function
    main:
    subq $8, %rsp
    movl $.LC0, %edi
    call puts
    movl $0, %eax
    addq $8, %rsp
    ret
    .size main, .-main
    .ident “GCC: (GNU) 4.5.0 20090928 (experimental)”
    .section .note.GNU-stack,"",@progbits

將 -fplugin=path/dragonegg.so 加到 gcc command line優化代碼,通過LLVM生成codegenerator:
$ gcc hello.c -S -O1 -o - -fplugin=./dragonegg.so
.file “hello.c”

Start of file scope inline assembly

.ident	"GCC: (GNU) 4.5.0 20090928 (experimental) LLVM: 82450:82981"

End of file scope inline assembly

.text
.align	16
.globl	main
.type	main,@function

main:
subq $8, %rsp
movl $.L.str, %edi
call puts
xorl %eax, %eax
addq $8, %rsp
ret
.size main, .-main
.type .L.str,@object
.section .rodata.str1.1,“aMS”,@progbits,1
.L.str:
.asciz “Hello world!”
.size .L.str, 13

.section	.note.GNU-stack,"",@progbits

增加 -fplugin-arg-dragonegg-emit-ir或 -flto 的LLVM IR 輸出 output (需要assembler output匯編輸出, -S, 不是目標代碼輸出, -c, 否則,gcc 傳遞pass the LLVM IR 到 the system assembler, 肯定匯編失敗):
$ gcc hello.c -S -O1 -o - -fplugin=./dragonegg.so -fplugin-arg-dragonegg-emit-ir
; ModuleID = ‘hello.c’
target datalayout = “e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128”
target triple = “x86_64-unknown-linux-gnu”

module asm “\09.ident\09\22GCC: (GNU) 4.5.0 20090928 (experimental) LLVM: 82450:82981\22”

@.str = private constant [13 x i8] c"Hello world!\00", align 1 ; <[13 x i8]*> [#uses=1]

define i32 @main() nounwind {
entry:
%0 = tail call i32 @puts(i8* getelementptr inbounds ([13 x i8]* @.str, i64 0, i64 0)) nounwind ; [#uses=0]
ret i32 0
}

參考鏈接:
https://llvm.org/
https://dragonegg.llvm.org/

總結

以上是生活随笔為你收集整理的LLVM编译器基础架构与DragonEgg示例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。