Visual Studio 2019でllvmがビルドできない問題とその対処

例によって「Visual Studioでclangを使う」話ではなく、「Visual Studiollvm自体をビルドする」話です。

症状

Building Attributes.inc...
llvm-tblgen.exe: Unknown command line argument '-gen-attrs'. Try: '..\..\..\Debug\bin\llvm-tblgen.exe -help'
llvm-tblgen.exe: Did you mean '-stats'?
llvm\include\llvm/IR/Attributes.h(74,14): fatal error C1083: include ファイルを開けません。'llvm/IR/Attributes.inc':No such file or directory

などのエラーメッセージが出てビルドできません。

確かにllvm/IR/Attributes.incは存在しません。これは自動生成されるファイルなのですが、生成するllvm-tblgen.exeというプログラムが、(ビルドできているにもかかわらず)正しく動作しないことが原因です。

原因究明

「'llvm/IR/Attributes.inc'」などとググっても原因はよくわかりません(単に依存関係を間違えている事例ばかり出てきます)。

llvm-tblgen msvc」とググったところ、以下の手掛かりを得ました(二つ目のサイトは一つ目のサイトにリンクがありました)。

原因

最新のmsvcではヘッダが更新されC++20の機能が追加されました。この機能はC++11/14/17でコンパイルする際は(マクロ等で)適切に無効にされる必要がありますが、そうなっていないというmsvcのバグが原因です。

アトミック変数の初期化周りの仕様がC++20から変更されますが、どうやらこれが破壊的変更になっていて、コンパイルは素通りするものの動作が変わってしまっているようです。

解決法

コンパイラを変更する方法

問題のあるヘッダファイルが使われるのは16.6以降のバージョンです。

したがって、Visual Studio 2019 のビルド番号とリリース日 | Microsoft Docs から16.6以前のバージョン(例えば16.5.5)をインストールすれば、問題は発生しません。

ソースコードを変更する方法

この問題へのワークアラウンドがコミットされている([ManagedStatic] Fix build errors with clang-tblgen in Debug mode usin… · llvm/llvm-project@28a6713 · GitHub)ため、このコミット以降であれば問題は発生しません。

先日リリースされたllvm10.0.1には、このコミットが含まれています。