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

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

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for Arata Arata
March 26, 2026
10

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

Avatar for Arata

Arata

March 26, 2026

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