激活LLVM的DEBUG()宏

DEBUG()宏介绍

当你正在开发一个LLVM Pass时,通常会添加大量的打印和其他代码用于调试。当Pass完工后,你本想移除它们,但要考虑到将来

可能还需用到(如调试新的bug)。

因此,你自然不想删除这些打印代码,也不想它们总是跳出来影响你的心情。一种解决方案是使用注释。当你需要它们时打开注释,

当你厌倦它们时再注释掉。

 

llvm提供了一个更好的解决方案,那就是DEBUG()宏。

通常,你可以给DEBUG()宏传递任意代码作为参数,这些代码呢,只会在llvm-opt(或则其它工具)携带"-debug"命令行参数时才会执行。

例如,

DEBUG(errs() << "I am here!\n");

你可以想下面那样运行Pass:

$ opt < a.bc > /dev/null -mypass
<no output>
$ opt < a.bc > /dev/null -mypass -debug
I am here!

DEBUG()宏定义在源文件llvm/Support/Debug.h中。

注意:如果编译LLVM Pass时打开了优化开关(明确来说,是定义了NDEBUG宏),则DEBUG()宏是禁用的。以它们免影响性能。

DEBUG()宏还有一个好处,就是可以在gdb中直接使能或者禁用。 用gdb将应用程序调起来后,使用"set DebugFlag=1"或者"set DebugFlag=0"来实现。

 

获得更好的体验

有时如果只携带"-debug"命令行参数,打印日志可能太多了(例如code generator),你可以通过定义 DEBUG_TYPE 宏来获取更多的控制权。

例如按如下方式定义 DEBUG_TYPE 宏,

#undef  DEBUG_TYPE
DEBUG(errs() << "No debug type\n");
#define DEBUG_TYPE "foo"
DEBUG(errs() << "'foo' debug type\n");
#undef  DEBUG_TYPE
#define DEBUG_TYPE "bar"
DEBUG(errs() << "'bar' debug type\n"));
#undef  DEBUG_TYPE
#define DEBUG_TYPE ""
DEBUG(errs() << "No debug type (2)\n");

接着按如下方式执行Pass,

$ opt < a.bc > /dev/null -mypass
<no output>
$ opt < a.bc > /dev/null -mypass -debug
No debug type
'foo' debug type
'bar' debug type
No debug type (2)
$ opt < a.bc > /dev/null -mypass -debug-only=foo
'foo' debug type
$ opt < a.bc > /dev/null -mypass -debug-only=bar
'bar' debug type

当然,在实践中你应当在源文件头部设定DEBUG_TYPE宏。作为默认值,归本文件的DEBUG()宏使用。

可以使用DEBUG_WITH_TYPE()宏来为单条调试语句特别指定DEBUG_TYPE值。

例如,

DEBUG_WITH_TYPE("", errs() << "No debug type\n");
DEBUG_WITH_TYPE("foo", errs() << "'foo' debug type\n");
DEBUG_WITH_TYPE("bar", errs() << "'bar' debug type\n"));
DEBUG_WITH_TYPE("", errs() << "No debug type (2)\n");

 

在clang调试时使能LLVM的DEBUG()宏

命令行选项为:

-mllvm -debug

-mllvm -debug-only=<DEBUG_TYPE>

例如,使能名为address-sanitizer的LLVM Pass dbgs()输出:

clang.exe -cc1 -emit-obj global-overflow.c -fsanitize=address -mllvm -debug-only=asan

 

-mdebug-pass <value>    Enable additional debug output

其中 <value> 格式为以下标志的组合,

 None|Arguments|Structure|Executions|Details

例如,

clang.exe -cc1 -emit-obj global-overflow.c -fsanitize=address -mdebug-pass Structure Arguments

 

posted on 2012-12-20 23:55  NBSTAR  阅读(2448)  评论(0编辑  收藏  举报

导航