LLVM - 工具

LLVM - 工具,第1张

LLVM工具通过调用LLVM的一部分库,实现库的功能,通常使用编译器或者开发编译器的人会用到这些工具。早春孝

这是一个在LLVM IR级别做程序优化的工具,输入和输出都是LLVM IR。编译器,或者基于LLVM做优化的开发者通常会使用这一标准工具来查看优化的效果。它也提供了很多option, 可以执行某一特定的pass。

这是微观意义上的LLVM编译器,不同于gcc的编译器,它的输入是LLVM IR,输出是汇编文件或者是目标文件。通过-filetype=asm或者-filetype=obj来指定输出是汇编文件还是目标文件,若生成是目标文件,llc会调用LLVM中的汇编输出的代码库来工作(注意这个汇编器和gcc的汇编器也不同,它输入的是MI,是一种后端的中间表示)。除此之外,还可以用-On来指定优化级别(llc默认优化级别是-O2),或者其他一些参数。

(.bc文件换成.ll文件也可以)

这是LLVM汇编器,它输入汇编文件,输出目标文件, 类似于gnu中的as命令。同陆稿时,它也可以反汇编,指定特殊参数(–disassemble)就行。可以发现,llc和llvm-mc都会调用到输出目标文件的库,也就是MCObjectStreamer。

这个工具是LLVM IR的解释器,也是一个JIT编译器。LLVM可以把C语言翻译成LLVM IR,然后解释执行,与Java的那一套类似,这也是最初LLVM编写时的实现(一个虚拟机运行IR)。

最早看到这个工具,以为是链接器,其实它是IR级别的链接器,链接的是IR文件。谈到这里,可以说一下LLVM针对多个源文件编译时的两种目标码输出方式。

第一种是LLVM先通过前端把每个源文件单独翻译成IR级别,然后用llvm-link链接成一个IR,然后再经过优化、后端等步骤生成目标文件,使用llvm-link的同时,可以使用链接时优化。不过需要注意,这种方式同样需要最终调用链接器,将这个目标文件链接成可执行文件。

第二种是LLVM通过前端把每个源文件单独翻译后,再单独经过优化、后端等工作,将每个源文件生成目标文件,之后再调用链接器,将所有目标文件链接成可执行文件。

这是针对LLVM IR的汇编器,其实名字里带as,实际上不是gcc那个as,它的功能是将.ll文件翻译为.bc文件,LLVM项目里,.ll称为LLVM汇编码,所以llvm-as也就是IR的汇编器了。

与llvm-as刚好相反,IR的反汇编器,用来将.bc文件翻译为.ll文件。

最后也提一下clang,它也是现在LLVM项目中一个很重要的前端工具。clang能够调用整个编译器的流程,也就是上边其他工具调用的库,它很多都同样会调用。clang通过指定-emit-llvm参数,可以配合-S或-c生成.ll或森困.bc文件,这样我们就能把Clang的部分和LLVM的后端分离开来独立运行,对于观察编译器流程来说,很实用。

还有一些其他工具,就不举例了,可以查看LLVM项目路径下/src/tools/中查看。

BC!是BT在硬盘中储存的没有下载完成的文件所用的一种默认格式。

打开尺坦方式:

一、等待下载完成

二、如果下载未完成,如果是视频或音频,一般50%以上的下载可以通过stormvideo或real(要安装插件版本)播放,但由于文件的数据字符串不完整,无法完全播放,只能播放一部分。

具体数量取决于您下载的文件格式。如果是文本内容,一半的电子阅读器应该可以打开。

扩展资料:

判断.bt文件原本格式和扩展解决方陵轿桐案:

1、如果用的是比特彗星(一种BT下载工具),它在下载文件时,会自制动在文件后添加.bc为后缀名。

2、比如,下载的文件名为abc.mp3,那么比特彗星会将文件名创建为abc.mp3.bc。文件下载完毕后,比特彗星帆绝会自动删除bc后缀,将文件重命名为abc.mp3

3、通过文件命名规则可以知道,假设你下载的如果是视频或是音频的话,一般下载超过50%的都可以通过暴风影音或是real(要装插件)播放,但是由于文zd件的数据串不完整所以不能完整的播放,只能播放一部分,具体能看多少要看下载的文件格式了。

[TOC]

Impala 使用的 LLVM JIT,首先通过 Clang 将源码编译成了 LLVM IR 文件,然后通过脚本将 IR 文件装成可加载的二进制文件,BE 进程在运行过程中,通过 LLVM 的加载接口,把二进制文件加载进来使用。

待编译的文件通过codegen/ impala-ir.cpp 指定

impala-ir.cpp 文件主要的作用就是把需芹睁要产生 LLVM IR 的文件包含进来。

确定了哪些文件需要孝扮产生 LLVM IR 之后,就开始生成 IR 的二进制文件了。巧首灶大致流程如下:

这个阶段生成最初始的bc文件,使用的是 CLang 的编译工具。命令可见codegen/CMakeFiles.txt

生成的结果是 impala-sse-tmp.bc 文件。

使用LLVM 优化工具,对原始的 bc 文件进行优化。命令可见codegen/CMakeFiles.txt

生成的结果就是impala-sse.bc。

这一步使用的是Impala 自定义的一个脚本 file2array.sh ,将优化后的 bc 文件转换为可加载的二进制c 文件。命令可见codegen/CMakeFiles.txt。

生成的结果是impala-sse-ir.cc。这个文件内部就是用一个数组存放二进制的值。

be 进程就是通过读取 impala_sse_llvm_ir 数组,把 LLVM IR加载到进程中。

file2array.sh 脚本其实就是使用 xxd -i <impala-sse-ir.cc 命令把bc 文件内容转成 c 语言的二进制形式。

LlvmCodeGen 类通过 CreateImpalaCodegen 接口实例化 codegen 对象。 CreateImpalaCodegen 最终会调用 CreateFromMemory ,在 CreateFromMemory 中就是将上文中生成的 impala_sse_llvm_ir 数组通过 LLVM 接口加载进来。

完成加载后,就可以通过 GetFunction 获取指定的 IR 函数了。

所有的函数名及描述,定义在 impala-ir-names.h 和 impala-ir-functions.h ,这两个文件是有对应关系的,都是通过gen_ir_descriptions.py生成。

impala-ir-names.h 定义了数组 FN_MAPPINGS ,存储函数名和枚举值的映射关系,如下:

impala-ir-functions.h定义了所有函数的枚举值,如下:

通过 GetFunction 获取函数的时候,因为有了 FN_MAPPINGS 存储的映射关系,可以通过传入枚举值或者字符串符号查找函数。

在 InitializeLlvm 方法中会使用 FN_MAPPINGS ,对加载的 llvm 函数进行校验。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12276174.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存