在扒tvm源码的时候,会经常遇到各种宏,特别是一些函数宏,对阅读代码造成很多麻烦。我们可以使用C++编译器的-E选项,得到源码编译中间文件,里面的所有宏都是已经自动替换后的。
在我们编译源码的build目录下,有个compile_commands.json文件,这个文件中有各个C++代码文件的编译命令。使用grep命令搜文件名(不用带路径),即可找到该文件的编译命令。例如我的环境下,找到的expr_functor.cc的编译命令:
/usr/bin/c++ -DDMLC_USE_FOPEN64=0 -DDMLC_USE_LOGGING_LIBRARY=\"<tvm/runtime/logging.h>\" -DNDEBUG -DNDEBUG=1 -DTVM_INDEX_DEFAULT_I64=1 -DTVM_LLVM_VERSION=130 -DTVM_THREADPOOL_USE_OPENMP=0 -DTVM_USE_LIBBACKTRACE=1 -DUSE_FALLBACK_STL_MAP=0 -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -I/home/tvm/tvmsource/tvm/include -I/home/tvm/tvmsource/tvm/build/libbacktrace/include -I/home/tvm/tvmsource/tvm/topi/include -I/home/tvm/tvmsource/tvm/3rdparty/libcrc/include -isystem /home/tvm/tvmsource/tvm/3rdparty/dlpack/include -isystem /home/tvm/tvmsource/tvm/3rdparty/dmlc-core/include -isystem /home/tvm/tvmsource/tvm/3rdparty/rang/include -isystem /home/tvm/tvmsource/tvm/3rdparty/compiler-rt -isystem /home/tvm/tvmsource/tvm/3rdparty/picojson -isystem /home/tvm/llvm/include -std=c++14 -faligned-new -O2 -Wall -fPIC -o CMakeFiles/tvm_objs.dir/src/relay/ir/expr_functor.cc.o -c /home/tvm/tvmsource/tvm/src/relay/ir/expr_functor.cc
我们把这个命令中的 -c 换成 -E ,去掉 -DDMLC_USE_LOGGING_LIBRARY=\"<tvm/runtime/logging.h>\" ,然后执行,可以得到./CMakeFiles/tvm_objs.dir/src/relay/ir/expr_functor.cc.o文件,该文件不再是二进制文件,而是展开所有宏后的文本文件。