写在前面:有哪些无法理解请结合下方链接共同参看。对LLVM的认识与理解(LLVM与传统编译器对比)_What’sman 的博客-CSDN博客基础概念LLVM(Lower Level Virtual Machine):是一个编译器(编译器就是把人类可读的高级语言映射到机器执行码)基础框架、是模块化和可重用的编译器和工具链技术的集合。LLVM的代码有 3种表示形式:内存编译器中的IR(intermediate representation 中间代码)、存于磁盘的bitcode(也称为字节码——bytecode,由两部分组成:位流bitstream,可类比字节流,以及将 LLVM IR 编码成位流的编码格式。),以及用户可读的汇编码。..https://blog.csdn.net/weixin_42492218/article/details/121203965?spm=1001.2014.3001.5501

clang

解释:Clang只是一个编译器前端,其将C类语言编译成一种“汇编语言(LLVM的中间语言IR)”。接着,通过LLVM(Low Level Virtual Machine)作为后端,将这种“汇编语言”编译成针对不同机器的二进制机器语言。

作用:Clang 能够作为预处理器、编译器驱动、前端以及代码生成器使用,它的输出取决于你指定的参数。

示例:$ clang -emit-llvm -S multiply.c -o multiply.ll

代码解释:​ -emit-llvm 使用LLVM描述汇编和对象文件。

-S 只运行预处理和编译步骤

 -o (filename)输出到目标文件

更多命令选项:

  • -c
    只运行预处理,编译和汇编步骤

  • -E

    运行预处理

  • -fsyntax-only
    防止编译器生成代码,只是语法级别的说明和修改

  • -cc1

    只运行编译器前端

  • -Xclang <arg>
    clang编译器传递参数

  • -dump-tokens
    运行预处理器,拆分内部代码段为各种token

  • -ast-dump
    构建抽象语法树AST,然后对其进行拆解和调试

  • -fobjc-arc
    为OC对象生成retainrelease的调用

  • -fmodules
    允许modules的语言特性

llvm-as

解释:llvm-as 即是 LLVM 的汇编器。它会将 LLVM IR 转为 LLVM bitcode(就像把普通的汇编码
转成可执行文件)。它以LLVM IR作为输入以.bc文件作为输出。LLVM bitcode (也称为字节码——bytecode)由两部分组成:位流(bitstream,可类比字节流),以及将 LLVM IR 编码成位流的编码格式。

作用:把 LLVM IR转换为.bc文件。

示例:$ llvm-as test.ll –o test.bc

代码解释: -o (filename)输出到目标文件

更多命令选项:

  • -f

    在终端上启用二进制输出。通常,如果输出流是终端,llvm-as将拒绝写入原始bitcode输出。使用此选项,无论输出设备如何, llvm-as都将写入原始bitcode。

  • -help

    打印命令行选项的摘要。

退出状态

如果llvm-as成功,它将以0退出。否则,如果发生错误,它将以非零值退出。

llvm-dis

解释:llvm-dis命令即是LLVM反汇编器,它使用LLVM bitcode文件作为输入,输出LLVM
IR。

作用:把 .bc文件转换为LLVM IR。

示例:$ llvm-dis test.bc –o test.ll

代码解释: -o (filename)输出到目标文件

更多命令选项:

退出状态

如果llvm-dis成功,它将以0退出。否则,如果发生错误,它将以非零值退出。

llc

  • -f

    在终端上启用二进制输出。通常,如果输出流是终端,llvm-dis将拒绝写入原始bitcode输出。使用此选项,无论输出设备如何, llvm-dis都将写入原始bitcode。

  • -help

    打印命令行选项的摘要。

解释:llc 命令把 LLVM 输入编译为特定架构的汇编语言,将 LLVM bitcode 文件转换为目标机器的汇编码。如果我们在之前的命令中没有为其指定任何架构,那么默认生成本机的汇编码,即调用 llc 命令的主机。如果你想更进一步由汇编文件得到可执行文件,你还可以使用汇编器和链接器。

作用:LLVM bitcode 文件转换为目标机器的汇编码。

示例:$ llc test.bc –o test.s

代码解释: -o (filename)输出到目标文件

更多命令选项:

  • -help

    打印命令行选项的摘要。

  • -O=uint

    生成不同优化级别的代码。这些对应于clang的 -O0-O1-O2,和-O3优化所使用的优化级别。

  • -filetype=<output file type>

    指定llc应生成哪种输出。选项包括:asm 用于文本汇编('.s'),obj用于本机对象文件('.o')和null用于不发出任何内容(用于性能测试)。请注意,并非所有目标都支持所有选项。

  • –frame-pointer

    指定帧指针消除优化的效果(全部,非叶子,无)

  • –disable-excess-fp-precision

    禁用可能会为浮点生成过多精度的优化。请注意,此选项可以显着减慢某些系统(例如X86)上的代码。

  • –enable-no-infs-fp-math

    启用不包含Inf值的优化。

  • –enable-no-nans-fp-math

    启用不采用NAN值的优化。

  • –enable-unsafe-fp-math

    启用对IEEE数学做出不安全假设的优化(例如,该添加是关联的),或者可能不适用于所有输入范围。这些优化允许代码生成器使用一些原本不可用的指令(例如fsin在X86上)。

  • –stats

    打印由代码生成通行证记录的统计信息。

  • –time-passes

    记录每次传递所需的时间并将报告输出到标准错误。

  • –load=dso_path

    动态加载dso_path(实现动态共享对象的路径),实现LLVM目标。这将允许目标名称与-march选项一起使用,以便可以为该目标生成代码。

  • -stack-size-section

    发出包含堆栈大小元数据的.stack_sizes部分。该部分包含一对函数符号值(指针大小)和堆栈大小(无符号LEB128)。堆栈大小值仅包括在函数序言中分配的空间。不包括具有动态堆栈分配的函数。

  • -remarks-section

    发出.remarks(ELF)/__remarks(MachO)部分,其中包含有关备注诊断的元数据。

  • –print-machineinstrs

    在编译阶段之间打印生成的机器代码(对调试很有用)。

  • –regalloc=allocator

    指定要使用的寄存器分配器。有效的寄存器分配器是:

    • basic:基本寄存器分配器。
    • fast:快速寄存器分配器。它是未优化代码的默认值。
    • greedy:贪婪的注册分配器。它是优化代码的默认值。
    • pbqp:基于”分区布尔二次规划”的寄存器分配器。

详情请参考-help选项,不过多赘述

退出状态

如果llc成功,它将以0退出。否则,如果发生错误,它将以非零值退出。

llvm-link

解释:把生成的.bc 文件变成一个单一的包含了所有所需引用的bitcode 文件即链接.bc 文件。llvm-link 工具的功能和传统的链接器一致:如果一个函数或者变量在一个文件中被引用,却在另一个文件中定义,那么链接器就会解析这个文件中引用的符号。但和传统的链接器不同,llvm-link 不会链接 Object 文件生成一个二进制文件,它只链接 bitcode 文件。

作用:对.bc文件做链接。

示例:$ llvm-link test1.bc test2.bc –o output.bc

代码解释: -o (filename)输出到目标文件

更多命令选项:

  • -f

    在终端上启用二进制输出。通常,如果输出流是终端,llvm-link将拒绝写入原始bitcode输出。使用此选项,无论输出设备如何,llvm-link都将写入原始bitcode。

  • -S

        输出LLVM中间语言(而不是bitcode)。

  • -help

打印命令行选项的摘要。

  • -d

        lvm-link将输出bitcode文件的人类可读版本到标准错误文件。

  • -v

        详细模式。打印有关llvm-link正在执行的操作的信息。这通常包括为每个找到的库链接的每个          bitcode文件的消息。

退出状态

如果llvm-link成功,它将以0退出。否则,如果发生错误,它将以非零值退出。

lli

解释:lli 工具命令执行 LLVM bitcode 格式程序,它使用 LLVM bitcode 格式作为输入并且
使用即时编译器(JIT)执行。当然,如果当前的架构不存在 JIT 编译器,会用解释器执行。
如果 lli 能够采用 JIT 编译器,那么它能高效地使用所有代码生成器参数,如 llc。

作用:执行.bc文件。

示例:$ lli output.bc

退出状态

如果lli无法加载程序,它将以退出代码1退出。否则,它将返回它执行的程序的退出代码。

LLVM学习笔记----clang、llvm-as、llvm-dis、llc、 llvm-link、lli相关推荐

  1. 我的LLVM学习笔记——OLLVM混淆研究之FLA篇

    因为要做代码保护,所以抽时间研究了下OLLVM中的三种保护方案:BCF(Bogus Control Flow,中文名虚假控制流).FLA(Control Flow Flattening,中文名控制流平 ...

  2. LLVM学习笔记(43-2)

    V7.0的变化 V7.0的 SubtargetEmitter::EmitProcessorModels()改写颇多,因为对处理器的描述进行了相当程度的增强. 1344  void SubtargetE ...

  3. LLVM学习笔记(43)

    3.6.2.5. 输出代码与数据结构 3.6.2.5.1. 资源使用与时延 SchedTables保存在WriteProcResources,WriteLatencies,ReadAdvanceEnt ...

  4. LLVM学习笔记(16)

    3.4.2.4. PatFrag的处理 3.4.2.4.1. 模式树的构建 PatFrag是一个可重用的构件,TableGen会在PatFrag出现的地方展开其定义,有点像C/C++中的宏.为此,Co ...

  5. llvm学习笔记(2)

    2. LLVM的后端描述 2.1. 类型描述 为了更好地描述寄存器所能支持的值类型(大小),以及操作数的类型(大小),Tablegen在ValueTypes.td里给出了一系列的类型定义,它们都继承自 ...

  6. LLVM学习笔记(51)

    3.10. X86折叠表的生成(v7.0) 指令折叠是在寄存器分配过程中执行的优化,目的是删除不必要的拷贝指令.例如,这样的一组指令: %EBX = LOAD %mem_address %EAX = ...

  7. 【从零开始学深度学习编译器】十五,MLIR Toy Tutorials学习笔记之Lowering到LLVM IR

    0x0. 前言 在上一节中,我们将Toy Dialect的部分Operation Lowering到Affine Dialect,MemRef Dialect和Standard Dialect,而to ...

  8. LLVM学习总结与OLLVM项目分析

    学习了一段时间的LLVM后,难免需要对其做一个总结,同时准备下一阶段的学习工作--基于LLVM自定制代码混淆器.在此只记录学习内容,不表达实现方式. LLVM.clang.IR概述 对于LLVM,个人 ...

  9. LLVM框架/LLVM编译流程/Clang前端/LLVM IR/LLVM应用与实践-李明杰-专题视频课程

    LLVM框架/LLVM编译流程/Clang前端/LLVM IR/LLVM应用与实践-3人已学习 课程介绍         LLVM并非仅仅是一款编译器这么简单.利用LLVM,我们可以进行各种疯狂的操作 ...

  10. LLVM学习入门(3):生成 LLVM 中间代码 IR

    生成 LLVM 中间代码 IR 3.1 Code Generation Setup 中间代码生成配置 3.2 Expression Code Generation 表达式代码生成 3.3 Functi ...

最新文章

  1. spring-mvc springboot 使用MockMvc对controller进行测试
  2. 使用 JavaScriptService 在.NET Core 里实现DES加密算法
  3. python 16bit转8bit的工具_利用python读取YUV文件 转RGB 8bit/10bit通用
  4. 51Nod - 1183 编辑距离
  5. qt自定义行编辑器,用来加载颜色
  6. 人民邮电出版社与作者陈黎夫共同举办在线编辑、作者交流活动
  7. 百度网盘svip下载时显示下载请求中无下载速度
  8. GdiPlus[34]: IGPGraphicsPath (一)
  9. oracle通信通道的文件结尾_oracle里执行full join 报通信通道的文件结尾问题
  10. Hadoop3.1.3搭建集群
  11. 计算机系统日期修改吗,电脑系统时间如何修改,教你电脑系统时间如何修改
  12. matlab算kappa系数,[转载]Kappa系数的计算及应用
  13. 由企业证书打包的app--提示证书不受信任的解决途径
  14. mac ios 远程桌面连接到服务器配置,手把手教你苹果mac如何远程桌面连接
  15. 动态规划-击爆气球 Burst Balloons
  16. Craps 赌博游戏 含押注
  17. FFT 快速傅里叶变换 初探
  18. Android 之Google认证GMS详细解剖
  19. 评分卡模型开发(十)--总体流程
  20. PS进阶篇——如何PS软件钢笔工具抠图(三)

热门文章

  1. 计算机在段前加项目符号,word中给段落添加项目符号的方法
  2. gitlab服务: kex_exchange_identification: Connection closed by remote host
  3. 遗传算法pid matlab程序解释,关于遗传算法的pid整定问题
  4. html+css+js实现星空特效
  5. windows11常用快捷键
  6. GitHub上万星:超精细的漫画上色AI,老婆画风任你选择,登上了趋势榜
  7. 计算机毕业设计基于ssh学生请假管理系统
  8. KW代码检查规则-RLK.JNDI
  9. 历时七天,史上最强MySQL优化总结,从此优化So Easy!
  10. 20190826——python对象实例搬家具