Using git bisect with LLVM


git bisect helped me today in tracking down a regression in LLVM/Clang. Because LLVM/Clang code is split across multiple git repositories, there were a few obstacles to overcome prior to using git bisect. I thought I would share them here, in the hope that they’re useful for others.

The main difficulty was to check out the version of clang and compiler-rt that would compile with a given LLVM revision. I used the following code in the bisect script:

checkout() {
local committer_date=“$(git log --pretty=format:%cd -n1 ‘HEAD’)”
cd $LLVM_SRC/tools/clang
git checkout “$(git rev-list -n 1 --before=”$committer_date" origin/google/testing)"
cd $LLVM_SRC/projects/compiler-rt
git checkout “$(git rev-list -n 1 --before=”$committer_date" origin/google/testing)"

build() {



Go for it!

checkout || exit 125
build || exit 125

The code will, for a given LLVM revision, checkout the latest revision from the google/testing branch for both clang and compiler-rt. It will then compile everything. If either fails, the script exits with code 125, which tells git bisect to skip the current commit and try another one.

Hope this helps!

Check out chapuni’s unified git tree for the entire SVN repo:

– Sean Silva

We're using a very similar script to the one posted to the list FWIW.

Separate git repositories work with git-svn dcommit and have compatible commit IDs with the official git mirror, which isn't the case with all-in-one repositories, so it's definitely a worthwhile approach.

(Now, if we could do this with git submodules instead of git subtrees, that *would* be cool but I don't think the support is there.)

Thanks for sharing Jonas


FYI, I have submodularized one.
It'd be useful just to bisect.