当前位置:网站首页>LLVM系列第二十四章:用Xcode编译调试LLVM源码
LLVM系列第二十四章:用Xcode编译调试LLVM源码
2022-08-02 14:07:00 【飞翼剑仆】
系列文章目录
LLVM系列第一章:编译LLVM源码
LLVM系列第二章:模块Module
LLVM系列第三章:函数Function
LLVM系列第四章:逻辑代码块Block
LLVM系列第五章:全局变量Global Variable
LLVM系列第六章:函数返回值Return
LLVM系列第七章:函数参数Function Arguments
LLVM系列第八章:算术运算语句Arithmetic Statement
LLVM系列第九章:控制流语句if-else
LLVM系列第十章:控制流语句if-else-phi
LLVM系列第十一章:写一个Hello World
LLVM系列第十二章:写一个简单的词法分析器Lexer
LLVM系列第十三章:写一个简单的语法分析器Parser
LLVM系列第十四章:写一个简单的语义分析器Semantic Analyzer
LLVM系列第十五章:写一个简单的中间代码生成器IR Generator
LLVM系列第十六章:写一个简单的编译器
LLVM系列第十七章:for循环
LLVM系列第十八章:写一个简单的IR处理流程Pass
LLVM系列第十九章:写一个简单的Module Pass
LLVM系列第二十章:写一个简单的Function Pass
LLVM系列第二十一章:写一个简单的Loop Pass
LLVM系列第二十二章:写一个简单的编译时函数调用统计器(Pass)
LLVM系列第二十三章:写一个简单的运行时函数调用统计器(Pass)
LLVM系列第二十四章:用Xcode编译调试LLVM源码
LLVM系列第二十五章:简单统计一下LLVM源码行数
前言
在此,记录下用Xcode编译LLVM源码的过程,以备查阅。
开发环境的配置请参考第一章 《LLVM系列第一章:编译LLVM源码》。
我们在第一章中编译LLVM源码时,使用的工具是Ninja,本章用的工具是Xcode。环境配置和编译的过程与第一章是差不多的。
一、编译
编译环境配置(如配置操作系统、安装源代码管理工具、下载源代码等)的步骤与第一章类似,这里就不再赘述。本章的重点是如何生成Xcode项目文件并进行编译。
1. 生成项目
使用命令如下(示例):
cd llvm-project/llvm
mkdir build-xcode
cd build-xcode
cmake -G Xcode -DCMAKE_BUILD_TYPE="Debug" ..
生成的Xcode项目文件在目录build-xcode中,我们进入该目录并用Xcode打开项目文件LLVM.xcodeproj即可。
2. 编译
用Xcode打开LLVM.xcodeproj项目之后,可以看到很多编译目标(Target)。为简单起见,这里我们就选opt进行编译。用快捷键"Cmd + B",或者菜单"Product > Build"即可启动编译。编译过程比较耗时,大概需要1个小时左右。
3. 测试
opt是一个可执行程序,所以我们直接运行它即可。不过,在默认情况下,它没有任何输入,所以也就没有输出。
我们先给它添加点有意义的输入数据。可以把前面章节写的最简单的MyPass来当做输入数据传给opt程序。在Xcode中,可以利用Scheme编辑器来配置程序的输入数据。在Xcode菜单中,点击"Product > Scheme > Edit Scheme",即可打开Scheme编辑器(即对话框)进行配置:
注意,在配置之前,须确保选中了opt作为编译目标,即我们编辑的是opt程序的Scheme。可以从上面截图看到,我们为opt程序输入了以下数据(即opt的命令行参数):
--debug
-load-pass-plugin=lib/MyPass.dylib
-passes="my-pass"
-disable-output
/path/to/llvm-project/llvm/lib/Transforms/MyPass/Tests/Test.ll
点击“运行”按钮(或"Cmd + R"),即可运行、调试opt程序。我们在函数"MyPass::run()"中打个断点,即可看到以下调用栈(call stack):
总结
我们利用Xcode编译了LLVM的源代码,并用opt作为例子,简单地调试了一下与LLVM Pass相关的代码。
本章用到的MyPass的完整源码示例请参看:
https://github.com/wuzhanglin/llvm-pass-examples
边栏推荐
- 华为防火墙
- Tornado framework routing system introduction and (IOloop.current().start()) start source code analysis
- 一文带你快速掌握Kotlin核心技能
- Scala学习总结
- 浮点数的运算方法
- C语言一维数组练习——将一个字符串中的某个字符替换成其它字符
- HBuilderX 核心插件安装提示:“插件XXX下载失败,请检查网络”问题的解决办法
- OpenCart迁移到其他服务器
- C语言初级—用一角,两角,五角和一元组成3.5元有多少种组合方法
- IllegalStateException: Room cannot verify the data integrity. Looks like you've changed schema but
猜你喜欢
随机推荐
C语言日记 3 常量
In the Visual studio code solutions have red wavy lines
自定义UDF函数
Flink-独立集群/Yarn
VS Code远程开发及免密配置
6.如何使用CardView制作卡片布局效果
C语言sizeof和strlen的区别
MySQL知识总结 (六) MySQL调优
使用flutter小记
科创知识年度盛会,中国科创者大会8月6日首场开幕!
Ehcache基础学习
mysql
Kubernetes核心概念
C语言日记 4 变量
IllegalStateException: Room cannot verify the data integrity. Looks like you've changed schema but
LLVM系列第十九章:写一个简单的Module Pass
C语言初级—用一角,两角,五角和一元组成3.5元有多少种组合方法
无人驾驶综述:摘要
spark写sql的方式
ThinkPHP5.0内置分页函数Paginate无法获取POST页数问题的解决办法