私は LLVM をいじっていますが、クラスのコードを生成するのに行き詰まりました。
LLVM を使用してクラス機能を作成するにはどうすればよいでしょうか?
- クラス演算子は関数と同じように扱われますか?
- 自動割り当てはどのように処理されますか (C++ など)?
- C++ のような仮想継承を通じて、Java のようなインターフェイスをサポートするにはどうすればよいですか?
直接的なアプローチは、構造体を作成し、メソッドを通常の関数としてモデル化し、それを含むクラスを表す構造体へのポインター (本質的にはthis
ポインター) を最初のパラメーターとして受け取ることです。割り当ては、構造体を割り当ててから、割り当てられたデータに対して特別な初期化関数 (実際にはコンストラクター) を呼び出すことによってモデル化できます。
継承は、基本クラスの構造体の型と同じ型を持つ、特別な「親」フィールド (多重継承の場合は複数のフィールド) を含む構造体を構築することで実行できます。
仮想テーブルについて読んでください。彼らは最高の出発点だと思います。コンパイラは基本的に次のことがわかります。
クラスを使用するコードを C++ で記述し、Clang を使用して LLVM IR にコンパイルし、生成されたコードを確認します。