問題タブ [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 - LLVM バックエンド モジュール パス
グラフの順序ですべての MachineBasicBlock を通過するバックエンドでパスを作成し、3 つの連続する MachineBasicBlock ごとに何らかのプロパティが達成されているかどうかを確認したいと思います。
このパスの書き方について何かアイデアはありますか?
llvm - LLVM: 定数変数
const 修飾子または実行により変更されない変数を使用して、(バイトコード ファイルまたは IR ファイルから) すべての変数を取得するにはどうすればよいですか? さらに使用するためにリストを作成する必要があります。
c++ - Clang ツール: ObjCMessageExpr を書き直します
コード内のすべてのメッセージを書き直したいのですが、セレクターのみを置き換える必要がありますが、ネストされた式 fe を置き換えることができる必要があります。
新しい文字列を生成しようとしましclang::Rewriter replaceText
たが、問題があります。ネストされたメッセージを古い位置に置き換えるため、セレクターの長さを変更すると機能しません。
だから、私は使用する必要があると仮定しましたclang::Rewriter ReplaceStmt(originalStatement, newStatement);
すべてのメッセージにアクセスするために使用RecursiveASTVisitor
しています。これらのメッセージ オブジェクトをコピーして、セレクターを置き換えたいと考えています。
どうやってやるの?
使用してみましたが、非常に多くの引数があり、元のメッセージからパラメーターをObjCMessageExpr::Create
取得する方法がわかりません。ASTContext &Context
and ArrayRef<SourceLocation> SeLocs
Expr *Receiver
clang ツール (clang ツール インターフェイス) を使用して、ネストされたメッセージのセレクターを置き換える適切な方法は何ですか?
アップデート:
ReplaceStmtWithStmt
コールバックとを使用する必要がありASTMatchFinder
ますか?
アップデート:
次の関数を使用して、ファイル内のテキストを書き換えています。
そして、コード内のすべての messageExpr を新しいセレクター fe: に置き換えたい:
それがどうあるべきか:
ReqoursiveASTVisitor を使用しています:
新しいメッセージ expr 文字列を生成するメソッドを作成しました。
次のように、ネストされたメッセージを置き換えようとすると、問題が発生します。
結果は次のとおりです。
messageExpression には「古い」値がgetLocStart();
あり、getLocEnd();
どうすれば修正できますか?
llvm - ConstantDataArray と ConstantArray をいつ使用する必要がありますか?
LLVM 3.3 C++-API を使用しています。私のコードは、 を使用して配列を作成しConstantArray::get
、再帰コードを使用して多次元配列を作成します (上記のように、最も内側のランクは最初に Constant*s のベクトルに変換され、次にそれを使用して次の最も内側のランクが初期化されます)。
ConstantDataArray::isElementTypeCompatible
配列の要素の型が述語を満たす場合は、を使用して初期化する必要があると言って、これを最適化しようとしましたConstantDataArray::get
。
私が何を意味するかを示すためのより具体的な例を次に示します。
作成したい配列が C++ で次のように宣言されるとします。
int x[2][3] = {{1,2,3},{4,5,6}};
最も内側のランク (int[3] 型) は単純な配列型であるため、2 つの CDA が作成されます。
次のランクは、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[]
c++ - テンプレート クラスのコンストラクタまたはデストラクタの CXXMethodDecl::getNameAsString
C++ヘッダーをC++スケルトンファイルに変換するためのlibtoolingを使用して、C++で小さなソフトウェアを作成しています。
非テンプレート クラスでは問題なく動作しますが、テンプレート クラス、特にテンプレート クラスのコンストラクタまたはデストラクタで問題が発生しています。
CXXMethodDecl::getNameAsString
関数の名前を取得するために使用しています。次のような非テンプレート クラスの場合
前の関数は、(予想どおり)C
と~C
.
ただし、クラスが次のようなテンプレートの場合:
結果として : C<TT, N>
andが得られます~C<TT, N>
が、これは私が期待していたものではありません。私にとって、関数の名前は、テンプレートであるクラスに依存するべきではありません。従来の関数は、期待どおりに動作します (どちらの場合も同じ名前です)。
何か不足していますか?これは正常な動作ですか、それともバグですか?