1.LLVM(MLIR)安装编译
2.解密数据仓库LLVM技术神奇之处
3.Obfuscator-llvm源码分析
4.LLVM源码编译及调试
5.[Dev] Xcode的源码记录
6.对比Unmatched上GCC和LLVM的SPEC CPU2017的性能差异
LLVM(MLIR)安装编译
本文旨在为有兴趣自行安装和编译 LLVM(利用 MLIR 作为后端输出的主要方式)的读者提供一份详细指南。在实际操作过程中,行数可能会遇到一些理解上的源码偏差,欢迎指正。行数由于目标是源码能在 x 和 RISCV 上运行,所有配置均基于 i7-H 笔记本,行数主图源码录入运行 Ubuntu . LTS 系统。源码
以下是行数编译配置的步骤:
第一步:下载 LLVM 的源码。确保已安装 git,源码若未安装,行数请执行 sudo apt-get install git。源码创建名为 LLVM 的行数文件夹存放 LLVM 源码,并将源码文件夹命名为 llvm-project。源码接着,行数通过 git 下载 LLVM 源码。源码
第二步:建立用于 LLVM 编译的文件夹。为了区分编译产生的文件和源文件,建立名为 build 的文件夹。在教程中,每段代码都以 cd 到主文件夹,然后进入工程文件夹的方式进行,便于理解。
第三步:进入 build 文件夹,完成编译配置。此过程大致分为如何编译、编译什么、为谁编三个部分。具体参数如下:
如何编译:指定编译器类型、线程数及目标地址。例如,使用 -DLLVM_PARALLEL_COMPILE_JOBS=### 设置并行编译工作数,出卷软件源码使用 -DCMAKE_INSTALL_PREFIX=*** 指定安装路径,使用 -DLLVM_CCACHE_BUILD=### 选择是否使用 ccache。选择 C 和 C++ 编译器,如 -DCMAKE_C_COMPILER=### 和 -DCMAKE_CXX_COMPILER=###。启用 LLD 作为链接器以提高效率,可通过 -DLLVM_ENABLE_LLD=ON 实现。
编译什么:设置编译版本类型,如 Debug、Release 等,使用 -DCMAKE_BUILD_TYPE=###。同时,通过 -DLLVM_ENABLE_PROJECTS=### 配置需要编译的子项目。
为谁编:指定目标平台,如 x 和 RISCV,使用 -DLLVM_TARGETS_TO_BUILD=###。可选平台包括但不限于:AArch、AMDGPU、ARM、AVR、BPF、Hexagon 等。
注意:在完成编译配置后,执行编译命令。在遇到可能的问题时,检查错误信息并根据需要调整参数。最后,根据实际需求进行文件路径、编译选项等的调整。
以上步骤和参数配置将帮助您成功安装和编译 LLVM,满足在 x 和 RISCV 上运行的人数统计 源码 opencv需求。通过本文提供的指南,希望能为您的项目开发提供便利。如有任何疑问或需要进一步的帮助,请随时提问。
解密数据仓库LLVM技术神奇之处
LLVM是什么?
LLVM,全名“Low Level Virtual Machine”,最初是指底层虚拟机的概念,但随着项目的演进,其含义已不再局限于底层虚拟机。广义上,LLVM是一个用于开发编译前端与后端的工具套件,包括优化器和后端。而CLANG则是C/C++的编译前端。
LLVM的优势?
传统编译器通常采用三阶段设计:前端解析源代码生成抽象语法树,优化器根据规则优化代码,后端将代码映射至目标指令集。而LLVM同样采用三段式设计,但其显著优势在于为不同语言提供了统一的中间表示IR,以及模块化的后端支持,如MCJIT模块支持JIT编译,灵活性优于传统编译器。
DWS为何使用LLVM?
DWS使用LLVM旨在解决查询优化问题,包括减少冗余计算、避免大量虚函数调用、改善数据调用效率、以及发挥通用硬件平台的扩展指令集功能。通过LLVM的JIT技术,DWS能够生成定制化机器码,优化查询执行过程,例如在物化tuple时,scratch 3.0源码修改提前计算偏移量,减少重复计算和类型判断。
如何使用LLVM?
在DWS中,通过设置两个GUC参数控制LLVM功能:enable_codegen控制是否开启codegen,默认为on;codegen_cost_threshold控制处理行数,默认为行。DWS通过处理行数而非计划代价来决定是否启用codegen。用户可以通过分析LLVM JIT编译时间,调整处理数据行数的门槛值以优化性能。
LLVM适用场景?
LLVM仅支持DN上且为列存向量化执行路径的查询作业,支持特定数据类型和表达式。在查询过滤、连接条件、分组过滤等场景下,LLVM动态编译能显著优化执行效率。但不支持所有算子,仅限于特定类型的数据和操作。用户可通过explain performance工具查看是否适用于LLVM动态编译优化。
LLVM的未来展望?
深入理解LLVM原理及其在DWS中的应用,将有助于优化查询性能和提升数据处理效率。通过合理配置参数和监控编译时间,用户可以进一步优化系统运行。未来,随着技术进步,LLVM将可能支持更多场景和优化方法,进一步提升数据库的处理能力。
Obfuscator-llvm源码分析
在逆向分析中,Obfuscator-llvm是一个备受关注的工具,它通过混淆前端语言生成的中间代码来增强SO文件的安全性。本文主要讲解了Obfuscator-llvm的如何通过源码下载三个核心pass——BogusControlFlow、Flattening和Instruction Substitution,它们在O-llvm-3.6.1版本中的实现。
BogusControlFlow通过添加虚假控制流和垃圾指令来混淆函数,其runOnFunction函数会检查特定参数,如混淆次数和基本块混淆概率。在测试代码中,它会将基本块一分为二,插入随机指令,形成条件跳转,如“1.0 == 1.0”条件下的真跳转和假跳转。
Flattening通过添加switch-case语句使函数结构扁平化,runOnFunction会检查启动标志。在示例代码中,它将基本块分隔,创建switch结构,并根据随机值跳转到不同case,使函数执行流程变得复杂。
Instruction Substitution负责替换特定指令,runOnFunction会检测启动命令,遍历所有指令并随机应用替换策略,如Add指令的多种可能替换方式。
虽然O-llvm提供了一定程度的混淆,但仍有改进空间,比如增加更多的替换规则和更复杂的跳转策略。作者建议,利用O-llvm的开源特性,开发者可以根据需求自定义混淆方法,提高混淆的复杂性和逆向难度。
最后,对于对Obfuscator-llvm感兴趣的读者,可以参考《ollvm的混淆反混淆和定制修改》的文章进一步学习。网易云安全提供的应用加固服务提供了试用机会,对于保护软件安全具有实际价值。
更多关于软件安全和源码分析的内容,欢迎访问网易云社区。
LLVM源码编译及调试
为了深入理解并实现LLVM源码的编译与调试,我们需要分步骤进行,逐一安装相关软件并配置环境。首先,安装cmake,这是构建过程的核心工具。 在Linux环境下,我们可以使用tar命令来下载并解压cmake的安装包。具体的步骤是:访问cmake官网,下载cmake-3..0-rc2-linux-x_.tar.gz。
使用tar命令解压文件:`tar xf cmake-3..0-rc2-linux-x_.tar.gz`。
将解压后的文件移到/usr/share目录,并重命名为cmake-3..0-rc2-linux-x_以方便访问。
创建软连接,将cmake-3..0-rc2-linux-x_/bin/cmake移动到/usr/bin目录,并重命名为cmake,确保它可以被直接调用。
然后,安装ninja,这是构建过程中高效的任务执行工具。使用git克隆ninja的源代码。
运行配置脚本以生成构建文件。
复制ninja到/usr/bin目录。
通过`ninja --version`检查ninja的安装情况。
接下来,安装Python、gcc和g++,这是构建LLVM环境的基本依赖。 之后,安装LLVM。我们可以通过git克隆LLVM项目并进行配置、构建和安装。克隆LLVM项目。
指定版本(例如,基于特定版本)。
切换到项目目录并使用cmake进行配置。
使用预先选择的构建系统(如Ninja)和选项进行构建。
执行构建并使用ninja命令进行编译。
调试LLVM源码涉及查看支持的后端target、使用前端编译器(clang)生成LLVM IR、使用LLVM工具(如llc)进行调试、并使用graphviz生成可视化图表。 在调试过程中,可以使用以下工具:查看各阶段DAG使用llvm-dis。
查看AMDGPU寄存器信息与指令信息使用llvm-tblgen。
通过上述步骤,您可以成功安装并配置LLVM源码的编译环境,并进行有效的调试与分析。[Dev] Xcode的记录
构建过程可以分为预处理(preprocess) -- 编译(build) -- 汇编(assemble) -- 连接(link)这几个大的过程。
LLVM(Low Level Virtual Machine)是强大的编译器开发工具套件,其核心思想是通过生成中间代码IR,分离前后端(前端编译器,后端目标机器码)。这样做的好处是,前端新增编译器,不用再单独去适配目标机器码,只需要生成中间代码,LLVM就可以生成对应的目标机器码。下面就是LLVM的架构。
预处理:头文件引入、宏替换、注释处理、条件编译等操作;
词法分析:读入源文件字符流,组成有意义的词素(lexeme)序列,生成词法单元(token)输出;
语法分析:Token流解析成一颗抽象语法树(AST);
CodeGen:遍历语法树,生成LLVM IR代码,这是前端的输出文件;
汇编:LLVM对IR进行优化,针对不同架构生成不同目标代码,以汇编代码格式输出;
汇编器生成.o文件:将汇编代码转换为机器代码,输出目标文件(object file);
连接器:将目标文件和(.dylib、.a、.tbd、.framework)进行连接,生成可执行mach-o文件。
dwarf:debugging with attribute record formats,一种源码调试信息的记录格式,用于源码级调试;
dSym:debug Symboles,调试符号,即符号表文件。符号对应着类、函数、变量等,是内存与符号如函数名、文件名、行号等的映射,崩溃日志解析非常重要。可以用dwarfdump 命令来查看dwarf调试信息。
DW_AT_low_pc表示函数的起始地址 DW_AT_high_pc表示函数的结束地址 DW_AT_frame_base表示函数的栈帧基址 DW_AT_object_pointer表示对象指针地址 DW_AT_name表示函数的名字 DW_AT_decl_file表示函数所在的文件 DW_AT_decl_line表示函数所在的文件中的行数 DW_AT_prototyped为一个 Bool 值, 为 true 时代表这是一个子程序/函数(subroutine) DW_AT_type表示函数的返回值类型 DW_AT_artificial为一个Bool值,为true时代表这是一个由编译器生成而不是源程序显式声明
使用symbolicatecrash命令行
使用dwarfdump和atos工具
xcode-project-file-format这里对xcodeproj文件格式进行了说明。
xcodeproj文件包含以下元素
总体说明
结合上面的说明,对project.phxproj文件结构进行说明
项目中setting有2处,project和target中都有,那么他们之间的关系是怎样的?
在Xcode中添加代码块步骤
1、选择代码,右键选择 create code snippet,或者在顶部导航,选择Editor-create code snippet;
2、编辑信息和代码即可,其中completion表示输入的快捷方式;
3、需要修改的参数用形式添加 ;
4、所在目录~/Library/Developer/Xcode/UserData/CodeSnippets 。
还需要注意xcshareddata目录下
参考
Xcode build过程中都做了什么 Xcode编译疾如风-3.浅谈 dwarf 和 dSYM iOS崩溃日志解析&原理 - 掘金 LLVM编译流程 & Clang插件开发 8. Xcode 工程文件解析 - 掘金 XCode工程文件结构及Xcodeproj框架的使用( 二 ) XCode: Target Settings和Project Settings的区别 Xcode-项目重命名
对比Unmatched上GCC和LLVM的SPEC CPU的性能差异
最近,SPEC CPU发布了V1.1.9版本,特别针对Linux on RISC-V平台进行了优化,使得用户无需自行构建工具集,只需在联网状态下通过runcpu --update即可完成升级。测试焦点在于GCC和LLVM在Unmatched环境下的SPEC CPU性能对比,使用的GCC版本为.1.0,而LLVM版本则是.0.0。
所有测试都基于源码编译,GCC的分支是riscv-gcc-.1.0,commit ID为b5c,LLVM的分支是main,commit ID为7fdee6e0aaa4adfce3。SPEC CPU的执行命令是标准配置。
比较结果显示,在INT性能测试中,GCC在大部分子项目中略微优于LLVM,仅在x一项中,LLVM稍胜一筹。然而,LLVM在leela子项上未能正常运行,导致这部分结果无法直接对比。
在FP测试中,LLVM遇到问题,其中五个Fortran程序(,,,,,,,,)无法完成,而在FPSPEED性能上,GCC在和子项上表现出显著优势。至于FP性能,LLVM在和子项上超越了GCC。
总结来说,GCC和LLVM在Unmatched上的SPEC CPU性能对比显示,两者在不同测试部分有所优劣,GCC在INT部分总体表现更稳定,而LLVM在FP部分存在一些运行问题。