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
. 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 llvm-symbolizer
($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!