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
TableGenと和解せよ / make peace with TableGen
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Arata
August 23, 2023
0
160
TableGenと和解せよ / make peace with TableGen
Arata
August 23, 2023
Tweet
Share
More Decks by Arata
See All by Arata
eBPFを用いたAndroid向けデバッガ「eDBG」のx86_64 Linuxへの移植
arata_nvm
0
6
Pythonのcopy-and-patch JITの実装を読む
arata_nvm
0
90
eBPFを使った動的解析手法
arata_nvm
1
670
カーネルハック実験の振り返り
arata_nvm
1
39
Improving LLVM Backend Development with a New TableGen Language Server
arata_nvm
0
31
コードエディターのシンタックスハイライトの話
arata_nvm
0
180
LLVMのコード自動生成機構におけるコード記述を支援するツールの作成
arata_nvm
0
82
TableGenの言語サーバーをつくる
arata_nvm
0
590
pwn入門 / introduction to pwn
arata_nvm
1
2.6k
Featured
See All Featured
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
74
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.6k
Discover your Explorer Soul
emna__ayadi
2
1.1k
AI: The stuff that nobody shows you
jnunemaker
PRO
2
250
The World Runs on Bad Software
bkeepers
PRO
72
12k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
7.9k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
450
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
430
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
80
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
1
51
Transcript
TableGenと和解せよ 2023/08/21 Ando Shin / @Arata
TableGenとは • コンパイラ基盤LLVMの内部で使用されているDSL • レジスタや命令など、ターゲットマシン固有の情報を 記述するために用いられることが多い • 一般にはC++のコードに変換される 2
https://github.com/llvm/llvm-project/blob/1c822e1e8278ebefdb7701249bdfe51f1ed03d7d/llvm/lib/Target/X86/X86RegisterInfo.td#L163-L184 例: TableGenでX86のレジスタを記述 3
TableGen嫌われがち問題 4
• エディタの支援を受けられない • 情報がまとまっていない • C++と組み合わせてのビルドに手間がかかる なぜTableGenは嫌われているのか 5
• エディタの支援を受けられない • 情報がまとまっていない • C++と組み合わせてのビルドに手間がかかる なぜTableGenは嫌われているのか 6
2022年5月から言語サーバーが実装され始める 今日までに実装された機能: • シンタックスハイライト • エラー表示 • 定義へ移動 • 参照へ移動
• ホバー表示 エディタ支援の現状 7
2022年5月から言語サーバーが実装され始める 今日までに実装された機能: • シンタックスハイライト • エラー表示 • 定義へ移動 • 参照へ移動
• ホバー表示 コードの入力補完が実装されていない エディタ支援の現状 8
入力補完を実装した 9
• 言語サーバーの応答性が悪い • 一部のコードで支援機能を提供できない • 内部実装が言語サーバー向きではない 現状の言語サーバーの問題点 10
エラー表示・補完候補が更新されるまで時間がかかる様子 問題点1: 言語サーバーの応答性が悪い 11
考えられる原因: • 言語サーバーがシングルスレッドで動いている • パースと同時に評価を行っている ◦ コードが変更されるたびにすべてのシンボルの解決処理が走る 問題点1: 言語サーバーの応答性が悪い 12
• これはコード側に原因がある • includeが適切に行われないためシンボルを解決できない 問題点2: 一部のコードで支援機能を提供できない 13 A.td B.td ※Registerはllvm/Target/Target.tdで定義
コードの構造を保持するための方法にASTとCSTがある • AST: Abstract Syntax Tree (rustcで使われる) • CST: Concrete
Syntax Tree (rust-analyzerで使われる) TableGenではASTが使われているため、以下の問題がある • トークンの場所やコメントなどの情報が失われてしまう • 構文エラーがあった場所でパースが止まってしまう 問題点3: 内部実装が言語サーバー向きではない 14
RustでTableGenの新たな言語サーバーを実装しています 目指すところ: • キャッシュを使った処理の高速化 • エラーからの回復機能を持つパーサーの実装 • 一般的な支援機能の実装 • (TableGenのパーサーを提供して誰かがTableGen2.0を
作ってくれることを期待) 今していること 15