LLVM学习笔记----clang、llvm-as、llvm-dis、llc、 llvm-link、lli
写在前面:有哪些无法理解请结合下方链接共同参看。对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对象生成retain
和release
的调用-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相关推荐
- 我的LLVM学习笔记——OLLVM混淆研究之FLA篇
因为要做代码保护,所以抽时间研究了下OLLVM中的三种保护方案:BCF(Bogus Control Flow,中文名虚假控制流).FLA(Control Flow Flattening,中文名控制流平 ...
- LLVM学习笔记(43-2)
V7.0的变化 V7.0的 SubtargetEmitter::EmitProcessorModels()改写颇多,因为对处理器的描述进行了相当程度的增强. 1344 void SubtargetE ...
- LLVM学习笔记(43)
3.6.2.5. 输出代码与数据结构 3.6.2.5.1. 资源使用与时延 SchedTables保存在WriteProcResources,WriteLatencies,ReadAdvanceEnt ...
- LLVM学习笔记(16)
3.4.2.4. PatFrag的处理 3.4.2.4.1. 模式树的构建 PatFrag是一个可重用的构件,TableGen会在PatFrag出现的地方展开其定义,有点像C/C++中的宏.为此,Co ...
- llvm学习笔记(2)
2. LLVM的后端描述 2.1. 类型描述 为了更好地描述寄存器所能支持的值类型(大小),以及操作数的类型(大小),Tablegen在ValueTypes.td里给出了一系列的类型定义,它们都继承自 ...
- LLVM学习笔记(51)
3.10. X86折叠表的生成(v7.0) 指令折叠是在寄存器分配过程中执行的优化,目的是删除不必要的拷贝指令.例如,这样的一组指令: %EBX = LOAD %mem_address %EAX = ...
- 【从零开始学深度学习编译器】十五,MLIR Toy Tutorials学习笔记之Lowering到LLVM IR
0x0. 前言 在上一节中,我们将Toy Dialect的部分Operation Lowering到Affine Dialect,MemRef Dialect和Standard Dialect,而to ...
- LLVM学习总结与OLLVM项目分析
学习了一段时间的LLVM后,难免需要对其做一个总结,同时准备下一阶段的学习工作--基于LLVM自定制代码混淆器.在此只记录学习内容,不表达实现方式. LLVM.clang.IR概述 对于LLVM,个人 ...
- LLVM框架/LLVM编译流程/Clang前端/LLVM IR/LLVM应用与实践-李明杰-专题视频课程
LLVM框架/LLVM编译流程/Clang前端/LLVM IR/LLVM应用与实践-3人已学习 课程介绍 LLVM并非仅仅是一款编译器这么简单.利用LLVM,我们可以进行各种疯狂的操作 ...
- LLVM学习入门(3):生成 LLVM 中间代码 IR
生成 LLVM 中间代码 IR 3.1 Code Generation Setup 中间代码生成配置 3.2 Expression Code Generation 表达式代码生成 3.3 Functi ...
最新文章
- spring-mvc springboot 使用MockMvc对controller进行测试
- 使用 JavaScriptService 在.NET Core 里实现DES加密算法
- python 16bit转8bit的工具_利用python读取YUV文件 转RGB 8bit/10bit通用
- 51Nod - 1183 编辑距离
- qt自定义行编辑器,用来加载颜色
- 人民邮电出版社与作者陈黎夫共同举办在线编辑、作者交流活动
- 百度网盘svip下载时显示下载请求中无下载速度
- GdiPlus[34]: IGPGraphicsPath (一)
- oracle通信通道的文件结尾_oracle里执行full join 报通信通道的文件结尾问题
- Hadoop3.1.3搭建集群
- 计算机系统日期修改吗,电脑系统时间如何修改,教你电脑系统时间如何修改
- matlab算kappa系数,[转载]Kappa系数的计算及应用
- 由企业证书打包的app--提示证书不受信任的解决途径
- mac ios 远程桌面连接到服务器配置,手把手教你苹果mac如何远程桌面连接
- 动态规划-击爆气球 Burst Balloons
- Craps 赌博游戏 含押注
- FFT 快速傅里叶变换 初探
- Android 之Google认证GMS详细解剖
- 评分卡模型开发(十)--总体流程
- PS进阶篇——如何PS软件钢笔工具抠图(三)
热门文章
- 计算机在段前加项目符号,word中给段落添加项目符号的方法
- gitlab服务: kex_exchange_identification: Connection closed by remote host
- 遗传算法pid matlab程序解释,关于遗传算法的pid整定问题
- html+css+js实现星空特效
- windows11常用快捷键
- GitHub上万星:超精细的漫画上色AI,老婆画风任你选择,登上了趋势榜
- 计算机毕业设计基于ssh学生请假管理系统
- KW代码检查规则-RLK.JNDI
- 历时七天,史上最强MySQL优化总结,从此优化So Easy!
- 20190826——python对象实例搬家具