开始学习一个新项目的时候,我都会为其创建一个TAGS文件,便于源代码定位,LLVM也不例外。
find . -iname "*.h" -or -iname "*.cpp" | etags - find . -iname "*.td" | grep -v '^\./\(test/\|lib/Target/[^A]\)' | \ etags --language=none \ --regex='/\(defm?\|\(multi\)?class\)[ \t]+\([^ \t:<]+\)/\3/' \ -a -
除了C++程序之外,我还给LLVM TableGen的td文件也建立了索引,这样在学习td时也可以方便快捷地在class
和def
之间跳转,对defm
和multiclass
也做了有限的支持。
但是etags也有不方便的时候,比如定位Function
这个class,我跳转了多次,仍然没有定位到它的定义位置。无奈,只好使用搜索。LLVM提供了一个搜索脚本utils/llvmgrep
,可以在命令行下直接使用,但是我更喜欢在Emacs里面调用,这样可以直接从搜索结果跳转到源文件的相应位置。配置如下:
(defvar wl-llvm-root-dir "~/src/llvm/trunk") (defvar wl-llvm-grep-command (concat wl-llvm-root-dir "/utils/llvmgrep")) (defun wl-llvmgrep () (interactive) (let ((regexp (grep-read-regexp)) (default-directory wl-llvm-root-dir)) (compilation-start (concat wl-llvm-grep-command " -topdir " wl-llvm-root-dir " " (shell-quote-argument regexp)) 'grep-mode)))
我个人还给llvmgrep
贡献了一个小小的patch,使其在Mac OS X上也能正常使用。
很高兴能够看到这篇文章,我想学习llvm,但是源码又不知道如何看,大神可以指点指点我吗?