One of my goals for Q2 was to make Firefox usable with “modern” (version 3.6+) clang. For reasons previously unknown, Firefox would only work with relatively old clang (version ~3.3); indeed, our wiki page for TSan recommends checking out specific SVN versions!
I’m happy to say that goal has been met. If you like, you can read (some of) the gory details in bug 1153244. Checking out a development version of Clang and building that should enable you to test Firefox (from mozilla-central, since that’s where the aforementioned bug has landed thus far) with TSan. Upgrading through several major releases has its benefits: TSan appears to be somewhat more stable—tests that would previously timeout reliably now run without complaint. I’m not sure that it’s quite reliable enough to run in automation yet, but running TSan tests in automation is definitely more feasible than it was last quarter.
With an eye towards doing that, and also with an eye towards improving individual developer experience, I’ve recently landed several patches that teach our test harnesses about TSan-specific things. For instance, when we’re running mochitests, we only care about races in the browser itself; we don’t care about races while running any of the supporting tools (particularly
xpcshell, which shares a lot of code with the browser through libxul). So TSan should only be enabled for the actual browser executable. We already do similar things for our ASan builds.
I also discovered that my local builds weren’t using the
llvm-symbolizer tool to produce backtraces in TSan’s reports, but instead defaulting to using
addr2line is a fine tool, but
llvm-symbolizer understands debug information better (for instance, it shows you synthesized frames for inlined functions, which is a huge win) and
llvm-symbolizer is somewhat faster than
addr2line. In my case, it was a combination of
llvm-symbolizer not being in my
PATH, and not informing TSan about the location of
$OBJDIR/dist/bin/, usually). The former was addressed by setting
LLVM_SYMBOLIZER in my mozconfig (not necessary if
llvm-symbolizer is on your
PATH), and the latter was addressed by adding a bit of code to our test scripts.
Now, to update the wiki with better instructions!