王顺洪 刘硕
以fib_gen.cpp生成斐波那契数为例,该程序调用LLVM API产生LLVM IR。
执行
g++ fib_gen.cpp -o fib_gen `llvm-config --cxxflags --ldflags --libs --system-libs`
将目标程序编译成可执行文件fib_gen
。
然后对fib_gen
进行调试
gdb fib_gen
对fib_gen中调用的API,如对Line 28的new Module("fib", context)
,设置断点为b Module.cpp :78
即可设置断点。
如果用这种调试,需要手动在目标程序里面调用LLVM的优化pass才可以对pass进行调试。
以hello.ll代码为例,该代码由clang编译产生。
进入gdb调试opt
gdb opt
添加参数,这里以调用死代码删除为例
set args hello.ll -dce -S
在死代码删除对应的DCE.cpp
文件中添加断点
b DCE.cpp:<line_number>
如果不清楚会调用哪个函数,可以使用rbreak
命令对所有函数加上断点
rbreak DCE.cpp:.
然后执行,即可对该优化pass进行调试
参考博客
这种调试方法需要用到clang,调用链比较长,调试起来比较慢