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示例相关推荐

  1. LLVM编译器基础 架构

    The LLVM Compiler Infrastructure Projecthttps://llvm.org/Features.html LLVM 功能 C 和 C++的LLVM 编译器系统包括以 ...

  2. MLIR: 编译器基础架构重定义

    MLIR: 编译器基础架构重定义 MLIR(多级中间表示)是语言(如 C)或库(如 TensorFlow)与编译器后端(如 LLVM)之间的中间表示 (IR) 系统.允许不同语言的不同编译器堆栈之间的 ...

  3. LLVM 编译器和工具链技术

    LLVM 编译器和工具链技术 LLVM概述 LLVM项目是模块化和可重用的编译器和工具链技术的集合.尽管名称如此,LLVM与传统虚拟机几乎没有关系.LLVM本身不是首字母缩略词,项目的全名. LLVM ...

  4. pass基础架构分析

    pass基础架构分析 Relay 和 TVM IR,包含一系列优化passes,可提高模型的性能指标,如平均推理,内存占用,或特定设备的功耗.有一套标准优化,及特定机器学习的优化,包括常量折叠,死代码 ...

  5. Pass Infrastructure基础架构(上)

    Pass Infrastructure基础架构(上) Operation Pass OperationPass Op-Specific OperationPass Op-Agnostic Depend ...

  6. AI基础架构Pass Infrastructure

    AI基础架构Pass Infrastructure • Operation Pass o OperationPass : Op-Specific o OperationPass : Op-Agnost ...

  7. Pass Infrastructure基础架构(下)

    Pass Infrastructure基础架构(下) pass注册 PassRegistration该类在示例中简要显示了各种pass类型的定义 .该机制允许注册pass类,以便可以在文本pass管道 ...

  8. 【技术分享】几维安全CTO刘柏江:IoT时代LLVM编译器防护的艺术

    「随着物联网时代的开启,需要解决的安全问题会愈来愈多,而代码安全是其他安全方案的底层支撑.面对芯片架构繁多,运行环境复杂的嵌入式物联网设备,传统的代码安全方案都将会失效,LLVM编译器为我们带来了终极 ...

  9. amis eureka_如何构建量身定制的amis来升级您的基础架构

    amis eureka There comes a time in everyone's infrastructure journey that you have to build your own ...

最新文章

  1. ubuntu配置jdk环境
  2. OpenCV2:图像滤波基础
  3. 安卓项目打开有时候manifests不见了_【必看】暴力0鲁项目详细操作及玩法如何跳过广告,不分享群等...
  4. Crawler:基于urllib+requests库+伪装浏览器实现爬取国内知名招聘网站,上海地区与机器学习有关的招聘信息(2018.4.30之前)并保存在csv文件内
  5. Spring Boot版微信支付教程(视频 源码笔记)
  6. 【Python】5个方便好用的Python自动化脚本
  7. Java中实现多线程的两种方式之间的区别
  8. oracle分区表学习及应用
  9. 小齐读者拿到快手、百度、网易等 offer 的独门秘籍!
  10. 苹果发布iOS 13.1.1更新 修复第三方键盘APP安全等问题
  11. 怎样让AI完成人类搞不定的任务?OpenAI提出迭代扩增法给AI设目标
  12. “智慧城市”如火如荼 与“数字城市”又有何差别?
  13. [DB]MYSQL外键(Foreign Key)的使用(转载)
  14. 基于S3c2440的多种显示屏测试方案
  15. 【每天学一点】如何高效工作,进行项目管理
  16. 用户需求变更和确认的注意事项
  17. 2021-6-10-今日收获
  18. 基于proteus的51单片机仿真实例五十七、定时器/计数器T0的定时实例
  19. Linux常用命令一览表
  20. html5怎么写资料年月日,公文写作中的日期书写格式

热门文章

  1. 过滤Linux下不同大小的文件,linux查找当前目录下 M/G 大小的文件,删除Linux下指定大小的文件
  2. fatal error all goroutines are asleep - deadlock!
  3. Django学习之路(一)--初识django
  4. python异常机制
  5. 【Sql Server】DateBase-子查询
  6. Pytorch 多 GPU 并行处理机制
  7. 操作系统学习笔记 第一章:操作系统概述(王道考研)
  8. Yolov3网络架构分析
  9. deeplearning算法优化原理
  10. 总结笔记-Activity的启动流程