当前位置:网站首页>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
边栏推荐
猜你喜欢
随机推荐
科创知识年度盛会,中国科创者大会8月6日首场开幕!
浏览器报错数字代表的大概意思
Tornado framework routing system introduction and (IOloop.current().start()) start source code analysis
Ffmpeg交叉编译
DataX 的使用
C语言初级—数组元素的增删改查
LLVM系列第十九章:写一个简单的Module Pass
MySQL知识总结 (十一) MySql 日志,数据备份,数据恢复
利用c语言实现对键盘输入的一串字符的各类字符的计数
Scala学习总结
binlog与iptables防nmap扫描
Ehcache基础学习
spark写sql的方式
[ROS] (02) Create & compile ROS package Package
华为防火墙
spark中RDD与DF的关系
函数递归和动态内存初识
C语言一维数组练习——将一个字符串中的某个字符替换成其它字符
Visual studio代码中有红色波浪线解决办法
两个surfaceview的重叠效果类似直播效果中的视频和讲义实践