KaleidoscopeおよびKaleidoscope with MCJITチュートリアルに基づいて、モジュールと関数を作成し、MCJIT を使用してそれを呼び出すコードがあります。関数にはプロトタイプが必要です。
auto ft = llvm::FunctionType::get(llvm::Type::getInt32Ty(Context), argTypes, false);
ただし、この例では、Double をパラメーターと戻り値としてのみカバーしています (上記では int を使用しています)。高度なことを行うには、クラスやコンテナーなどを渡す必要があります。
モジュールで既存の C++ クラスをどのように使用しますか?
もちろん、任意のライブラリにリンクできますが、それらを使用するには関数プロトタイプを宣言する必要があります。ライブラリ API にクラスがある場合、それらをどのように宣言しますか?
私が欲しいのは次のようなものです:
auto ft = llvm::FunctionType::get(llvm::Type::getStructTy("class.std::string"), argTypes, false);
class.std::string は string.h からインポートされています。
LLVM API にはプリミティブ型しかありません。クラスを表す構造体を定義することはできますが、これを手動で行うのは非常に困難です (そして移植できません)。
それを行う方法は、クラスをビットコードにコンパイルしてモジュールに読み込むことかもしれませんが、可能であれば一時ファイルを避けたいです。また、モジュールから型を抽出する方法もわかりませんが、可能であるはずです。クラスの1つのヘッダーファイルでこれを試しました(ヘッダーファイルの名前をcppファイルに変更しました。そうしないと、clangが.gchプリコンパイル済みヘッダーになります)、結果は単なる定数でした...おそらく最適化されましたか?cppファイルで試してみたところ、36000行のコードになりました...
すると、このページを見つけました。Clang はコンパイラとしてコードをモジュールにコンパイルできるため、LLVM API を使用する代わりに Clang API を使用する必要があります。次に、インポートしたモジュールで LLVM API を使用できます。これは正しい方法ですか?関数呼び出しが機能するようになるまでには永遠にかかったので、機能するソース コードは高く評価されます (チュートリアルは古く、ドキュメントも不足しています)。