問題タブ [llvm-c++-api]
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.
llvm - libclang と LLVM C を使用したジャストインタイム コンパイル
Just-In-Time コンパイル コンテキストで使用したい C コードを生成できるソフトウェアがあります。私が理解していることから、LLVM/Clang が進むべき道であり、プロジェクトの保守性のために、llvm と Clang (libclang) の C API を使用したいと考えています。
libclang コンテキストを使用して作成しclang_createIndex
、翻訳ユニットを使用して作成を開始しましたcreateTranslationUnitFromSourceFile
(ファイル システムを経由せずに、代わりにソース コードを文字列として渡すことができればよかったのに)。しかし、私はそこでほとんど行き詰まります。libclang 変換ユニットから、JIT に必要と思われる LLVM の「実行エンジン」に移行するにはどうすればよいですか? それとも、C API を使用してもこれは不可能ですか?
llvm - LLVM モジュールに簡単に宣言を追加するには?
私はLLVMで独自の言語を書いており、stdとcustomの外部C関数を使用しています。現在、LLVM IR 用の C++ クラスを使用して宣言を追加しています。このような:
数十の外部関数を定義するつもりですが、それらを定義する簡単な方法はありますか?
モジュールに C ヘッダー (または LLVM IR ファイル .ll) を「インクルード」することを考えています。しかし、これを行う方法の例が見つかりませんでした...
c++ - LLVM から C++ ラムダへのマッピングを追加
C++ メソッド呼び出しをラップする一連のラムダがあり、これらを LLVM で呼び出したいと考えています。タイプを宣言し、グローバル マッピングをラムダに追加した後でも、LLVM エラーが発生します。私が試したことを再現するための最小限のコードは次のとおりです。
これにより、次の出力が得られます。
私は何を間違っていますか?LLVM を使用する3.7.0
(タグが存在しない)
c++ - LLVM/Clang: 複合ステートメントをサブセットに減らす
次のコード ブロックを表す複合ステートメントがあります。
元のステートメントの最初の 2 つのステートメントを含む、次のような別の複合ステートメントを作成したいと思います。
そして、次の 2 つのステートメントを含む別のステートメント:
foo(a)
asへの呼び出しがありますclang::CallExpr
。
私がこれまでに持っている唯一のアイデアは、元の複合ステートメントを反復しすぎて、見つかるまで他の複合ステートメントを埋めるfoo(a)
ことです。しかし、API にはステートメントを比較する機能がないようです。より良いアイデアはありますか?
c++ - MSVC IDE での llvm 基本型の動作
組み込みの MSVC デバッガーの不可解な動作に直面しました。デバッグ中のプログラムとデバッガー自体が異なる変数セットで動作しているようです。この変数 (arg) の型は llvm::StringRef です。このクラスには、char* Data と size_t Length という 2 つのデータ メンバーがあります。
std::string からの暗黙の変換コンストラクターは自明です。
ただし、この変換の結果は、デバッガーのローカル変数タブで血まみれのように見えます。このオブジェクトのミニダンプを取り、watch (long long*)(&arg) を追加しようとすると、ほとんど同じように見えます。しかし、コンソール ウィンドウに表示されるように、この部分の実行結果は問題ありません。
llvm - MCJIT でのグローバル変数の使用
実行時に既存の C/C++ プログラムでいくつかの関数を JIT コンパイルしようとしていますが、グローバル変数の初期化で問題が発生しています。具体的には、Clang を使用して、プログラムを実行可能ファイルに加えて IR ビットコード モジュールにプリコンパイルするという方法をとっています。実行時に、プログラムはモジュールをロードし、変換し (プログラムの特殊化)、コンパイルして実行します。結局のところ、「ホスト」プログラムの実行中に初期化および変更されるグローバル変数がいくつかあります。現在、これらのグローバルも JIT コンパイル コードで初期化されていますが、代わりにホスト グローバル変数にマップされるようにしたいと考えています。誰かがこれで私を助けることができますか?
小さな再現を以下に抜粋します。完全なソース コードはこちらにあります。somefunc.cpp ファイルはビルド中にプリコンパイルされ、testCompile.cpp の main() 関数に読み込まれます。グローバル変数 xyz は somefunc.cpp で 25 を指すように初期化されていますが、代わりに main() のように 10 を指すようにしたいと考えています。つまり、main() のアサーションは成功するはずです。
この問題を解決するために、いくつかの異なる方法を試しました。ChangeGlobal() 関数は、この updateGlobalMapping() を達成しようとします (失敗します)。2 つ目の、よりハックなアプローチでは、適切に初期化された新しいグローバル変数を使用します。この後者のアプローチをいくつかのタイプのグローバルで機能させることができますが、これよりもエレガントなアプローチはありますか?
compiler-construction - LLVM で外部関数を見つける
外部関数 (つまり、現在のコンパイル単位で定義されていない関数) を直接または間接的に呼び出す関数を見つける LLVM パスを作成しようとしています。
たとえば、C 次のコードで実行すると、次のようになります。
void a(string s) {print(s)};
int b(int x) {return 1}
void c(void) {a("hello);b}
a と c にフラグが立てられるはずです。
特定の呼び出し inst が外部関数への直接呼び出しに対応しているかどうかを確認する方法が必要です。私の最初のアプローチは、呼び出し inst から関数オブジェクトを抽出し、次に GlobalValue クラスから継承された isDeclaration() メソッドを使用することでした。これにより、すべての関数呼び出しで true が返されましたが、これは明らかに望ましくありません。
これを処理する正しい方法は何ですか?
c++ - llvm::IRBuilder を使用せずにグローバル文字列ポインターを宣言する方法
hello world
LLVM IRを出力するコードは次のとおりです。
破棄llvm::IRBuilder<>
して、Module/Function/BasicBlock 指定の関数に置き換えようとしています。
builder.CreateCall
->llvm::CallInst::llvm::CallInst::Create(pPrintfFunc, pHelloWorldStr, "callPrintf", pEntryBB)
builder.CreateRetVoid()
->llvm::ReturnInst::Create(Context, pConsIntZero, pEntryBB);
builder.getInt32Ty()
->llvm::Type::getInt32Ty(Context)
今の問題は、次の代替手段が見つからなかったことですCreateGlobalStringPtr
:
llvm::Value *pHelloWorldStr = builder.CreateGlobalStringPtr("hello world!\n");
では、ビルダーを使用せずにグローバル文字列ポインターを宣言するにはどうすればよいでしょうか?
llvm::IRBuilder
すべての場合に必要ではないと思います。そのような代替機能を見つける簡単な方法はありますか?