問題タブ [llvmlite]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - llvmlite のリンク C
llvmlite
中間LLVM IRを生成するためにPythonでコンパイラを書いています。レクサーとパーサーが完成し、コード生成を行っています。コンパイラは動的で型付けが弱いため、実行時に割り当てなどの処理を行う必要があります。このために、私はすでに C でいくつかの関数を実装しておりbuilder.call
、llvmlite を使用してこれらの関数を呼び出したいと考えています。
これを行う方法のドキュメントや例は見つかりませんでした。
この関数は単純な例に過ぎず、実際の関数はもっと大きくなります。
子:
パイソン:
llvmlite ビルダーを使用して関数を直接記述することもできますが、C で行うとはるかに速く、クリーンで簡単になります。どんな助けも大歓迎です!
python - llvmlite コード生成の中止
llvmlite と Python を使用して llvm IR コードを生成しています。特定の 1 つのモジュール内で多くの関数のコードを生成します。問題は、これらの関数の 1 つに対してコードが生成されている間に例外が発生すると、モジュール コード生成全体が破損することです。他のアクションを実行する前に、モジュールに「ねえ、その関数を完全に忘れてください」と言って、例外から回復する方法が欲しいです。例えば:
何か助けはありますか?
python - Ctypes: C 定義からのデータ型
関数のアドレスとその「cのような」表現も持っています(llvmliteからですが、これはそれほど重要ではありません)。
2 つの double 値を加算して返す関数の場合、コードは次のようになります。cfunc = CFUNCTYPE(c_double, c_double, c_double)(func_ptr)
それは非常にうまく機能しますが、私の関数の引数は型と数が異なる場合があります。Pythonでは、これはいくつかのfor arg in args
ジェネレーターで解決できます。
ただし、自分の型を ctype の型に「変換」または解析する方法はありません (または、少なくとも見つかりませんでした)。
引数はllvmlite-Typeオブジェクトなので、c のような型表現が利用可能です。
私のアプローチは、llvmlite-Type オブジェクト、または c-representation を ctypes の Type オブジェクトにマップできる dict を作成することです。小さなパーサーも役立ちます。
ctype はすでにこのようなものを提供していませんか? 魔法の機能:
ctypes.magic("double") == ctypes.c_double
私は ctypes に縛られていません。CFFI が存在することは知っていますが、経験がなく、ドキュメントを見る限り、単一の関数アドレスの基本的な解決策さえ見つけることができませんでした。
これらのライブラリはどちらも特定の関数のアドレスではなく、ライブラリに関心があるため、私の使用例はかなりまれであることを認識しています。