首页
服装论坛t.vhao.net
专栏
课程

LLVM入门篇剧院版

2019-5-13 21:48 1179

LLVM入门篇剧院版

2019-5-13 21:48
1179

LLVM入门篇剧院版

LLVM的官方入门

这个PPT是位于 llvm.org/docs/LLVM Design & Overview/Introduction to the LLVM Compiler目次下,地址在这里,PPT为LLVM作者Chris LattnerACAT大年夜会上发表的演讲PPT,Chris Lattner在本讲座上扼要简介了LLVM,评论辩论了应用LLVM的好处,包含更强悍的编译时和运转时性能。这个讲座固然很高等,然则其实也合适没有深度编译器基本背景的人。固然,这篇文档是2008年的了,内容稍微有点过时,但仍不掉为一篇官方版本的LLVM简介文档。

 

 

全部PPT有55页,固然假设大年夜家有时间,最好可以全文浏览一遍,由于真的不难,全文重要分为四个部分。

  • Intro and Motivation(LLVM简介和动机)
  • LLVM as a C and C++ Compiler(LLVM作为C/C++的编译器)
  • Other LLVM Capabilities(LLVM还能做甚么)
  • LLVM Going Forward(LLVM将来展望)

LLVM项目是甚么?

  • 现代编译器技巧集大年夜成者

    • 优化器和代码生成器
    • llvm-gccclang前端
    • MSIL.NET虚拟机
  • 由浩大供献者参与的开源项目

浩大行业、研究集团、小我

 

为何要造一个新的编译器?

由于现有的开源C编译器已停止不前!(说的就是gcc!)

  • gcc的“顽疾”
    • 基于数十年前的代码生成技巧
    • 没有跨文件优化和JIT等现代技巧
    • 老化代码库:难以进修,难以调优,重构艰苦
    • 难以复用
    • 新版本愈来愈慢

我们想要的编译器是甚么模样的?

  • 一组具有产等级质量的可复用的库:
    • 能实施各类paper里描述的最新技巧
    • 能专注于编译过程
    • 能生成高性能的代码
  • 支撑很多不合的说话和应用法式榜样

LLVM的愿景和完成办法

  • 重要义务:构建一组模块化编译器组件:

    • 增添构建特定编译器的时间和本钱
    • 组件在不合的编译器之间共享
    • 许可为详细义务选择精确的组件
  • 主要义务:应用这些组件构建编译器

    • 例如,一个真正优良的C编译器
    • 例如,一个运转时特化引擎

llvm优化器的潜力

  • 生成的代码:代码运转的速度有多快?
  • 编译时间:编译过程可以提速若干?
  • 新功能:链接时优化

  • 编译时间快了四成阁下!

  • 履行时间快了两成阁下!

  • 新功能:链接时优化
    • 应用-O4选项优化文件(例如内联,常数折叠等)
    • 跨说话界线才能的深度优化!

针对编译器研究员

  • LLVM是写新说话的幻想对象

    • 定义明白,编程简单
    • 易于重新定位现有编译器以应用LLVM后端
  • LLVM支撑现代的即时优化和编译

    • 根据静态信息在运转时优化代码
    • 易于将现有字节码说冥看重新定位到LLVM JIT
    • 功能异常强大年夜,绝不只仅是传统的“编译器”

LLVM的周边项目

lldb

lldb项目是一个应用LLVM基本架构构建的新一代的高性能调试器,在Mac OS X上作为Xcode 5的内置调试器停止发布。装置好XcodeCommand Line Tools的话,敕令行是可以直接拜访lldb对象的。以下所示:

$ which lldb
/usr/bin/lldb

lldb项目属于全新的基本架构,该架构支撑现代的多线程法式榜样,并且以加倍高效的方法处理调试符号,模块化的组件为功能的扩大打下优胜的基本。别的,由于lldb加倍开放的特点(其licsence其实不是GPL。GPL请求应用GPL授权的产品都必须开源),lldb简直可以集成就任何想要集成的产品中去,而不消担心司法成绩。

 

lldb会将调试信息转换为clang类型,以便它可以应用clang编译器的基本架构。这使得lldb可以在表达式中支撑最新的cc++Objective-CObjective-C++说话的一切功能和运转时,而无需重新完成这些功能。另外它还应用编译器来处理函数调用表达式时的一切ABI接口,反汇编指令和提取指令细节等流程,把llvmclang的基本架构应用到了极致。

御用调试器

作为clang的“御用”调试器,lldb有以下几个长处:

  • 最新的CC++Objective-C说话支撑
  • 可以声明部分变量和类型的多行表达式
  • 当须要时可以直接应用clang的JIT表达式
  • JIT弗成用的时辰,会直接对中心表示(IR)停止复原
根本应用办法

我们以一个案例,来粗略解释应用lldb的根本应用办法。lldbiOS的开辟和逆向的任务中,曾经被应用得异常广泛了,关于正向开辟和逆向分析的场景中应用lldb,搜集上都可以找到很多文章与教程,这里假定读者曾经初步懂得过lldb的根本应用办法。或许,假设您曾经对gdb异常熟悉,而没有应用过lldb的话,可以在lldb-gdb敕令接洽关系页面,找到gdb下对应的敕令在lldb下应当若何应用的操作解释。如许可以快速的从gdb的应用经历上,找到lldb的应用技能。如图所示:

 

 

与GDB一样,我们可以经过过程敕令行的方法传递参数给lldb调试器:

$ lldb mybuilder/bin/clang
Current executable set to 'mybuilder/bin/clang' (x86_64).
(lldb) break main
Breakpoint 1: where = clang`main + 48 at driver.cpp:293, address = 0x000000001000109e0

静态调试时,我们为clang二进制文件供给敕令行参数。例如应用-v参数,它应当打印clang版本:

(lldb) run -v

LLDB达到我们的断点后,应用next敕令渐渐履行每行c++代码。与gdb一样,lldb接收任何敕令的缩写,缩写可所以单个字母,也可所以敕令单词的前几个字符。例如next可以用n来代替,finish可以应用finifinis代替。

 

lldb中供给的p敕令还可以打印c++对象的内容。以下所示,履行下一步后,应用p敕令打印ArgAllocator参数的内容:

(lldb) n
(lldb) p ArgAllocator (llvm::SpecificBumpPtrAllocator<char>) $0 = {
Allocator = { SlabSize = 4096
SizeThreshld = 4096
DefaultSlabAllocator = (Allocator = llvm::MallocAllocator @ 0x00007f85f1497f68)
Allocator = 0x0000007fffbff200 CurSlab = 0x0000000000000000
CurPtr = 0x0000000000000000 End = 0x0000000000000000
BytesAllocated = 0
}
}

静态调试终了后,可经过过程q敕令来加入调试:

(lldb) q
Quitting LLDB will kill one or more processes. Do you really want to proceed: [Y/n] y

lld

lldllvm项目标链接器,可以作为体系默许链接器的直代替换品,运转速度比拟体系的链接器要快的多,别的还供给了针对编译器开辟人员的其他有效功能。

 

lld今朝按照兼容程度排序的话,最完美的是ELF(Unix),其次是PE / COFF(Windows),然后是Mach-O(macOS),最后是WebAssemblylld在不合平台上的链接完成都不一样,本文将会详述ELF(Unix)平台的完成,针对PE/COFF(windows)平台上完成的也很好,兼容Windows debug info (PDB),针对WebAssembly的完成还在开辟中(大年夜家可以看WebAssembly lld port),别的针对Mach-O平台的完成则采取了一套ATOM-based lld的架构,概略可以浏览官方文档

特点
  1. LLDGNU链接器的直代替换品,它接收与GNU雷同的敕令行参数和脚本文件。lld团队在与FreeBSD慎密协作的过程当中,异常看重处理兼容性成绩,由于欲望能在将来版本的操作体系中,欲望能选择LLD作为体系的默许链接器。是以,截至2017年2月,LLD曾经可以或许链接全部FreeBSD / amd64基本体系,包含内核。经过过程一些团队正在制造中的补丁,它可以链接基于AMDx64架构的95%的freeBSD各类发行版。

  2. LLD运转速度异常快,在多核计算机上链接大年夜型法式榜样时,LLD的运转速度可以达到GNU gold链接器的两倍多。

  3. LLD支撑各类CPU / ABI,包含x86-64x86x32AArch64ARMMIPS 32/64大年夜/小端,PowerPCPowerPC 64AMDGPU。个中,x86-64的支撑最为完美,完全可以用在临盆情况,AArch64MIPS也不错。 x86只能说应当没成绩,但还没有经过完美的测试,还有对ARM的支撑,正在积极开辟中。

  4. 不论lld被若何编译出来,它一直是一个交叉链接器,一直支撑上述一切目标架构。lld乃至都不供给编译时的选项来启用/禁用任何一个目标架构,所以,把lld集成到你的编译对象里应当可以很宁神。

  5. 可以将LLD嵌入到法式榜样中去,以清除法式榜样对外部链接器的依附性。只须要构造目标文件和敕令行参数,就像调用外部链接器一样,然后从代码中调用链接器的主函数lld :: elf :: link

  6. LLD很小。应用LLVM libObject库来读取目标文件,固然如许比较显得不是很公平,但截至2017年2月,LLD / ELF仅包含21kC ++代码,而GNU gold包含198kC ++代码。这数据也足以解释LLD真的很小。

  7. LLD默许支撑链接时优化(LTO)。想要应用LTO的话只须要将-flto选项传递给clang,然后clang则不会创建的本机的native对象格局,而是LLVM bitcode格局。然后LLD读取bitcode目标文件,应用LLVM编译并产生输入文件。在开启LTO时,LLD参与编译的全部过程,对全部法式榜样停止优化。

  8. 陈旧的Unix体系(90年代之前乃至之前)的一些异常陈旧的功能已被删除。一些默许设置也曾经停止了调剂。例如,默许情况下,客栈被标记为弗成履行,来加强安然性。

性能表示

测试情况为一台双路E5-2680 2.8Ghz主频、20核40线程的CPU,硬盘为SSD
分别运转GNUgloder链接器和llvmlld链接器,比较项目里也包含了带不带多线程支撑。

 

PS:默许是开启多线程的,假设要禁用多线程,可以在敕令行里添加-no-threads 选项。

 

 

如图可见,从编译时间下去看,lld明显快于GNU链接器。

 

PS:这只是基于单个情况下的基准测试成果,根据可用内核的数量,可用内存量或磁盘延迟/吞吐量,能够会存在误差。

应用

LLD装置为ld.lld。 在Unix上,链接器由编译器法式榜样调用,所以不克不及直接应用该敕令,有几种办法可以强迫编译器应用ld.lld而不是默许链接器。

  • 起首,最简单的办法是覆盖默许链接器。 将LLD装置到磁盘上的某个地位后,可以经过过程履行ln -s /path/to/ld.lld /usr/bin/ld创建符号链接,以便将/usr/bin/ld解析为LLD

  • 假设您不想更改体系设置,可以应用clang-fuse-ld选项。如许,会在构建法式榜样时将-fuse-ld = lld设置为LDFLAGS

LLD会将其称号和版本号留在输入中的.comment部分。假设不肯定能否成功应用LLD,运转readelf --string-dump .comment <output-file>并检查输入。 假设输入中包含字符串“Linker:LLD”,则表示曾经成功应用LLD啦。

LLVM优化入门

llvm如今作为一个完全的编译对象链,包含了clang/clang++的前端,可优化和设备的中心代码,针对不合架构生成机械码的后端,可以作为完全的成套对象(toolchain)而应用。并且,在中心层上对代码履行的平台有关的优化,是llvm的杀手锏,也是基于llvm停止二次开辟的过程当中,最为关键和重要的处所。

 

opt敕令详解

语法

opt [options] [filename]

简介

optoptimizer的缩写,是llvm体系的分析器和优化器,该敕令接收llvm字节码作为输入,对其停止指定的分析和优化,并且输入分析或优化的成果。

 

假设敕令行中没有指定输入文件,则opt敕令会从标准输入中读取输入,输入可所以llvm汇编说话.ll或许llvm的字节码.bc。同理假设没有指定输入文件名的话,opt也会输入到标注输入中去。

 

opt的履行过程取决于有没有加上-analyze分析的选项:

  • 假设有-analyze分析的选项,opt会对输入文件停止各类各样的分析,并且将分析成果输入到标准输入,固然也会有一些情况下输入到标准缺点输入,或许应用重定位输入到文件中。
  • 假设没有-analyze分析选项的话,opt会默许对输入文件停止优化,优化的成果取决于采取了哪个pass,可以应用-load选项来加载这些pass,也能够应用-help来检查可用的pass一览。可以看到可供选择的优化选项是异常多的。
$ ./opt -help
OVERVIEW: llvm .bc -> .bc modular optimizer and analysis printer

USAGE: opt [options] <input bitcode file>

OPTIONS:

General options:

  -O0                                               - Optimization level 0. Similar to clang -O0
  -O1                                               - Optimization level 1. Similar to clang -O1
  -O2                                               - Optimization level 2. Similar to clang -O2
  -O3                                               - Optimization level 3. Similar to clang -O3
  -Os                                               - Like -O2 with extra optimizations for size. Similar to clang -Os
  -Oz                                               - Like -Os but reduces code size further. Similar to clang -Oz
  -S                                                - Write output as LLVM assembly
  -aarch64-neon-syntax                              - Choose style of NEON code to emit from AArch64 backend:
    =generic                                        -   Emit generic NEON assembly
    =apple                                          -   Emit Apple-style NEON assembly
  -addrsig                                          - Emit an address-significance table
  -amdgpu-dump-hsa-metadata                         - Dump AMDGPU HSA Metadata
  -amdgpu-enable-merge-m0                           - Merge and hoist M0 initializations
  -amdgpu-sdwa-peephole                             - Enable SDWA peepholer
  -amdgpu-spill-sgpr-to-smem                        - Use scalar stores to spill SGPRs if supported by subtarget
  -amdgpu-verify-hsa-metadata                       - Verify AMDGPU HSA Metadata
  -amdgpu-vgpr-index-mode                           - Use GPR indexing mode instead of movrel for vector indexing
  -analyze                                          - Only perform analysis, no optimization
  -arm-add-build-attributes                         -
  -arm-implicit-it                                  - Allow conditional instructions outdside of an IT block
    =always                                         -   Accept in both ISAs, emit implicit ITs in Thumb
    =never                                          -   Warn in ARM, reject in Thumb
    =arm                                            -   Accept in ARM, reject in Thumb
    =thumb                                          -   Warn in ARM, emit implicit ITs in Thumb
  -asm-instrumentation                              - Instrumentation of inline assembly and assembly source files
    =none                                           -   no instrumentation at all
    =address                                        -   instrument instructions with memory arguments
  -asm-show-inst                                    - Emit internal instruction representation to assembly file
  -atomic-counter-update-promoted                   - Do counter update using atomic fetch add  for promoted counters only
  Optimizations available:
    -aa                                             - Function Alias Analysis Results
    -aa-eval                                        - Exhaustive Alias Analysis Precision Evaluator
    -aarch64-a57-fp-load-balancing                  - AArch64 A57 FP Load-Balancing
    -aarch64-ccmp                                   - AArch64 CCMP Pass
    -aarch64-collect-loh                            - AArch64 Collect Linker Optimization Hint (LOH)
    -aarch64-condopt                                - AArch64 CondOpt Pass
    -aarch64-copyelim                               - AArch64 redundant copy elimination pass
    -aarch64-dead-defs                              - AArch64 Dead register definitions
    -aarch64-expand-pseudo                          - AArch64 pseudo instruction expansion pass
    ...
    ...

Generic Options:

      -help                                             - Display available options (-help-hidden for more)
      -help-list                                        - Display list of available options (-help-list-hidden for more)
      -version                                          - Display the version of this program

Polly Options:
    Configure the polly loop optimizer

      -polly                                            - Enable the polly optimizer (only at -O3)
      -polly-2nd-level-tiling                           - Enable a 2nd level loop of loop tiling
      -polly-ast-print-accesses                         - Print memory access functions
      -polly-context=<isl parameter set>                - Provide additional constraints on the context parameters
      -polly-dce-precise-steps=<int>                    - The number of precise steps between two approximating iterations. (A value of -1 schedules another approximation stage before the actual dead code elimination.
      -polly-delicm-max-ops=<int>                       - Maximum number of isl operations to invest for lifetime analysis; 0=no limit
      -polly-detect-full-functions                      - Allow the detection of full functions
      -polly-dump-after                                 - Dump module after Polly transformations into a file suffixed with "-after"
      -polly-dump-after-file=<string>                   - Dump module after Polly transformations to the given file
      -polly-dump-before                                - Dump module before Polly transformations into a file suffixed with "-before"
      -polly-dump-before-file=<string>                  - Dump module before Polly transformations to the given file
      -polly-enable-simplify                            - Simplify SCoP after optimizations
      ...
      ...
选项
选项 含义
-f 启动输入二进制到敕令行界面。普通情况下,opt不会将二进制直接输入来,加了-f选项以后,可将二进制输入到随便任性输入
-help 打印opt敕令的一切选项
-o<filename> 指定输入文件
-S 输入形式从输入字节码切换为输入llvm中心代码表示(IR)
-{passname} opt敕令接收多个pass参数,并且会按照pass传出去的次序,来履行这些pass。可以应用help敕令检查一切可用的pass参数
-disable-inlining 该选项可以移除pass中的内联pass
-disable-opt 只要给定-std-link-opts选项的时辰,该选项才有效,并且禁用大年夜部分pass
-strip-debug 在运转其他pass之前,优先剔除调试信息。固然这个选项的感化跟strip是雷同的,然则-strip-debug可以包管剔除在最前面运转
-verify-each 单个验证,在每个pass的前面加一个用于验证的pass。如许可以确认每个pass毕竟干了甚么。
-stats 打印统计信息
-time-passes 记录下每个pass履行的时间,并且输入到标准缺点输入
-debug 调试输入,编译为调试形式,该选项会启用一切pass里的调试输入,也就是由宏LLVM_DEBUG()定义的输入内容,可以检查LLVM Programmer’s Manual,看#DEBUG一节来检查更多内容。
-load=<plugin> 加载静态插件。该插件须要注册新的优化或许分析选项,一旦加载成功以后,可以应用插件本身的优化或许分析选项,应用opt -load=plugin.so -help敕令来检查该插件本身的选项。
-p 在每个转换以后打印模块
前往值

opt成功前往时,前往值为0。假设过程产生了缺点,会输掉足误,并且前往一个非零值。

llvm内置的浩大Passes

Passes重要分为三类

llvm内置的pass特别多,根本上分为三类,Analysis PassesTransform PassesUtility PassesAnalysis Passes类其他Pass重要用于计算分析和输入一些IR信息,用于调试用处、可视化用处等等。Transform Passes类其他Pass就是我们的重点,可以完全将现有的IR“更改成”别的一种情势的IR,详细若何更改,全看代码怎样写。可以在Transform Passes里调用Analysis PassesUtility Passes则完全就是由于有些Pass既不是Analysis类型,也不是Transform类型,比如某些Pass的感化就是将函数释放成字节码,或许将某个模块生成字节码本质上既不是分析也不是转化,所以就归类成Utility Passes

    Analysis Passes
        -aa-eval: Exhaustive Alias Analysis Precision Evaluator
        -basicaa: Basic Alias Analysis (stateless AA impl)
        -basiccg: Basic CallGraph Construction
        -count-aa: Count Alias Analysis Query Responses
        -da: Dependence Analysis
        -debug-aa: AA use debugger
        -domfrontier: Dominance Frontier Construction
        -domtree: Dominator Tree Construction
        -dot-callgraph: Print Call Graph to “dot” file
        -dot-cfg: Print CFG of function to “dot” file
        -dot-cfg-only: Print CFG of function to “dot” file (with no function bodies)
        -dot-dom: Print dominance tree of function to “dot” file
        -dot-dom-only: Print dominance tree of function to “dot” file (with no function bodies)
        -dot-postdom: Print postdominance tree of function to “dot” file
        -dot-postdom-only: Print postdominance tree of function to “dot” file (with no function bodies)
        -globalsmodref-aa: Simple mod/ref analysis for globals
        -instcount: Counts the various types of Instructions
        -intervals: Interval Partition Construction
        -iv-users: Induction Variable Users
        -lazy-value-info: Lazy Value Information Analysis
        -libcall-aa: LibCall Alias Analysis
        -lint: Statically lint-checks LLVM IR
        -loops: Natural Loop Information
        -memdep: Memory Dependence Analysis
        -module-debuginfo: Decodes module-level debug info
        -postdomfrontier: Post-Dominance Frontier Construction
        -postdomtree: Post-Dominator Tree Construction
        -print-alias-sets: Alias Set Printer
        -print-callgraph: Print a call graph
        -print-callgraph-sccs: Print SCCs of the Call Graph
        -print-cfg-sccs: Print SCCs of each function CFG
        -print-dom-info: Dominator Info Printer
        -print-externalfnconstants: Print external fn callsites passed constants
        -print-function: Print function to stderr
        -print-module: Print module to stderr
        -print-used-types: Find Used Types
        -regions: Detect single entry single exit regions
        -scalar-evolution: Scalar Evolution Analysis
        -scev-aa: ScalarEvolution-based Alias Analysis
        -stack-safety: Stack Safety Analysis
        -targetdata: Target Data Layout
    Transform Passes
        -adce: Aggressive Dead Code Elimination
        -always-inline: Inliner for always_inline functions
        -argpromotion: Promote ‘by reference’ arguments to scalars
        -bb-vectorize: Basic-Block Vectorization
        -block-placement: Profile Guided Basic Block Placement
        -break-crit-edges: Break critical edges in CFG
        -codegenprepare: Optimize for code generation
        -constmerge: Merge Duplicate Global Constants
        -constprop: Simple constant propagation
        -dce: Dead Code Elimination
        -deadargelim: Dead Argument Elimination
        -deadtypeelim: Dead Type Elimination
        -die: Dead Instruction Elimination
        -dse: Dead Store Elimination
        -functionattrs: Deduce function attributes
        -globaldce: Dead Global Elimination
        -globalopt: Global Variable Optimizer
        -gvn: Global Value Numbering
        -indvars: Canonicalize Induction Variables
        -inline: Function Integration/Inlining
        -instcombine: Combine redundant instructions
        -aggressive-instcombine: Combine expression patterns
        -internalize: Internalize Global Symbols
        -ipconstprop: Interprocedural constant propagation
        -ipsccp: Interprocedural Sparse Conditional Constant Propagation
        -jump-threading: Jump Threading
        -lcssa: Loop-Closed SSA Form Pass
        -licm: Loop Invariant Code Motion
        -loop-deletion: Delete dead loops
        -loop-extract: Extract loops into new functions
        -loop-extract-single: Extract at most one loop into a new function
        -loop-reduce: Loop Strength Reduction
        -loop-rotate: Rotate Loops
        -loop-simplify: Canonicalize natural loops
        -loop-unroll: Unroll loops
        -loop-unroll-and-jam: Unroll and Jam loops
        -loop-unswitch: Unswitch loops
        -loweratomic: Lower atomic intrinsics to non-atomic form
        -lowerinvoke: Lower invokes to calls, for unwindless code generators
        -lowerswitch: Lower SwitchInsts to branches
        -mem2reg: Promote Memory to Register
        -memcpyopt: MemCpy Optimization
        -mergefunc: Merge Functions
        -mergereturn: Unify function exit nodes
        -partial-inliner: Partial Inliner
        -prune-eh: Remove unused exception handling info
        -reassociate: Reassociate expressions
        -reg2mem: Demote all values to stack slots
        -sroa: Scalar Replacement of Aggregates
        -sccp: Sparse Conditional Constant Propagation
        -simplifycfg: Simplify the CFG
        -sink: Code sinking
        -strip: Strip all symbols from a module
        -strip-dead-debug-info: Strip debug info for unused symbols
        -strip-dead-prototypes: Strip Unused Function Prototypes
        -strip-debug-declare: Strip all llvm.dbg.declare intrinsics
        -strip-nondebug: Strip all symbols, except dbg symbols, from a module
        -tailcallelim: Tail Call Elimination
    Utility Passes
        -deadarghaX0r: Dead Argument Hacking (BUGPOINT USE ONLY; DO NOT USE)
        -extract-blocks: Extract Basic Blocks From Module (for bugpoint use)
        -instnamer: Assign names to anonymous instructions
        -verify: Module Verifier
        -view-cfg: View CFG of function
        -view-cfg-only: View CFG of function (with no function bodies)
        -view-dom: View dominance tree of function
        -view-dom-only: View dominance tree of function (with no function bodies)
        -view-postdom: View postdominance tree of function
        -view-postdom-only: View postdominance tree of function (with no function bodies)
        -transform-warning: Report missed forced transformations
Passes的源码地位

下面的目次展示了AnalysisTransformUtility的重要Passes,我们将鄙人一节中详细阐述。这些Passes的源代码位于llvm-8.0.0.src/lib目次下:

:~/llvm-8.0.0.src/lib$ ls
Analysis      Bitcode         DebugInfo        Fuzzer      IRReader    LLVMBuild.txt  MCA         Option      ProfileData  Target   ToolDrivers      XRay
AsmParser     CMakeLists.txt  Demangle         FuzzMutate  LineEditor  LTO            Object      OptRemarks  Support      Testing  Transforms
BinaryFormat  CodeGen         ExecutionEngine  IR          Linker      MC             ObjectYAML  Passes      TableGen     TextAPI  WindowsManifest

:~/llvm-8.0.0.src/lib$ tree -NCfhl |grep -i instcount
│   ├── [2.4K]  ./Analysis/InstCount.cpp
优化级别应用的内置Passes

上一节中我们还提到了,可以经过过程运转以下敕令来检查每个优化程度启用的Passes的开关:

 

$ llvm-as < /dev/null | opt -O3 -disable-output -debug-pass=Arguments

PS: llvm-asllvm的编译器,它的输入端是可读的llvm汇编说话,输入llvm字节码,并将其写到文件或许标准输入中去。

 

在我的机械上,-O1跑出来的成果是:

$ ./llvm-as < /dev/null | ./opt -O1 -disable-output -debug-pass=Arguments
...
...
-targetlibinfo -tti -tbaa -scoped-noalias -assumption-cache-tracker -profile-summary-info -forceattrs -inferattrs -ipsccp -called-value-propagation -globalopt -domtree -mem2reg -deadargelim -domtree -basicaa -aa -loops -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -instcombine -simplifycfg -basiccg -globals-aa -prune-eh -always-inline -functionattrs -domtree -sroa -basicaa -aa -memoryssa -early-cse-memssa -speculative-execution -basicaa -aa -lazy-value-info -jump-threading -correlated-propagation -simplifycfg -domtree -basicaa -aa -loops -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -instcombine -libcalls-shrinkwrap -loops -branch-prob -block-freq -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -pgo-memop-opt -basicaa -aa -loops -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -tailcallelim -simplifycfg -reassociate -domtree -loops -loop-simplify -lcssa-verification -lcssa -basicaa -aa -scalar-evolution -loop-rotate -licm -loop-unswitch -simplifycfg -domtree -basicaa -aa -loops -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -instcombine -loop-simplify -lcssa-verification -lcssa -scalar-evolution -indvars -loop-idiom -loop-deletion -loop-unroll -phi-values -memdep -memcpyopt -sccp -demanded-bits -bdce -basicaa -aa -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -instcombine -lazy-value-info -jump-threading -correlated-propagation -basicaa -aa -phi-values -memdep -dse -loops -loop-simplify -lcssa-verification -lcssa -basicaa -aa -scalar-evolution -licm -postdomtree -adce -simplifycfg -domtree -basicaa -aa -loops -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -instcombine -barrier -basiccg -rpo-functionattrs -globalopt -globaldce -basiccg -globals-aa -float2int -domtree -loops -loop-simplify -lcssa-verification -lcssa -basicaa -aa -scalar-evolution -loop-rotate -loop-accesses -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -loop-distribute -branch-prob -block-freq -scalar-evolution -basicaa -aa -loop-accesses -demanded-bits -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -loop-vectorize -loop-simplify -scalar-evolution -aa -loop-accesses -loop-load-elim -basicaa -aa -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -instcombine -simplifycfg -domtree -basicaa -aa -loops -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -instcombine -loop-simplify -lcssa-verification -lcssa -scalar-evolution -loop-unroll -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -instcombine -loop-simplify -lcssa-verification -lcssa -scalar-evolution -licm -alignment-from-assumptions -strip-dead-prototypes -domtree -loops -branch-prob -block-freq -loop-simplify -lcssa-verification -lcssa -basicaa -aa -scalar-evolution -branch-prob -block-freq -loop-sink -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -instsimplify -div-rem-pairs -simplifycfg -verify
...
...

 

这外面有个风趣的景象,比如像-instcombile这个优化,在敕令行中出现了屡次(精确来讲是八次),它是用来干吗的呢?-instcombileinstruction combining的简称,字面意思就是指令绑定,是指将一系列指令用加倍精简的效力更高的指令来代替,成果却保持雷同。这个就有点俄罗斯方块的感到,有时辰这一轮优化的成果,就是下一轮优化的条件,所以可以停止屡次优化。

 

这些Passes,都是llvm内置的Passes

完全版目次简介

 

 

 

 

 

更多内容,尽在feicong@llvm知识星球!

 

 

或许迎接加我的微信(ID:fe1c0ng)或微博(id:非虫)



[推荐]看雪企服平台,供给安然分析、定制项目开辟、APP等级保护、渗透渗出测试等安然办事!

上一主题 下一主题
最新答复 (9)
清纯小酱油 2019-5-13 21:52
2
0
到此一游
sxpp 1 2019-5-13 22:12
3
0
中文书本 PDF或许PPT有吗?哪里买
lcdxsun 1 2019-5-14 00:24
4
0
火前留名
yy虫子yy 2019-5-14 02:00
5
0
途经留名
Editor 2019-5-14 09:09
6
0
顶一下
Lupinus 2019-5-14 09:59
7
0
星球显示,9月21号就到期了,如今上车是否是有点晚
xxRea 2019-5-14 12:30
8
0
mark,大年夜佬的好文章
nekaxi 2019-5-14 12:55
9
0
有没有小先生都能看得懂的编译道理?中国没有本身的CPU、编译器、操作体系,一切都是本外货。。。
最后于 2019-5-14 12:58 被nekaxi编辑 ,缘由:
kongfubull 2019-5-15 22:05
10
0
舍不得花钱听课,虫哥就放出来了,太好了
旅客
登录 | 注册 方可回帖
前往