問題タブ [llvm]
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.
mingw - LLVM: Windows 用の llvm-gcc (mingw) を使用したビットコード
私は現在、小さな JIT コンパイラを構築しています。この言語には、特殊な数学関数用のランタイム ライブラリが必要です。ライブラリをビットコードにコンパイルしてリンクするのが最善だと思います。コンパイラは製品に統合する必要があり、現時点では Windows (VC10、64 ビット) で動作する必要があります。
mingw llvm-gcc build を使用して math lib をビルドし、後で JITed Code にリンクすることは可能ですか? または、mingw の下で llvm-gcc を使用してビルドしたビットコードの移植性に関して何か問題がありますか? 問題がある場合、どのような解決策を提案しますか?
c++ - LLVM JITコードを静的LLVMライブラリにリンクしますか?
私は、財務データの多くのCPU集中分析を行うクロスプラットフォーム(Mac OS X、Windows、およびLinux)アプリケーションを実装している最中です。分析エンジンの大部分は、速度の理由からC ++で記述され、ユーザーがアクセスできるスクリプトエンジンがC++テストエンジンとインターフェイスします。既存の大規模なユーザーベースで他の人気のあるソフトウェアをエミュレートするために、時間をかけていくつかのスクリプトフロントエンドを作成したいと思います。最初のフロントは、VisualBasicのようなスクリプト言語になります。
LLVMは私のニーズにぴったりだと思います。データ量が非常に多いため、パフォーマンスは非常に重要です。回答を得るためにテストを1回実行するのに、数時間または数日かかる場合があります。LLVMを使用すると、単一のバックエンドソリューションを使用できるようになると同時に、スクリプト言語のさまざまなフレーバーに対してさまざまなフロントエンドを実装できるようになると思います。
テストエンジン自体はインターフェイスから分離され、テストは別のプロセスで行われ、進行状況と結果がテスト管理インターフェイスに報告されます。テストは、テストエンジンコードと統合されたスクリプトコードで構成されます。
私が書いた同様の商用テストシステムの以前の実装では、C ++で記述され、テストエンジンライブラリに直接リンクされているため、テストライブラリと簡単にインターフェイスできる高速インタプリタを構築しました。スクリプトコードからライブラリオブジェクトのテストへのコールバックには、かなりのオーバーヘッドを伴うフォーマット間の変換が含まれていました。
LLVMを使用すると、コールバックをC ++に直接実装して、スクリプトコードをC++で記述されているかのように機能させることができると想像しています。同様に、すべてのコードがLLVMバイトコード形式にコンパイルされた場合、LLVMオプティマイザーはスクリプト言語とC++で記述されたテストエンジンコードの間の境界を越えて最適化できるようです。
毎回テストエンジンをコンパイルする必要はありません。理想的には、スクリプトコードのみをJITコンパイルしたいと思います。小規模なテストの場合は、いくつかの最適化パスをスキップしますが、大規模なテストの場合は、リンク中に完全な最適化を実行します。
それで、これは可能ですか?テストエンジンを.oオブジェクトファイルまたは.aライブラリファイルにプリコンパイルしてから、JITを使用してスクリプトコードにリンクできますか?
最後に、理想的には、スクリプトコードに特定のC++クラスのサブクラスとして特定のメソッドを実装してもらいたいと思います。したがって、C++テストエンジンはC++オブジェクトのみを認識しますが、JITセットアップコードは、オブジェクトのメソッドの一部を実装するスクリプトコードをコンパイルします。正しい名前マングリングアルゴリズムを使用した場合、スクリプト言語のLLVM生成を、テストエンジンにリンクできるC++メソッド呼び出しのように設定するのは比較的簡単なようです。
したがって、リンク段階は2つの方向に進みます。つまり、スクリプト言語からテストエンジンオブジェクトを呼び出して価格情報とテスト状態情報を取得し、テストエンジンから特定のC++オブジェクトのメソッドを呼び出します。コードはC++からではなくC++から提供されます。スクリプト言語から。
要約すれば:
1)JITコンパイル、コード生成プロセスの一部として、プリコンパイルされた(.bc、.o、または.aのいずれかの)ファイルにリンクできますか?
2)すべてC ++で記述されているかのように動作するコードを作成できるように、上記の1)のプロセスを使用してコードをリンクできますか?
llvm - clang 1.1および1.0(llvm 2.7および2.6)によって生成された末尾呼び出し
clang -O2(またはオンラインデモ)を使用して次のコードスニペットをコンパイルした後:
llvmアセンブリの次のスニペットを次の場所で取得していflip
ます:
これは、現在のスタックをドロップすることを意味すると思いましたtail call
(つまり、リターンは上位フレームに戻るので、次の命令はret %5
)である必要がありますが、このコードによれば、それはそれを実行mul
します。そして、ネイティブアセンブリではcall
、テールの最適化なしで単純です(llcに適切なフラグがある場合でも)
誰かがclangがそのようなコードを生成する理由を説明できますか?
同様に、llvmが、nextがprevの結果を使用し、後で適切な最適化を実行するか、末尾呼び出し命令と同等のネイティブを生成するtail call
ことを単純にチェックできる場合、なぜllvmが持つのか理解できません。ret
call
qt - QtのLLVMコンパイル済みバージョンを使用する
llvmを使用したMacまたはLinux用のmkspecを見てきました。
誰かがQtのllvmコンパイル済みバージョンを使用していますか?または彼らのQtプロジェクトのllvm?コンパイル時間が短縮されますか?あなたのプロジェクトはより速いですか?
jit - LLVM: 関数へのポインターを保持する構造体へのポインターを JIT 関数に渡す
構造体へのポインターを受け取る関数を備えた LLVM (バージョン 2.7) モジュールがあります。その構造体には、C++ 関数への関数ポインターが含まれています。モジュール関数は JIT コンパイルされる予定で、LLVM API を使用して C++ でその構造体をビルドする必要があります。関数へのポインターを LLVM 値として取得できないようです。ましてや、構築できない ConstantStruct へのポインターを渡すことはできません。
私が軌道に乗っているかどうかはわかりませんが、これは私がこれまでに持っているものです:
programming-languages - LLVMを対象とする関数型言語
LLVMを対象とする言語はありますか?
- 静的に入力されます
- 型推論を使用する
- 機能的である(つまり、ラムダ式、クロージャ、リストプリミティブ、リスト内包表記など)
- ファーストクラスのオブジェクト指向機能(継承、ポリモーフィズム、ミックスインなど)を持っている
- 洗練された型システム(ジェネリック、共変性、反変性など)を持っている
Scalaはこれらすべてですが、JVMのみを対象としています。F#(およびある程度C#)は、これらすべてではないにしてもほとんどですが、.NETのみを対象としています。LLVMを対象とする同様の言語は何ですか?
iphone - この LLVM 1.5 警告はどういう意味ですか? 「「id」のないプロトコル修飾子は古風です」
LLVM 1.5 コンパイラ (XCode 3.2.3 に含まれています) を使用して iOS プロジェクトをコンパイルしようとしましたが、次のような警告を含む多くの新しい警告が表示されました。
たとえば、これは次のような行で発生します。
さて、これはおそらく「命名規則」の警告だと思いますが、それが実際に何を意味するのか知っている人はいますか?
c++ - 既存のメソッドをLLVM関数*にバインドして、JITでコンパイルされたコードから使用できますか?
LLVM C++APIをいじっています。コードをJITコンパイルして実行したいのですが。
ただし、JITでコンパイルされたコードからC++メソッドを呼び出す必要があります。通常、LLVMはメソッド呼び出しを、最初の引数として渡されたオブジェクトポインターを使用した関数呼び出しとして扱うため、呼び出しは問題になりません。本当の問題は、その関数をLLVMに組み込むことです。
私が見る限り、関数に外部リンケージを使用して、その名前で取得することは可能です。問題は、それがC ++メソッドであるため、その名前が壊されることになるので、そのようにするのは良い考えではないと思います。
オブジェクトの作成FunctionType
は簡単です。しかし、そこから、どうすればLLVMにメソッドを通知して、そのFunction
オブジェクトを取得できますか?
compiler-construction - LLVM 外部関数
私は最近、MinGW で LLVM の実験を始めました。Kaleidoscopeのチュートリアルを読みましたが、外部関数に問題があります。
次のような外部関数を宣言しています。
mod は Module* で、ctx は LLVMContext& です。
この場合、すべてが正常に機能します。ただし、関数を宣言すると:
そして、SinFunction 宣言を "sin" の使用から "my_cubic_transform" の使用に (他には何も変更せずに) 変更すると、次のようになります。
「-g」オプションを含めるようにメイクファイルを変更しても効果はありません。Kaleidoscope のチュートリアルでは、これが LLVM で可能であることが示唆されました (少なくとも、私が使用している JIT では)。それで、私は何か間違ったことをしていますか?もしそうなら、何?
java - 人々が準備すべきScalaの将来のプラットフォームの懸念は何ですか?
現時点では、ScalaはJVMでのみ実行され、CLRの実装は古くなっています。
しかし、現時点では、Microsoftが.NET用の最新のScalaポートへの資金提供に関心を持っているという意見がいくつかあります。
Oracle側でJava/JVM /エコシステムをどうするかについての計画や監視がないことを考えると、Scala開発者は、最終的にScalaを実行するための適切なプラットフォームが残っていない可能性があることをどのように準備できますか?
将来、Scala VMの「独立した」実装を行う計画はありますか。これにより、現在のVM実装(ジェネリック、共変配列なし、奇妙な注釈、テールコールなしなど)?