問題タブ [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.

0 投票する
1 に答える
290 参照

llvm - LLVM バックエンド モジュール パス

グラフの順序ですべての MachineBasicBlock を通過するバックエンドでパスを作成し、3 つの連続する MachineBasicBlock ごとに何らかのプロパティが達成されているかどうかを確認したいと思います。

このパスの書き方について何かアイデアはありますか?

0 投票する
1 に答える
1427 参照

llvm - LLVM: 定数変数

const 修飾子または実行により変更されない変数を使用して、(バイトコード ファイルまたは IR ファイルから) すべての変数を取得するにはどうすればよいですか? さらに使用するためにリストを作成する必要があります。

0 投票する
1 に答える
1497 参照

c++ - Clang ツール: ObjCMessageExpr を書き直します

コード内のすべてのメッセージを書き直したいのですが、セレクターのみを置き換える必要がありますが、ネストされた式 fe を置き換えることができる必要があります。

新しい文字列を生成しようとしましclang::Rewriter replaceTextたが、問題があります。ネストされたメッセージを古い位置に置き換えるため、セレクターの長さを変更すると機能しません。

だから、私は使用する必要があると仮定しましたclang::Rewriter ReplaceStmt(originalStatement, newStatement);

すべてのメッセージにアクセスするために使用RecursiveASTVisitorしています。これらのメッセージ オブジェクトをコピーして、セレクターを置き換えたいと考えています。

どうやってやるの?

使用してみましたが、非常に多くの引数があり、元のメッセージからパラメーターをObjCMessageExpr::Create取得する方法がわかりません。ASTContext &Context and ArrayRef<SourceLocation> SeLocsExpr *Receiver

clang ツール (clang ツール インターフェイス) を使用して、ネストされたメッセージのセレクターを置き換える適切な方法は何ですか?

アップデート:

ReplaceStmtWithStmtコールバックとを使用する必要がありASTMatchFinderますか?

アップデート:

次の関数を使用して、ファイル内のテキストを書き換えています。

そして、コード内のすべての messageExpr を新しいセレクター fe: に置き換えたい:

それがどうあるべきか:

ReqoursiveASTVisitor を使用しています:

新しいメッセージ expr 文字列を生成するメソッドを作成しました。

次のように、ネストされたメッセージを置き換えようとすると、問題が発生します。

結果は次のとおりです。

messageExpression には「古い」値がgetLocStart();あり、getLocEnd();どうすれば修正できますか?

0 投票する
0 に答える
2099 参照

llvm - ConstantDataArray と ConstantArray をいつ使用する必要がありますか?

LLVM 3.3 C++-API を使用しています。私のコードは、 を使用して配列を作成しConstantArray::get、再帰コードを使用して多次元配列を作成します (上記のように、最も内側のランクは最初に Constant*s のベクトルに変換され、次にそれを使用して次の最も内側のランクが初期化されます)。

ConstantDataArray::isElementTypeCompatible配列の要素の型が述語を満たす場合は、を使用して初期化する必要があると言って、これを最適化しようとしましたConstantDataArray::get

私が何を意味するかを示すためのより具体的な例を次に示します。

  1. 作成したい配列が C++ で次のように宣言されるとします。

    int x[2][3] = {{1,2,3},{4,5,6}};

  2. 最も内側のランク (int[3] 型) は単純な配列型であるため、2 つの CDA が作成されます。

  3. 次のランクは、2 つの int[3] の配列です。単純なタイプではないのでレギュラーConstantArrayを作成。引数はArrayRef<Constant*>、2 つの CDA を含む です。

ステップ 3 でConstantArray、イニシャライザが正確に正しい型を持っていないため、不平を言います。メッセージは次のとおりです。

要素の型が十分に単純な場合のConstantDataArray代用でしConstantArrayたが、間違っている可能性があります。それを理解する正しい方法は何ですか?

アップデート

これは私のコード (LLVM 以外) のバグのようです。 ConstantDataArrayは の透明な代用のようですConstantArray

問題を示すためにまとめたコードを次に示します。実際には、LLVM からの苦情なしで実行されます。

誰かが興味を持っている場合に備えて、アサーションは配列のエクステントを逆にしたことに由来します。 int[2][3]は、3 つの配列の 2 つの配列です。operator[]として配列型を構築するためにオーバーロードしていますi64[2][3]。ここで、は、およびオーバーロードi64を保持するオブジェクトです。問題は、これが 2 つの配列の 3 つの配列の配列を構築することです。IntegerType*operator[]

0 投票する
0 に答える
668 参照

c++ - テンプレート クラスのコンストラクタまたはデストラクタの CXXMethodDecl::getNameAsString

C++ヘッダーをC++スケルトンファイルに変換するためのlibtoolingを使用して、C++で小さなソフトウェアを作成しています。

非テンプレート クラスでは問題なく動作しますが、テンプレート クラス、特にテンプレート クラスのコンストラクタまたはデストラクタで問題が発生しています。

CXXMethodDecl::getNameAsString関数の名前を取得するために使用しています。次のような非テンプレート クラスの場合

前の関数は、(予想どおり)C~C.

ただし、クラスが次のようなテンプレートの場合:

結果として : C<TT, N>andが得られます~C<TT, N>が、これは私が期待していたものではありません。私にとって、関数の名前は、テンプレートであるクラスに依存するべきではありません。従来の関数は、期待どおりに動作します (どちらの場合も同じ名前です)。

何か不足していますか?これは正常な動作ですか、それともバグですか?