Upgrade to Pro — share decks privately, control downloads, hide ads and more …

LLVMのDSL”TableGen”向け言語サーバーの開発

Avatar for Arata Arata
March 26, 2026
0

 LLVMのDSL”TableGen”向け言語サーバーの開発

Avatar for Arata

Arata

March 26, 2026
Tweet

More Decks by Arata

Transcript

  1. 2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 安藤 慎 / Arata

    • 所属: 筑波大学情報学群情報科学類3年 • 興味: CTF、(デ)コンパイラなど • リンク集 ◦ 𝕏: @arata_nvm ◦ GitHub: @arata-nvm ◦ Blog: https://arata-nvm.hatenablog.com/ 2
  2. 2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 • TableGen: LLVMで使用されるドメイン固有言語(DSL) ◦

    C++のコードに変換して使うことが多い • 主な用途 ◦ LLVMのバックエンド定義 ◦ ClangのCLIオプション定義 ◦ MLIR(中間表現)のdialect定義 • LLVMにおける使用状況 (v22.1.1時点) ◦ 1,600ファイル以上 ◦ 95万行以上 背景 / TableGenとは 8
  3. 2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 def(具象クラス)を定義できる 背景 / TableGenでできること

    11 class Reg<string name> { string Name = name; } class GPR<string name>: Reg<name>; def R1: GPR<”R1”>;
  4. 2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 繰り返しもできる 背景 / TableGenでできること

    12 class Reg<string name> { string Name = name; } class GPR<string name>: Reg<name>; foreach i = 1...16 in def R#i: GPR<”R”#i>;
  5. 2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 • TableGenの言語機能は複雑 ◦ どのようなシンボルがどのような名前で定義されるのか?

    ◦ multiclass, bang opsなどさらに複雑な機能も🫠 • 一方、TableGenの言語サーバー開発はあまり活発でない ◦ LLVM公式の言語サーバー: tablegen-lsp-server ◦ 最低限の機能は実装されており、小さいコードでは便利 ◦ コンパイラのコードを流用しており、応答速度や安定性に問題が ある 快適なTableGenの開発環境が整備されていない 課題 / TableGenを使った開発のしにくさ 13
  6. 2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 tablegen-lsp: 新しいTableGenの言語サーバー tablegen-lsp: https://github.com/arata-nvm/tablegen-lsp

    • より多くの開発支援機能を実装 • インクリメンタル&エラー耐性のある解析 • Source Root設定機能 14
  7. 2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 実装 / 言語サーバーの実装に必要なもの 15

    tablegen-lsp (言語サーバー) VSCode TableGen ソースコード ① エディタと言語サーバー間で通信する ② TableGenのソースコードを解析する ※LSP対応ならVSCode以外のエディタでもよい
  8. 2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 実装 / 言語サーバーの実装に必要なもの 16

    tablegen-lsp (言語サーバー) VSCode TableGen ソースコード ① エディタと言語サーバー間で通信する ② TableGenのソースコードを解析する ※LSP対応ならVSCode以外のエディタでもよい
  9. 2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 Q. TableGenのコンパイラのパース・解析処理を流用できる? A. 厳しい。ユースケースが異なるため。

    言語サーバー特有のユースケース: • コードがエラーを含んでいても解析する ◦ → エラーから復帰して解析を最後まで続けてほしい • 少しの変更が加えられたコードを繰り返し解析する ◦ → 前回の解析結果を再利用して高速に解析してほしい 実装 / ② TableGenのソースコードを解析する 17
  10. 2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 rust-analyzerの資産(rowan, salsa)をベースにTableGen のパース・解析処理を再実装 •

    コードがエラーを含んでいても解析する ◦ rowan: エラーを含むコードでも構文木を構築できる ◦ エラーを含むファイルを開いてもクラッシュしない • 少しの変更が加えられたコードを繰り返し解析する ◦ salsa: 必要な再計算のみを行うincremental processingを実装 ◦ パース結果、解析結果等をキャッシュし、必要な分だけ更新する 実装 / ② TableGenのソースコードを解析する 18
  11. 2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 既存のLLVMのTableGen実装も併用して解析を行うように 2つの解析処理を使い分ける: 実装 /

    ② TableGenのソースコードを解析する 20 簡易解析 • 独自のパース・解析処理を使用 • 速いが、一部不正確 • 変更のたびに実行 タイピング中に即座にエラー・補完 等を提供できる 完全解析 • LLVMのパース・解析処理を使用 • 遅いが、正確 • 非同期で定期的に実行 インデックスを作成し、簡易解析の 情報を補強する
  12. 2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 そのほかの機能 • Source Root機能:

    解析の基点となるファイルを固定する ◦ TeXのprimary file, Typstのpreview this fileのような概念 実装 / ② TableGenのソースコードを解析する 21
  13. 2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 • salsaのドキュメントが少ない/破壊的変更がある • VSCodeが若干LSPに従っていない箇所がある

    • TableGenの一部の仕様はドキュメント化されていない • 言語サーバー自体のテスト・デバッグが難しい • デッドロックが頻繁に発生する • Windows向けの配布のためLLVMを自前でビルド • VSCodeのOutputビューでtablegen-lspが増殖する • 文脈に応じてシンボルの名前が変化する 苦労した点 22
  14. 2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 • Compilation Databaseへの対応 ◦

    CMakeが生成するtablegen_compile_commands.ymlを解釈 • TableGenコンパイラとの挙動差の修正 ◦ 誤ったエラーが表示されないようにする • さらなる言語機能の実装 ◦ signature help, semantic tokenなど 今後の展望 23
  15. 2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 • 既存の言語サーバーに対する不満があった • 既存のTableGenコンパイラと連携し、高速かつ正確な

    開発支援機能を提供する言語サーバーを実装した • TableGen向けの入力補完が使えるようになった まとめ 24
  16. 2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 • 2023/08/24 開発開始 •

    2023/09/05 パーサ実装 • 2023/09/22 定義への移動を実装 • 2023/09/26 ドキュメントシンボルを実装 • 2023/10/12 ホバーを実装 • 2023/11/26 インレイヒントを実装 • 2023/12/02 Kernel/VM探検隊@北陸 Part 6で発表 • 2024/05/07 includeに対応 • 2024/05/21 参照への移動を実装 • 2025/01/18 ドキュメントリンク、折りたたみ範囲を実装 付録 / 開発スケジュール(ラボユース以前) 25
  17. 2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 • 2025/06/01 Source Root設定機能を実装

    • 2025/06/10 AsiaLLVMで発表 • 2025/10/03 LLVMのTableGen実装と連携して完全解析を実装 • 2025/11/14 型システムの実装 • ︙ 無限のバグ修正(X86のバックエンドをエラー0で解析できるように) • 2026/01/23 入力補完の実装 • 2026/02/13 解析のキャンセルを実装、UI表示の改善 • 2026/03/04 バックグラウンド解析の実装 付録 / 開発スケジュール(ラボユース期間) 26
  18. 2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 付録 / TableGenの使用例 27

    例: TableGenによるx86-64のレジスタの定義 (llvm/lib/Target/X86/X86RegisterInfo.td) RAXレジスタの文字列表現、バイト表現、 デバッグ情報での表現などを定義している →アセンブラ、リンカ等で利用される
  19. 2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 付録 / tablegen-lsp-serverの課題 •

    巨大なTableGenのコードベースで応答が遅くなる ◦ 1文字編集するごとにすべてのファイルをパース・解析している ◦ 巨大なコードベースでは応答に1秒以上かかることもある • 言語サーバー自体が不安定 ◦ エラーを含むコードで言語サーバーがクラッシュすることがある ◦ CLIツールllvm-tblgenの実装を再利用しており、パースエラーでプ ロセスを終了させるため 28
  20. 2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 実装 / 言語サーバーの実装に必要なもの 31

    tablegen-lsp (言語サーバー) VSCode TableGen ソースコード ① エディタと言語サーバー間で通信する ② TableGenのソースコードを解析する ※LSP対応ならVSCode以外のエディタでもよい
  21. 2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 • エディタと言語サーバーはLSPというプロトコルで通信 ◦ LSP:

    Language Server Protocol 実装 / ① エディタと言語サーバー間で通信する 32 エディター 言語サーバー 1. lib.rsで定義された関数を教えて 2. foo, barです LSPの通信例
  22. 2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 言語サーバー側の実装 • Rust +

    oxalica/async-lsp で実装 • リクエストに対するハンドラを書けば良い • リクエストの例: ◦ textDocument/definition: 定義へ移動 ◦ textDocument/rename: 参照へ移動 ◦ textDocument/completion: 入力補完 実装 / ① エディタと言語サーバー間で通信する 33
  23. 2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 エディタ側の実装 • VSCodeの場合、拡張機能を作成する必要がある •

    TypeScript + vscode-languageclient で実装 • 言語サーバーのパスを渡すといい感じにVSCodeと接続 してくれる 実装 / ① エディタと言語サーバー間で通信する 34
  24. 2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 問題点 / #3 “include

    anti-pattern”を扱えない • LLVMバックエンドのコードでよく登場する“include anti-pattern”を扱えない RISCVRegisterInfo.tdのRegisterを解決できない例: 35
  25. 2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 特徴 #3: “include anti-pattern”をサポート

    • ユーザーは“source root”となるファイルを指定できる • 解析は常に“source root”から行われる → e.g. RISCVRegisterInfo.tdを開いてもRegisterが解決される 38
  26. 2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 • ✅ TableGenのパーサーを実装 •

    󰝋 プログラムの解析処理を実装 ◦ 一部の演算子に関する解析処理が未実装 ◦ LLVMの実装と挙動に差異がないかテストが必要 • 󰝋 言語サーバー(LSPを喋る部分)の実装 ◦ 実装済み: diagnostics, go to def, find refs, document link, hover, folding, inlay hints, outline ◦ 実装予定: completion, signature help, semantic token, selection range • ✅ VS Code拡張の実装 開発状況 39