Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
LLVMのDSL”TableGen”向け言語サーバーの開発
Search
Arata
March 26, 2026
20
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
LLVMのDSL”TableGen”向け言語サーバーの開発
Arata
March 26, 2026
More Decks by Arata
See All by Arata
デコンパイラ研究調査
arata_nvm
1
7
コンパイラ基盤を支える言語たち
arata_nvm
1
66
5分でわかるPage-Fault Weird Machine
arata_nvm
2
290
eBPFを用いたAndroid向けデバッガ「eDBG」のx86_64 Linuxへの移植
arata_nvm
0
19
Pythonのcopy-and-patch JITの実装を読む
arata_nvm
0
130
eBPFを使った動的解析手法
arata_nvm
1
790
カーネルハック実験の振り返り
arata_nvm
1
58
Improving LLVM Backend Development with a New TableGen Language Server
arata_nvm
0
53
コードエディターのシンタックスハイライトの話
arata_nvm
0
240
Featured
See All Featured
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
720
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
250
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
360
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
65
55k
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
160
The SEO identity crisis: Don't let AI make you average
varn
0
480
Measuring & Analyzing Core Web Vitals
bluesmoon
9
860
Fireside Chat
paigeccino
42
3.9k
Site-Speed That Sticks
csswizardry
13
1.2k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
450
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
160
Transcript
LLVMのDSL”TableGen”向け 言語サーバーの開発 2026/03/25 サイボウズ・ラボユース 成果発表会 安藤 慎(メンター 光成 滋生さん)
2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 安藤 慎 / Arata
• 所属: 筑波大学情報学群情報科学類3年 • 興味: CTF、(デ)コンパイラなど • リンク集 ◦ 𝕏: @arata_nvm ◦ GitHub: @arata-nvm ◦ Blog: https://arata-nvm.hatenablog.com/ 2
2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 取り組んだこと LLVMで使われるTableGenという言語向けの言語サーバーを 開発した 3
2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 TableGenで高速に入力補完が効きます 推しポイント 4
2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 既存のX86バックエンドのコードでも エラーなく高速に入力補完が効きます 推しポイント 5
※約10万行
2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 6 デモ: 既存の言語サーバー
2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 7 デモ: 実装した言語サーバー
2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 • TableGen: LLVMで使用されるドメイン固有言語(DSL) ◦
C++のコードに変換して使うことが多い • 主な用途 ◦ LLVMのバックエンド定義 ◦ ClangのCLIオプション定義 ◦ MLIR(中間表現)のdialect定義 • LLVMにおける使用状況 (v22.1.1時点) ◦ 1,600ファイル以上 ◦ 95万行以上 背景 / TableGenとは 8
2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 class(抽象クラス)を定義できる 背景 / TableGenでできること
9 class Reg<string name> { string Name = name; }
2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 classを継承できる 背景 / TableGenでできること
10 class Reg<string name> { string Name = name; } class GPR<string name>: Reg<name>;
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”>;
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>;
2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 • TableGenの言語機能は複雑 ◦ どのようなシンボルがどのような名前で定義されるのか?
◦ multiclass, bang opsなどさらに複雑な機能も🫠 • 一方、TableGenの言語サーバー開発はあまり活発でない ◦ LLVM公式の言語サーバー: tablegen-lsp-server ◦ 最低限の機能は実装されており、小さいコードでは便利 ◦ コンパイラのコードを流用しており、応答速度や安定性に問題が ある 快適なTableGenの開発環境が整備されていない 課題 / TableGenを使った開発のしにくさ 13
2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 tablegen-lsp: 新しいTableGenの言語サーバー tablegen-lsp: https://github.com/arata-nvm/tablegen-lsp
• より多くの開発支援機能を実装 • インクリメンタル&エラー耐性のある解析 • Source Root設定機能 14
2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 実装 / 言語サーバーの実装に必要なもの 15
tablegen-lsp (言語サーバー) VSCode TableGen ソースコード ① エディタと言語サーバー間で通信する ② TableGenのソースコードを解析する ※LSP対応ならVSCode以外のエディタでもよい
2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 実装 / 言語サーバーの実装に必要なもの 16
tablegen-lsp (言語サーバー) VSCode TableGen ソースコード ① エディタと言語サーバー間で通信する ② TableGenのソースコードを解析する ※LSP対応ならVSCode以外のエディタでもよい
2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 Q. TableGenのコンパイラのパース・解析処理を流用できる? A. 厳しい。ユースケースが異なるため。
言語サーバー特有のユースケース: • コードがエラーを含んでいても解析する ◦ → エラーから復帰して解析を最後まで続けてほしい • 少しの変更が加えられたコードを繰り返し解析する ◦ → 前回の解析結果を再利用して高速に解析してほしい 実装 / ② TableGenのソースコードを解析する 17
2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 rust-analyzerの資産(rowan, salsa)をベースにTableGen のパース・解析処理を再実装 •
コードがエラーを含んでいても解析する ◦ rowan: エラーを含むコードでも構文木を構築できる ◦ エラーを含むファイルを開いてもクラッシュしない • 少しの変更が加えられたコードを繰り返し解析する ◦ salsa: 必要な再計算のみを行うincremental processingを実装 ◦ パース結果、解析結果等をキャッシュし、必要な分だけ更新する 実装 / ② TableGenのソースコードを解析する 18
2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 ただしTableGenの完全な再実装は厳しい • TableGen自体は現在もアップデートされ続けている •
新しい仕様に追従し続けるコストは大きい 実装 / ② TableGenのソースコードを解析する 19
2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 既存のLLVMのTableGen実装も併用して解析を行うように 2つの解析処理を使い分ける: 実装 /
② TableGenのソースコードを解析する 20 簡易解析 • 独自のパース・解析処理を使用 • 速いが、一部不正確 • 変更のたびに実行 タイピング中に即座にエラー・補完 等を提供できる 完全解析 • LLVMのパース・解析処理を使用 • 遅いが、正確 • 非同期で定期的に実行 インデックスを作成し、簡易解析の 情報を補強する
2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 そのほかの機能 • Source Root機能:
解析の基点となるファイルを固定する ◦ TeXのprimary file, Typstのpreview this fileのような概念 実装 / ② TableGenのソースコードを解析する 21
2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 • salsaのドキュメントが少ない/破壊的変更がある • VSCodeが若干LSPに従っていない箇所がある
• TableGenの一部の仕様はドキュメント化されていない • 言語サーバー自体のテスト・デバッグが難しい • デッドロックが頻繁に発生する • Windows向けの配布のためLLVMを自前でビルド • VSCodeのOutputビューでtablegen-lspが増殖する • 文脈に応じてシンボルの名前が変化する 苦労した点 22
2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 • Compilation Databaseへの対応 ◦
CMakeが生成するtablegen_compile_commands.ymlを解釈 • TableGenコンパイラとの挙動差の修正 ◦ 誤ったエラーが表示されないようにする • さらなる言語機能の実装 ◦ signature help, semantic tokenなど 今後の展望 23
2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 • 既存の言語サーバーに対する不満があった • 既存のTableGenコンパイラと連携し、高速かつ正確な
開発支援機能を提供する言語サーバーを実装した • TableGen向けの入力補完が使えるようになった まとめ 24
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
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
2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 付録 / TableGenの使用例 27
例: TableGenによるx86-64のレジスタの定義 (llvm/lib/Target/X86/X86RegisterInfo.td) RAXレジスタの文字列表現、バイト表現、 デバッグ情報での表現などを定義している →アセンブラ、リンカ等で利用される
2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 付録 / tablegen-lsp-serverの課題 •
巨大なTableGenのコードベースで応答が遅くなる ◦ 1文字編集するごとにすべてのファイルをパース・解析している ◦ 巨大なコードベースでは応答に1秒以上かかることもある • 言語サーバー自体が不安定 ◦ エラーを含むコードで言語サーバーがクラッシュすることがある ◦ CLIツールllvm-tblgenの実装を再利用しており、パースエラーでプ ロセスを終了させるため 28
2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 付録 / アーキテクチャ 29
以降、没スライド 30
2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 実装 / 言語サーバーの実装に必要なもの 31
tablegen-lsp (言語サーバー) VSCode TableGen ソースコード ① エディタと言語サーバー間で通信する ② TableGenのソースコードを解析する ※LSP対応ならVSCode以外のエディタでもよい
2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 • エディタと言語サーバーはLSPというプロトコルで通信 ◦ LSP:
Language Server Protocol 実装 / ① エディタと言語サーバー間で通信する 32 エディター 言語サーバー 1. lib.rsで定義された関数を教えて 2. foo, barです LSPの通信例
2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 言語サーバー側の実装 • Rust +
oxalica/async-lsp で実装 • リクエストに対するハンドラを書けば良い • リクエストの例: ◦ textDocument/definition: 定義へ移動 ◦ textDocument/rename: 参照へ移動 ◦ textDocument/completion: 入力補完 実装 / ① エディタと言語サーバー間で通信する 33
2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 エディタ側の実装 • VSCodeの場合、拡張機能を作成する必要がある •
TypeScript + vscode-languageclient で実装 • 言語サーバーのパスを渡すといい感じにVSCodeと接続 してくれる 実装 / ① エディタと言語サーバー間で通信する 34
2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 問題点 / #3 “include
anti-pattern”を扱えない • LLVMバックエンドのコードでよく登場する“include anti-pattern”を扱えない RISCVRegisterInfo.tdのRegisterを解決できない例: 35
2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 • LLVMバックエンドのコードでよく登場する“include anti-pattern”を扱えない RISCVRegisterInfo.tdのRegisterを解決できない例:
36 問題点 / #3 “include anti-pattern”を扱えない
2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 • LLVMバックエンドのコードでよく登場する“include anti-pattern”を扱えない RISCVRegisterInfo.tdのRegisterを解決できない例:
37 問題点 / #3 “include anti-pattern”を扱えない
2026/03/25 | LLVMのDSL”TableGen”向け言語サーバーの開発 | 安藤 慎 特徴 #3: “include anti-pattern”をサポート
• ユーザーは“source root”となるファイルを指定できる • 解析は常に“source root”から行われる → e.g. RISCVRegisterInfo.tdを開いてもRegisterが解決される 38
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