問題タブ [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.
c++ - llvm でユーザー定義パスの引数を追加することは可能ですか?
現在、このチュートリアルに従って、 llvmの分析パスを実装しています。以下のような追加の引数をプラグインに渡す必要があります。
しかし、その方法を教えてくれるマニュアルは見つかりませんでした。だから、実際にそれが可能かどうか疑問に思っています。
前もって感謝します。
c++ - Apple llvm 4.1 で libc++ と libstc++ を使用する場合の c++11 サポートの正確な違いは?
Apple LLVMコンパイラに同梱されているlibc ++とlibstdc ++を使用する場合のc ++ 11サポートの違いを判断する方法を誰か提案できますか?
特に、私は現在、Xcode 4.5.2 に同梱されている LLVM 4.1 を使用しています。
おそらく、答えは、clang がこのバージョンで提供する c++11 サポートのレベルと、4.1 に同梱されている libc++ と libstdc++ のバージョンに部分的に依存します。
私の一般的な感覚では、libc++ を使用する場合、最近の c++11 のサポートは「ほぼ完全」ですが、libstdc++ に切り替えると何かが失われますが、何を理解できません - いくつかの単純な c++11 機能のようです両方でうまく動作するようにします。
gcc 4.8 に同梱されている libstdc++ の c++11 サポートは非常に優れているように感じますが、llvm 4.1 に同梱されている libstdc++ が古いかどうかはわかりません。
また、osx または ios 6.01 用にコンパイルする場合、c++11 サポートのレベル (libc++ で llvm 4.1 を使用) に違いはないように感じますが、私は肯定的ではありません。
これらすべてを理解する方法について何か提案はありますか?
[コンテキスト: アップストリームの依存関係により、libc++ ではなく libstdc++ にリンクする必要がある場合があるため、何を失う可能性があるかを把握したい]
llvm - dbg メタデータを使用して変数定義行番号などを取得する方法は?
私の知る限り、ローカル変数の行番号を取得する必要がある場合、llvm.dbg.declare
組み込み関数の呼び出しを探して dbg メタデータを取得する必要がありました (それAllocaInst
自体には dbg 情報が含まれていないため)。CallInst
ただし、これが の次の命令であるという保証はないAllocaInst
ようで、指定された関数で命令をトラバースする必要があり、非効率的です。そこで、指示を直接AllocaInst
取得する方法があるかどうか疑問に思っています。llvm.dbg.declare
たとえば、次のような src でfoo.c
:
および対応する llvm ir:
int a;
で定義されている の行番号を知る必要がある場合はfoo.c
、ir をトラバースして!dbg !9
から取得する必要がありますcall void @llvm.dbg.declare(metadata !{i32* %a}, metadata !7), !dbg !9
。
llvm.dbg.gv
ところで、非常に情報が含まれているため、グローバル変数を扱うときに問題はないようです。
c++ - 配列を外部関数に渡す
私は LLVM を初めて使用し、プロファイリングに LLVM を使用する方法を学んでいます。配列を外部メソッドに渡し、メソッドへの呼び出し命令をコードに挿入する必要があります。現在、次のコードを使用していますが、実行時にセグメンテーション違反が発生します。
ここで、外部関数「hook」は次のように定義されます。M.getOrInsertFunction("hook", Type::getVoidTy(M.getContext()),
llvm::ArrayType::get(llvm::Type::getInt32Ty(BI->getContext()),2)
(Type*)0);
いくつかのソース ファイルを読んだ後、GetElementPtrInst を使用して配列を渡そうとしました。
しかし、それは失敗します
また、この場合、「フック」は次のように定義されます。 M.getOrInsertFunction("hook", Type::getVoidTy(M.getContext()),
PointerType::get(Type::getInt32PtrTy(M.getContext()),0), //when using GEP
(Type*)0);
配列を外部関数に渡す方法について、誰かが親切に私にいくつかの指針を教えてくれませんか(署名付きで言ってvoid hook(int abc[])
ください)。私はおそらくずっと間違っているので、助けていただければ幸いです。
ios - Apple LLVM コンパイラ エラー 4.1 [-stdlib=libc++ の無効なデプロイメント ターゲット]
誰でもこのエラーの解決方法を教えてください...私のXコードはバージョン4.5です。私の IOS シミュレーターはバージョン 4.3 です
コマンド /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang が終了コード 1 で失敗しました
llvm - llvm インラインパスが機能しない
関数のラッパーを作成しましたが、それをインライン化したいです (このラッパーは元の関数の引数を別の方法でマップするだけです)。変更後に自分のモジュールで llvm のインライナーを呼び出そうとしていますが、opt ツールからパスを呼び出してみましたが、うまくいきませんでした。何が間違っているのでしょうか?
インラインパスを呼び出す方法は次のとおりです。
llvm - 不明なタイプのJITed LLVM関数を呼び出す方法は?
LLVM を使用して JIT コンパイラのフロントエンドを実装しています。まず、LLVM チュートリアルの万華鏡の例に従ってみました。LLVM C++ API を使用して LLVM IR を生成および JIT する方法を知っています。また、llvm::ExecutionEngine の「getPointerToFunction」メソッドを使用して、JITed 関数を呼び出す方法も知っています。
getPointerToFunction は void* を返し、これを正しい関数型にキャストする必要があります。たとえば、私のコンパイラには、次のような単体テストがあります。
問題は、関数のシグネチャを事前に知っておく必要があることです。上記の例では、32 ビット整数を取り、32 ビット整数を返す関数 "f" があります。私は自分で「f」を作成したので、関数の型が何であるかを知っているので、JIT された関数を呼び出すことができます。ただし、一般に、ユーザーが入力した関数のシグネチャ (または構造体の型) が何であるかはわかりません。ユーザーは、任意の引数と戻り値の型を使用して任意の関数を作成できるため、LLVM の getPointerToFunction から void* をキャストする関数ポインターの型がわかりません。私のランタイムは、これらの関数を呼び出すことができる必要があります (たとえば、Read-Evaluate-Print ループの場合)。JIT ランタイムからこのような任意の関数を処理するにはどうすればよいですか?
ありがとう
llvm - llvm の配列の変数要素にアクセスする
変数インデックスで配列の値を取得したい。インデックスはプログラムによって計算され、解析時にはわかりません。したがって、値に格納され、次のように Int に変換されます。
インデックスがわかっている場合は、次を使用できます。
これにより、配列の最初の要素が得られます。そして正しく動作します。しかし、どうすればIntV
インデックスとして使用できますか? CreateExtractValue
ArrayRefのみを受け取り、ArrayRefにキャストする方法はありませんIntV
か、それとも間違っていますか? どうやってそのようなことをするでしょうか?
ありがとう!
c++ - LLVM を使用した実行可能ファイルの動的シンボル解決
私は現在、実行可能ファイルを表すために(ここLLVM's
ObjectFile
に文書化されています)を使用しています。実行可能ファイルを に正常に読み込んだので、実行可能ファイル内のどの呼び出し先アドレスが、関数の呼び出しによって取得されたに含まれるシンボル名に対応するかを判断したいと考えています。の各シンボルを反復すると、各シンボルの名前とそのアドレスが得られますが、シンボルは動的であるため、各シンボルのアドレスは -1 です。これは、がシンボル名を対応する呼び出し先アドレスに直接関連付けないことを示します。ObjectFile
symbol_iterator
begin_dynamic_symbols()
symbol_iterator
ObjectFile
どの呼び出し宛先アドレスが のどの動的シンボルにマップされているかを判断する方法はありますObjectFile
か? を介してすべてのジャンプを手動で計算したくはありませんPLT
。GOT
そうすることを避けることができれば。